- 浏览: 662987 次
- 性别:
- 来自: 宇宙中的某个角落
文章分类
- 全部博客 (244)
- Java SE (57)
- EJB3.0 (7)
- Architecture (15)
- DDD (4)
- UML&GOF Patterns (17)
- scala (0)
- hadoop (1)
- Hibernate&JPA (8)
- webwork (2)
- Problems and Solution (3)
- search engine (Lucene) (4)
- .net C# (2)
- Web develop (9)
- OS(windows&linux) (2)
- Software Engineering (0)
- Resource shara (5)
- Javascript (1)
- apple (1)
- Data structure (11)
- English study (32)
- Assembly language (2)
- Feeling&emotion (5)
- Diary (23)
- Entertainment (17)
- 诗词赏析 (8)
- 道德经 (1)
- ios (5)
最新评论
-
zhuzf:
写的太好了
实例分析Java Class的文件结构 -
随便小屋:
写的太好了,Mark一下,楼主辛苦了!
实例分析Java Class的文件结构 -
lowkey2046:
引用 应用程序注册读就需事件和相关联的事件处理器应该是读就绪吧 ...
高性能IO设计的Reactor和Proactor模式 -
BigBird2012:
“JVM引入了分代收集的策略,其中对新生代采用"Ma ...
JVM内存模型以及垃圾收集策略解析 -
xuelian2010:
找到合适的人做正确的事情!!!
三月份辞职创业,北京第一家线下体验店成功开张,伙伴们加油!
在介绍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目录下,这样确保公用类是同一个类加载器加载。
发表评论
-
关于事务的一些学习笔记
2011-12-09 18:05 1738今天在整理资料的时候发现了之前学习事务的时候的一些学习笔记,顺 ... -
Web开发之Http Cahce
2011-07-17 21:53 3236在如今的 ... -
高性能IO设计的Reactor和Proactor模式
2010-10-12 23:22 26095在高性能的I/O设计中,有 ... -
构建可伸缩,高性能的互联网应用
2010-07-12 00:28 15647时间过得很快 ... -
DCI,领域模型,领域事件的一些想法
2010-03-25 22:37 2858内容见本人发的如下贴,欢迎讨论: http://www.jd ... -
CAP理论以及Eventually Consistent 解析
2010-01-17 14:16 4810今天看了Eventually Consistent,我结合自 ... -
Scaling with IMDG(通过内存数据网格进行伸缩)
2010-01-16 21:45 2140今天看了一篇文章觉 ... -
ebay,youku,facebook等架构文档,需要的兄弟可以看看!
2009-12-18 22:28 15166附件是本人收集和朋友给的一些架构文档,需要的兄弟可以下载看看。 ... -
可伸缩性最佳实践
2009-12-06 19:30 1670这一篇是可伸缩性的 ... -
系统为什么要分层?
2009-07-14 14:53 2585在日常的软件开发当 ... -
关于系统性能的思考
2009-04-24 14:24 3463在评价一个系统的时 ... -
J2EE资源管理常见策略总结
2008-12-07 20:40 1624公所周知J2EE底层是多线程的,无论何种资源管理的策略都 ... -
J2EE业务层模式:服务门面,应用服务,以及业务委托,服务定位器
2008-05-04 19:37 1938现在J2EE领域无论是表现层,业务层还是持久层,框架满天飞,虽 ... -
控制反转(IOC)的理解
2008-04-07 00:00 3642控制反转模式是当 ...
相关推荐
2. 新特性介绍:详细解析Java EE 7中新增的特性,例如对WebSocket的支持,为创建实时通信应用提供了可能。 3. 实践案例:通过一系列的实例,向读者展示如何应用Java EE 7的各种API进行企业级应用开发。 4. 应用...
JAVA EE,全称为Java Platform, Enterprise Edition,是Java平台企业版的简称,是Oracle公司推出的一种用于构建企业级分布式应用程序的框架。它为开发者提供了在服务器端开发应用程序的一系列标准和API,包括Web组件...
Java EE提供了强大的安全机制,包括用户身份验证、授权、加密和安全管理。你将学习如何设置角色、使用JAAS(Java Authentication and Authorization Service)和SSL/TLS进行安全通信。 九、实战项目 教程中的代码...
使用Java EE开发Web应用通常包括以下几个步骤:编写Java类(可能包括Servlet和EJB)、创建JSP页面、配置部署描述符(如web.xml)、打包成WAR文件,最后部署到Java EE容器上。 6. **其他组件**: 除了Servlet和JSP...
EAR(Enterprise Archive)文件是Java EE应用程序的标准归档格式,它包含了运行在应用程序服务器上的所有组件,如Java类、库、EJB、Web应用和其他资源。 在Eclipse中导出EAR包的过程包含以下几个关键步骤: 1. **...
Java EE 7(Java Platform, Enterprise Edition 7)是Java平台的一个版本,专注于为企业级应用程序开发提供服务。这个教程中的examples代码是学习Java EE 7技术的重要资源,它与官方教程紧密配合,帮助开发者深入...
Java EE(Java Platform, Enterprise Edition)是Oracle公司提供的一个企业级应用开发平台,它构建在Java SE(标准版)的基础上,为开发和部署分布式、多层的企业级应用程序提供了丰富的API和工具支持。Java EE旨在...
7. **WebSocket API**:Java EE 6引入了WebSocket API,提供了一种低延迟、全双工的通信机制,使得服务器和客户端能够实时交互数据,适合于在线游戏、聊天应用等场景。 8. **Contexts and Dependency Injection ...
Java EE(Java Platform, Enterprise Edition)是Oracle公司提供的一个企业级应用开发平台,它构建在Java SE基础之上,为开发和部署分布式、多层的企业级应用程序提供了丰富的API和工具。本教程旨在帮助读者全面理解...
总之,理解Java类加载机制对于优化Java应用性能至关重要,特别是对于Java EE环境下的大规模应用,合理配置和利用类加载器可以显著提升系统运行效率。同时,开发者应该关注Java版本的更新,充分利用新版本提供的性能...
Java EE API 提供了一系列的接口和类,用于开发企业级应用程序。这些 API 包括 Java EE 的核心 API、EJB API、Servlet API、JSP API 等。 事物管理 Java EE 提供了事物管理机制,用于确保多个资源的操作是一致的。...
8. **CDI (Contexts and Dependency Injection)**:学习CDI框架,它是Java EE中的依赖注入机制,简化了组件管理和依赖管理。 9. **JSR 356: WebSocket**:了解如何使用Java EE 6中的WebSocket API创建双向通信的...
Java EE 5 SDK是Java企业版(Enterprise Edition)的一个重要版本,它为开发分布式、多层的Web应用程序提供了全面的框架和支持。这个SDK包含了运行Java EE应用所需的所有组件,包括服务器、API文档、示例代码以及...
10. **容器管理的安全性**:Java EE容器提供了安全性的管理机制,如角色基的访问控制(RBAC)、认证和授权。第五章可能会涵盖如何配置安全性,定义用户角色,以及保护应用程序的资源。 通过深入研究这些知识点,...
Java EE,全称为Java Platform, Enterprise Edition,是Java平台针对企业级应用开发的版本,它提供了丰富的组件和服务,用于构建...这个资料包提供了很好的实践材料,帮助你从理论走向实践,提升你的Java EE开发技能。
### Java EE 6 最新版特点解析 #### 一、概述 Java开发平台企业版第六版(Java EE 6)是Sun Microsystems在2009年发布的重要版本,它旨在为开发者提供更灵活、高效的开发环境。Java EE 6 的目标是在保持与先前版本...
Java EE 7引入了JSON Processing (JSR 353),这是一个处理JSON数据的标准API,使开发人员能够更轻松地解析和生成JSON格式的数据,这对于构建RESTful Web服务特别有用。 #### 6. **CDI 1.2** Contexts and ...
8. **Transaction Management**:Java EE 5提供了事务管理机制,确保在分布式环境中数据的一致性和完整性。开发者可以通过声明式或编程式的方式来控制事务。 9. **Security**:Java EE 5包含一套全面的安全模型,...
1. **Servlet**: Servlet是Java EE中的核心组件,它是一个Java类,用于扩展服务器的功能。Servlet接口提供处理HTTP请求和响应的方法,是动态网页和Web服务的基础。在期末考试中,你可能需要了解Servlet的生命周期、...