- 浏览: 91066 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
zq_zero:
很好,不过如果改为用字符串数组来存储迭代结果和判断是否重 ...
Oracle自定义聚合函数实现字符串拼接 -
sea0108:
good。。
Oracle自定义聚合函数实现字符串拼接
在介绍EAR包的类加载器机制之前,我们需要了解一下JavaEE中都有哪些类型的包。
一 JavaEE 包的类型
在J2EE中,有ejb-jar包,war包,rar包,car包,ear包,其中经常会用到ejb-jar包,war包,以及ear包,下面分别说明。
1 EJB Jar 包 (.jar)
1.1 作用
Ejb jar是EJB模块,主要用于实现业逻辑。
1.2 描述符文件
EJB JAR包的部署描述符文件是ejb-jar.xml,(在EJB3.0中,也可以采用J2SE5.0引入的annoation注解,只不过ejb-jar.xml文件的内容会覆盖annoation)
1.3 内容
EJB JAR包中通常包括会话bean(包括stateless session bean,statefull session bean),消息驱动bean(MDB),以及Entity bean(在EJB3.0中,采用新的JPA规范来进行数据库访问,所以不存在entity bean,所有的entity 都是pojo)
2 War 包 (.war)
2.1 作用
War包主要用于打包web应用程序。
2.2 描述符文件
War包的描述符文件是web.xml,web.xml里可以配置相应的servlet,filter,listener等组件。
2.3 内容
War包里主要包含jsp,servlet,filter,html,图片等资源。
3 Ear 包 (.ear)
3.1 作用
EAR包主要用于对JavaEE应用程序进行打包,这样方便交付给客户来使用。
3.2 描述符文件
application.xml是ear包的描述符文件,application.xml中可以配置一个或者多个web模块,一个或者多个ejb模块,还可以配置资源适配器模块和应用客户端模块。
3.3 内容
EAR包中包含ejb jar,war包,资源适配器模块(.rar)以及应用客户端模块。
二 JavaEE ear包的类加载机制
1 委托模型
在说ear包的类加载体系之前,首先我们需要知道java中的类加载器的委托模型,java中的类加载器有一个继承体系,子加载器在加载类的时候首先委托父加载器来加载,以此类推,如果所有的父加载器都不能加载,那么子加载器再加载,此时如果子加载器没有发现类文件,则抛出java.lang.ClassNotFoundException.
但是在JavaEE应用中,java默认的委托模型将会被禁用,此时加载类的时候,首先是子加载器加载类,如果子加载器找不到相应的类文件,那么委托给父加载器来加载。
2 JavaEE类加载机制
2.1 java类加载器
Java类加载器体系如下图所示:
2.2 JavaEE类加载器
JavaEE中的类加载器是在上图的基础上实现的,如下图所示:
从上图中可以看出,application server类加载器是ejb类加载器的父加载器,ejb包的类加载器是war包的父加载器。
(注:上图只是大体上的类加载器体系,不同的application server有不同的实现,但是具体的原理是一样的)。
三:实战
上面是关于类加载器的一些理论知识,下面通过一个具体的实例来验证以上理论。(以下实验均采用jboss 4.2 AS)
1 准备环境
首先在eclipse建立三个工程,如图:
其中Demoejb工程包括两个文件,一个接口,一个实现类,Demoweb中包括一个DemoServlet类。其中我们编写一个测试类DemoUtil类。它里面包含一个静态变量,每次调用demo方法,都将count加一。具体的代码如下:
Demoear application.xml内容:
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd">
<display-name>Demoear</display-name>
<module id="myeclipse.1238995486296">
<web>
<web-uri>Demoweb.war</web-uri>
<context-root>/Demoweb</context-root>
</web>
</module>
<module id="myeclipse.1238994380625">
<ejb>Demoejb.jar</ejb>
</module>
</application>
DemoUtil 类:
复制代码
package com.yuquan.util;
/**
* @author yuquan
* @createTime Apr 11, 2009 3:47:45 PM
*/
public class DemoUtil {
private static int count ;
public static int demo() {
return count++;
}
}
Demoejb project
DemoService代码:
复制代码
package com.yuquan.service;
import javax.ejb.Remote;
/**
* @author yuquan
* @createTime Apr 6, 2009 1:08:41 PM
*/
@Remote
public interface DemoService {
public String execute();
public void print();
}
DemoServiceImpl代码:
复制代码
package com.yuquan.service;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import org.jboss.annotation.ejb.RemoteBinding;
import com.yuquan.util.DemoUtil;
/**
* @author yuquan
* @createTime Apr 6, 2009 1:10:24 PM
*/
@Stateless
@Remote(DemoService.class)
@RemoteBinding(jndiBinding="DemoServiceImpl")
public class DemoServiceImpl implements DemoService {
/* (non-Javadoc)
* @see com.xmu.eartest.DemoService#execute()
*/
@Override
public String execute() {
return String.valueOf(DemoUtil.demo());
}
@Override
public void print() {
ClassLoader loader = DemoUtil.class.getClassLoader();
while(loader !=null){
System.out.println("Demoservice print :::"+loader);
loader = loader.getParent();
}
}
}
Demoweb project
DemoServlet代码:
复制代码
package com.yuquan.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.yuquan.service.DemoService;
import com.yuquan.service.DemoService2;
import com.yuquan.util.DemoUtil;
/**
* @author yuquan
* @createTime Apr 6, 2009 1:25:44 PM
*/
public class DemoServlet extends HttpServlet {
private Context cxt;
@Override
public void init() throws ServletException {
super.init();
initContext();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
DemoService service = (DemoService) getRemoteServieWithJndiName("DemoServiceImpl");
System.out.println("service classloader is : "+service.getClass().getClassLoader());
System.out.println("DemoService classloader is : "+DemoService.class.getClassLoader());
System.out.println("After the web being invoked, the static value is : " + DemoUtil.demo());
System.out.println("After the ejb being invoked, the static value is : " + service.execute());
System.out.printf("Ejb print %s\n","---------------------");
service.print();
System.out.printf("web print %s\n","---------------------");
this.print();
PrintWriter out = resp.getWriter();
out.print("You have done the ear demo,pls see the console,and find the result! ^_^");
}
private Object getRemoteServieWithJndiName(String name) {
Object o = null;
try {
o = cxt.lookup(name);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return o;
}
private void initContext() {
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
environment.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");
environment.put(Context.PROVIDER_URL, "localhost:1099");
try {
cxt = new InitialContext(environment);
} catch (NamingException e) {
e.printStackTrace();
}
}
private void print(){
ClassLoader loader = DemoUtil.class.getClassLoader();
while(loader !=null){
System.out.println("DemoServlet print ::: "+loader);
loader = loader.getParent();
}
}
}
2 实验一
2.1 结构
Demoejb.jar:
com/yuquan/service/DemoService.class
com/yuquan/service/DemoServiceImpl.class
com/yuquan/util/DemoUtil.class
Demoweb.war包
META-INF/
WEB-INF/classes/com/yuquan/action/DemoServlet.class
WEB-INF/lib
WEB-INF/web.xml
Index.jsp
Demoear 包
此时DemoUtil.class打包到了Demoejb.jar包中,Demoweb.war包中没有DemoUtil类。
2.2 结果
复制代码
17:47:51,187 INFO [STDOUT] service classloader is : WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@d85409
17:47:51,187 INFO [STDOUT] DemoService classloader is : org.jboss.mx.loading.UnifiedClassLoader3@19a82ee{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34440Demoear.ear ,addedOrder=48}
17:47:51,187 INFO [STDOUT] After the web being invoked, the static value is : 0
17:47:51,203 INFO [STDOUT] After the ejb being invoked, the static value is : 1
17:47:51,203 INFO [STDOUT] Ejb print
17:47:51,203 INFO [STDOUT] ---------------------
17:47:51,203 INFO [STDOUT] Demoservice print :::org.jboss.mx.loading.UnifiedClassLoader3@19a82ee{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34440Demoear.ear ,addedOrder=48}
17:47:51,203 INFO [STDOUT] Demoservice print :::org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d
17:47:51,203 INFO [STDOUT] Demoservice print :::sun.misc.Launcher$AppClassLoader@18d107f
17:47:51,203 INFO [STDOUT] Demoservice print :::sun.misc.Launcher$ExtClassLoader@360be0
17:47:51,203 INFO [STDOUT] web print
17:47:51,203 INFO [STDOUT] ---------------------
17:47:51,203 INFO [STDOUT] DemoServlet print ::: org.jboss.mx.loading.UnifiedClassLoader3@19a82ee{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34440Demoear.ear ,addedOrder=48}
17:47:51,203 INFO [STDOUT] DemoServlet print ::: org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d
17:47:51,203 INFO [STDOUT] DemoServlet print ::: sun.misc.Launcher$AppClassLoader@18d107f
17:47:51,203 INFO [STDOUT] DemoServlet print ::: sun.misc.Launcher$ExtClassLoader@360be0
从运行的结果可以看出war包以及ejb包中用到得DemoUtil类都是由jboss的org.jboss.mx.loading.UnifiedClassLoader3来加载的。我们看到DemoUtil类的count静态域变为了1,这是因为DemoServlet用到得DemoUtil类,其实是由ejb 包加载器UnifiedClassLoader3加载的,所以ejb,web调用后,count值变为了1.这也就说明了UnifiedClassLoader3类加载器是war包类加载器(org.apache.catalina.loader.WebappClassLoader)的父加载器.
3实验二
3.1 结构
实验二中,我们将Demoejb.jar放到Demoweb.war包的lib目录下,其它的和实验一一样。
3.2 结果
复制代码
18:00:49,609 INFO [STDOUT] service classloader is : WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@7a8ba4
18:00:49,609 INFO [STDOUT] DemoService classloader is : WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@7a8ba4
18:00:49,609 INFO [STDOUT] After the web being invoked, the static value is : 0
18:00:49,625 INFO [STDOUT] After the ejb being invoked, the static value is : 0
18:00:49,625 INFO [STDOUT] Ejb print
18:00:49,625 INFO [STDOUT] ---------------------
18:00:49,625 INFO [STDOUT] Demoservice print :::org.jboss.mx.loading.UnifiedClassLoader3@1d2052b{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34441Demoear.ear ,addedOrder=49}
18:00:49,625 INFO [STDOUT] Demoservice print :::org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d
18:00:49,625 INFO [STDOUT] Demoservice print :::sun.misc.Launcher$AppClassLoader@18d107f
18:00:49,656 INFO [STDOUT] Demoservice print :::sun.misc.Launcher$ExtClassLoader@360be0
18:00:49,656 INFO [STDOUT] web print
18:00:49,656 INFO [STDOUT] ---------------------
18:00:49,656 INFO [STDOUT] DemoServlet print ::: WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@7a8ba4
18:00:49,656 INFO [STDOUT] DemoServlet print ::: java.net.FactoryURLClassLoader@7a8ba4
18:00:49,656 INFO [STDOUT] DemoServlet print ::: org.jboss.mx.loading.UnifiedClassLoader3@1d2052b{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34441Demoear.ear ,addedOrder=49}
18:00:49,656 INFO [STDOUT] DemoServlet print ::: org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d
18:00:49,656 INFO [STDOUT] DemoServlet print ::: sun.misc.Launcher$AppClassLoader@18d107f
18:00:49,656 INFO [STDOUT] DemoServlet print ::: sun.misc.Launcher$ExtClassLoader@360be0
从运行的结构可以看出,count的值在ejb,web调用后的值都是0,此时DemoUtil在war包和ejb包中的类加载器是不一样的,这也就说明了在JavaEE应用中,web包的类加载器首先加载,如果没有找到相应的class文件,那么再委托给父加载器(ejb包的类加载器)来加载。并且此时注意到Demoservice也是由web类加载器加载的,这是因为此时Demoejb.jar被放在了Demoweb.war包的lib目录,war包类加载器可以找到此类,所以由war包类加载器来加载此类。但是这个时候要注意ejb包中的DemoService类还是由Ejb包的类加载器来加载的,因为此时web类加载器是子加载器,做为父加载器的ejb类加载器是看不到子加载器加载的类的。
从这个例子,我们得出两个个结论:
1)war包类加载器在加载类的时候,首先在自己对应的路劲中查找类(WEB-INF/class,WEB-INF/lib,以及lib包 jar文件META-INF/MANIFEST.MF classpath指定的jar),如果找不到才会委托给父加载器(ejb包类加载器)加载,以此类推,如果所有的父加载器都不能加载,那么就抛出java.lang.ClassNotFoundException.
2)父加载器看不到子加载器加载的类,本例中war包中用到的类加载器加载了DemoService,但是ejb包的类加载器也加载了相应的DemoService类。
4 实验三:
4.1 结构
实验三中,我们将Demoejb.jar包中的DemoUtil.类删除,将其打包到独立的util.jar包中,然后将util.jar包放到Demoweb.war包的lib目录下面,并且同时也需要把util.jar包放到Demoear.ear包的lib目录下。
4.2 结果
复制代码
18:07:51,343 INFO [STDOUT] service classloader is : WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@14322ba
18:07:51,343 INFO [STDOUT] DemoService classloader is : org.jboss.mx.loading.UnifiedClassLoader3@133650d{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34442Demoear.ear ,addedOrder=50}
18:07:51,343 INFO [STDOUT] After the web being invoked, the static value is : 0
18:07:51,343 INFO [STDOUT] After the ejb being invoked, the static value is : 0
18:07:51,343 INFO [STDOUT] Ejb print
18:07:51,343 INFO [STDOUT] ---------------------
18:07:51,343 INFO [STDOUT] Demoservice print :::org.jboss.mx.loading.UnifiedClassLoader3@133650d{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34442Demoear.ear ,addedOrder=50}
18:07:51,343 INFO [STDOUT] Demoservice print :::org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d
18:07:51,343 INFO [STDOUT] Demoservice print :::sun.misc.Launcher$AppClassLoader@18d107f
18:07:51,343 INFO [STDOUT] Demoservice print :::sun.misc.Launcher$ExtClassLoader@360be0
18:07:51,343 INFO [STDOUT] web print
18:07:51,343 INFO [STDOUT] ---------------------
18:07:51,343 INFO [STDOUT] DemoServlet print ::: WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@14322ba
18:07:51,343 INFO [STDOUT] DemoServlet print ::: java.net.FactoryURLClassLoader@14322ba
18:07:51,343 INFO [STDOUT] DemoServlet print ::: org.jboss.mx.loading.UnifiedClassLoader3@133650d{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34442Demoear.ear ,addedOrder=50}
18:07:51,343 INFO [STDOUT] DemoServlet print ::: org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d
18:07:51,343 INFO [STDOUT] DemoServlet print ::: sun.misc.Launcher$AppClassLoader@18d107f
18:07:51,343 INFO [STDOUT] DemoServlet print ::: sun.misc.Launcher$ExtClassLoader@360be0
从运行结果来看,ejb包中所用的DemoUtil类是有jboss的UnifiedClassLoader3加载的,而DemoServlet中用到得DemoUtil类是由WebAppClassLoader加载的。
注意:如果此时在Demoear.ear的lib包中不放置util.jar包,那么EJB中将无法加载到此类,这也说明了父加载器是看不到子加载器加载的类的。
四:结论
1 子加载器可以看到父加载器加载的类,但是父加载器看不到子加载器加载的类,比如实验一中,DemoServlet中用到得DemoService类就是由org.jboss.mx.loading.UnifiedClassLoader加载的。
2 同级的类加载是不能看到对方加载的类的。假如ear包中包括了很多个war包,这些war包中的类是不能互相引用的。
3 java的默认委托模型在JavaEE 应用的类加载器模型中不再适用。此时首先有war包的类加载加载类,如果war包类加载器不能加载,然后才由ejb包的类加载来加载。
4 jboss4.2 AS中,类加载器的体系如下:
org.apache.catalina.loader.WebappClassLoader
java.net.FactoryURLClassLoader
org.jboss.mx.loading.UnifiedClassLoader3
org.jboss.system.server.NoAnnotationURLClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
以上的classLoader中,下面的类加载器是上面的父加载器.
需要注意一下单例设计模式。如果我们把一个类设计为单例的,要确保web模块和ejb模块中用到得单例类是同一个类加载器加载的,否则的话web模块和ejb模块的实例是不一样的。
最后,一般我们在打ear包的时候,会把web模块和ejb模块都用到得类放到ear包的lib目录下,这样确保公用类是同一个类加载器加载。
上面漏掉了两点结论:(因为编辑,帖子格式会变乱,就补充在这里)
1 Ear包中的所有Ejb 模块都共享同一个classloader.
2 Ear包中的每个web模块都会有对应的一个classloader.
所以ejb模块中的类对web模块是可见的,反之则不成立,同时不同的web模块之间看不到对方classloader已经加载的类。
以上基于jboss app server分析的
不是绝对的JEE应用服务器都是用parent last模式,WebSphere默认的还是parent first模式,可以根据自己的需要改成Parent last模式。
转载至:
http://diqiuche.blog.163.com/blog/static/36608509200971110235981/
发表评论
-
IBM Websphere培训——问题诊断方法
2012-06-03 10:56 16641. 安装 IBM Support Assistant(I ... -
was 缓存位置
2010-11-11 09:05 2028在websphere中修改了jsp后,有时会出现修改的jsp没 ... -
WebSphere Application Server 常见问题及解答(五)
2009-12-25 13:52 1473集群 1. 规划集群方案 ... -
WebSphere Application Server 常见问题及解答(四)
2009-12-25 13:47 2236开发与部署 1. WAS 产品 ... -
WebSphere Application Server 常见问题及解答(三)
2009-12-25 13:40 2317安装与配置 1. 在 AIX 平 ... -
WebSphere Application Server 常见问题及解答(二)
2009-12-25 13:38 1188引用http://blog.sina.com.cn/s ... -
WebSphere Application Server 常见问题及解答(一)
2009-12-25 13:28 3120WAS 简介 IBM WebSphere Applicati ...
相关推荐
5. 如果是在服务器环境中,尝试重启服务器,因为有时类加载器可能因缓存问题而未能加载新的类。 总结,"java.lang.NoClassDefFoundError"异常通常是由于缺少必要的库或类路径配置不当导致的。对于JavaEE应用,特别...
这个"javaee源码包"包含了 javax 相关的源代码,这对于我们深入理解和开发JavaEE应用来说极其宝贵。 javax 是Java的一个顶级包,它包含了Java标准扩展库,涵盖了JavaEE中的各种组件和服务。这些源码涵盖了广泛的...
JavaEE中文语言包是专为Java企业版(Java Enterprise Edition,简称JavaEE)开发者设计的,旨在帮助那些希望在Eclipse集成开发环境中使用中文界面的用户。Eclipse是一款广泛使用的开源IDE,支持多种编程语言,其中...
Struts通过Action和ActionForm类处理用户请求,并通过配置文件定义控制器逻辑,使得代码结构清晰,易于维护。 3. **Spring框架**: Spring是JavaEE开发的核心框架,它不仅支持MVC模式,还提供了全面的依赖注入(DI)...
本文将深入解析如何使用WebLogic进行EAR(Enterprise Archive)包的部署步骤,结合图解,让读者能够清晰地理解每一个环节。 1. **什么是EAR包** EAR文件是JavaEE应用的标准打包格式,它包含了多个组件,如EJB...
javaEE web 应用JAR包javaEE web 应用JAR包javaEE web 应用JAR包javaEE web 应用JAR包
myeclipse9一下的版本并没有集成javaee6的开发包,用户需要另外下载才能使用,很多人不愿意安装臃肿的myeclipse10,现在将myeclipse10中默认包含的javaee6的开发包打包发布,只要解压将里面的jar包导入到项目(或者...
为了方便开发,你可以直接下载提供的"javaeejar包",将其添加到项目的类路径(ClassPath)中,这样就可以顺利地使用JavaEE的各种服务和API,进行Web应用的开发和部署了。 总结一下,JavaEE.jar是JavaEE平台的核心...
`javax.servlet.jsp`和`javax.servlet.jsp.tagext`等包提供了JSP页面的解析和执行机制,以及自定义标签库的支持。 3. **JSTL (JavaServer Pages Standard Tag Library)**:JSTL是一套标准的标签库,简化了JSP页面中...
JavaEE是Java企业版(Enterprise Edition)的简称,是一个用于开发和部署企业级应用程序的平台。这个"javaee.jar"文件很可能包含了JavaEE规范中定义的各种API,使得开发者能够构建分布式、多层的企业系统,例如Web...
这个压缩包包含了四个关键的jar包,它们在JavaEE 5的环境中起着至关重要的作用。 1. **javaee.jar**:这是JavaEE 5的核心API库,包含了诸如Servlet、JSP、EJB、JMS、JTA等核心JavaEE组件的接口和类。开发者可以使用...
6. **并发编程**:线程池,原子性操作,Concurrent包下的工具类。 7. **数据结构与算法**:数组、链表、树、图,排序算法,查找算法等。 8. **框架与库**:Maven或Gradle构建工具,Log4j日志框架,JUnit测试框架。...
这个"JavaEE5的资源包"很可能是包含了JavaEE5规范中相关组件的源代码,允许开发者深入理解其内部工作机制,这对于学习和调试是非常有价值的。 首先,JavaEE5主要增强了以下几个方面: 1. **Annotations(注解)**...
在JavaEE开发中,模板类是一种常见的设计模式,它用于封装重复性的代码,提高代码的可复用性和可维护性。对于初学者来说,理解并掌握模板类是至关重要的,因为这将极大地提升你的编程效率。下面我们将深入探讨JavaEE...
在这个"JavaEE 学习 所有jar包"的压缩文件中,包含了一系列JavaWeb开发过程中常用的库,这些库可以帮助开发者实现各种功能,如文件上传、邮件发送、JSON数据处理、数据库连接池管理以及MySQL数据库连接等。...
以上只是部分JavaEE框架中常见的jar包,实际开发中可能还需要其他的依赖,如Spring框架、MyBatis框架等的jar包。正确地引入和配置这些jar包,是成功搭建和运行JavaEE应用的基础。开发者需要根据项目需求,选择合适的...
在这个"JavaEE各种jar包"中,包含了Java三大框架以及Spring MVC的重要库文件。 1. **Java三大框架**: - **Struts**:这是一个MVC(Model-View-Controller)框架,主要用于处理HTTP请求,管理业务逻辑,以及渲染...
【JAVAEE架包详解】 JAVAEE(Java Platform, Enterprise Edition),是Java技术在企业级应用开发中的核心框架,它提供了一系列服务和APIs,用于构建分布式、多层的企业级应用程序。JAVAEE架包包含了用于开发Web应用...
在JavaEE环境中,监听器是实现特定功能的特殊类,它们可以监听和响应应用程序中的特定事件,例如用户的登录、注销、session创建或销毁等。这些事件驱动的机制使得开发者能够更灵活地控制应用程序的行为,而无需直接...
JavaEE(Java Platform, Enterprise Edition)是Java平台上用于构建企业级应用的一套标准规范和API。这个"javaee_api.zip"文件包含的是JavaEE的官方英文版API文档,以ZIP格式压缩,对于开发者来说,这是一个非常重要...