??xml version="1.0" encoding="utf-8" standalone="yes"?>
J2EE又是一U框架和标准Q框架类?/span>API、库的概念,但是要超出它们?/span>
J2EE是一个虚的大的概念,J2EE标准主要有三U子技术标准:WEB技术?/span>EJB技术和JMSQ谈?/span>J2EE应该说最l要落实到这三个子概念上?/span>
q三U技术的每个技术在应用旉涉及两个部分Q容器部分和应用部分Q?/span>Web容器也是?/span>Jsp/Servlet容器Q你如果要开发一?/span>Web应用Q无论是~译或运行,都必要?/span>Jsp/Servlet库或API支持Q除?/span>JDK/J2SE以外Q?/span>
Web技术中除了Jsp/Servlet技术外Q还需?/span>JavaBeans?/span>Java Class实现一些功能或者包装携带数据,所?/span>Web技术最初简UCؓJsp/Servlet+JavaBeanspȝ?/span>
谈到JavaBeans技术,涉及到lg构g技术(componentQ,q是Java的核心基部分Q很多Y件设计概念(设计模式Q都是通过JavaBeans实现的?/span>
JavaBeans不属?/span>J2EE概念范畴中,如果一?/span>JavaBeans对象?/span>Web技术(也就?/span>Jsp/ServletQ调用,那么JavaBeansp行在J2EE?/span>Web容器中;如果它被EJB调用Q它p行在EJB容器中?/span>
EJBQ企?/span>JavaBeansQ是普?/span>JavaBeans的一U提升和规范Q因Z业信息系l开发中需要一个可伸羃的性能和事务、安全机Ӟq样能保证企业系l^滑发展,而不是发展到一U规模重新更换一套Y件系l?/span>
J2EE集群原理: http://www.jdon.com/jive/article.jsp?forum=121&thread=22282
xQ?/span>JavaBeanslg发展?/span>EJB后,q不是说以前的那U?/span>JavaBeans形式消׃Q这p然Ş成了两种JavaBeans技术:EJB?/span>POJOQ?/span>POJO完全不同?/span>EJB概念Q指的是普?/span>JavaBeansQ而且q个JavaBeans不依附某U框Ӟ或者干脆可以说Q这?/span>JavaBeans是你个应用程序单独开发创建的?/span>
J2EE应用pȝ开发工h很多Q如JBuilder?/span>Eclipse{,q些IDE首先?/span>Java开发工P也就是说Q它们首要基本功能是可以开发出JavaBeans?/span>Java classQ但是如果要开发出J2EEpȝQ就要落实到要么?/span>Web技术或EJB技术,那么有可能要一些专门模块功能,最重要的是Q因?/span>J2EEpȝ区分为容器和应用两个部分Q所以,在Q何开发工具中开?/span>J2EE都需要指?/span>J2EE容器?/span>
J2EE容器分ؓWEB容器?/span>EJB容器Q?/span>Tomcat/Resin?/span>Web容器Q?/span>JBoss?/span>EJB容器+Web容器{,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用E序可以在上面两U容器运行,而你开发的Web+EJB应用则只可以?/span>JBoss服务器上q行Q商业?/span>Websphere/Weblogic{和JBoss属于同一U性质?/span>
J2EE容器也称?/span>J2EE服务器,大部分时它们概念是一致的?/span>
如果你的J2EE应用pȝ的数据库q接是通过JNDI获得Q也是说是从容器中获得Q那么你?/span>J2EE应用pȝ基本与数据库无关Q如果你在你?/span>J2EE应用pȝ耦合了数据库JDBC驱动的配|,那么你的J2EE应用pȝ有数据库概念色彩,作ؓ一个成熟需要推q的J2EE应用pȝQ不推荐和具体数据库耦合Q当然这其中如何保证J2EE应用pȝq行性能又是体现你的设计水^了?/span>
衡量J2EE应用pȝ设计开发水q高低的标准是Q解耦性;你的应用pȝ各个功能是否能够dqQ是否不怺依赖Q也只有q样Q才能体现可l护性、可拓展性的软g设计目标?/span>
Z辑ֈq个目的Q诞生各U框架概念,J2EE框架标准一个系l划分ؓWEB?/span>EJB主要部分Q当然我们有时不是以q个具体技术区分,而是从设计上抽象现层、服务层和持久层Q这三个层次从一个高度将J2EE分离开来,实现解耦目的?/span>
因此Q我们实际编E中Q也要将自己的功能向q三个层ơ上靠,做到大方向清楚,泾渭分明Q但是没有技术上U束限制要做到这Ҏ很不Ҏ的,因此我们q是必须借助J2EE具体技术来实现Q这Ӟ你可以?/span>EJB规范实现服务层和持久层,Web技术实现表现层Q?/span>
EJBZ么能服务层?/span>Jsp/Servlet手中分离出来Q因为它?/span>JavaBeans~码有强制的U束Q现在有一U对JavaBeansq束,使用Ioc模式实现的(当然EJB 3.0也采取这U方式)Q在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeansU束QŞ成一个服务层Q这也是?/span>Jiveq样开源论坛设计原理之一?/span>
由此Q将服务层从表现层中分离出来目前有两U可选架构选择Q管理普?/span>JavaBeansQ?/span>POJOQ框?/span>(?/span>Spring?/span>JdonFramework)以及理EJB?/span>EJB框架Q因?/span>EJB不只是框Ӟq是标准Q而标准可以扩展发展,所以,q两U区别将来是可能模糊Q被U_同一个标准了?/span>
但是Q通常标准制定是ؓ某个目的服务的,总要牺牲一些换取另外一些,所以,q两U架构会长时间ƈ存?/span>
前面谈了服务层框Ӟ使用服务层框架可以将JavaBeans?/span>Jsp/Servlet中分d来,而用表现层框架则可以将Jsp中剩余的JavaBeans完全分离Q这部分JavaBeans主要负责昄相关Q一般是通过标签库(taglibQ实玎ͼ不同框架有不同自q标签库,Struts是应用比较广泛的一U表现层框架?/span>
q样Q表现层和服务层的分L通过两种框架辑ֈ目的Q剩余的是持久层框架了Q通过持久层的框架数据库存储从服务层中分d来是其目的,持久层框架有两种方向Q直接自q?/span>JDBC{?/span>SQL语句Q如iBatisQ;使用O/R Mapping技术实现的Hibernate?/span>JDO技术;当然q有EJB中的实体Bean技术?/span>
持久层框架目前呈现百花齐放,各有优缺点的现状Q所以正如表现层框架一P目前没有一个框架被指定为标准框Ӟ当然Q表现层框架现在又出来了一?/span>JSFQ它代表的页面组件概忉|一个新的发展方向,但是复杂的实现让人有些忘而却步?/span>
最后,你的J2EE应用pȝ如果采取上面提到的表现层、服务层和持久层的框架实玎ͼ基本可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系l了?/span>
q要注意的是: 开发出一个高质量?/span>J2EEpȝq需要正的业务需求理解,那么域徏模提供了一U比较切实可行的正确理解业务需求的ҎQ相兌l知识可?/span>UML角度l合理解?/span>
当然Q如果你惌计自q行业框架Q那么第一步从设计模式开始吧Q因计模式提供你一个实?/span>JavaBeans或类之间解耦参考实现方法,当你学会了系l基本单?/span>JavaBeans或类之间解耦时Q那么系l模块之间的解耦你可能掌握,q而你可以实现行业框架的提炼了,q又是另外一个发展方向了?/span>
以上理念可以ȝZ句话Q?/span>
J2EE开发三件宝: Domain ModelQ域建模Q?/span>patternsQ模式)?/span>frameworkQ框Ӟ?/span>
JAR 文g格式以流行的 ZIP 文g格式为基Q用于将许多个文件聚集ؓ一个文件。与 ZIP 文g不同的是QJAR 文g不仅用于压羃和发布,而且q用于部|和装库、组件和插gE序Qƈ可被像编译器?JVM q样的工L接用。在 JAR 中包含特D的文gQ如 manifests 和部|描q符Q用来指C工具如何处理特定的 JAR?/p>
一?JAR 文g可以用于Q?/p>
JAR 文g格式提供了许多优势和功能Q其中很多是传统的压~格式如 ZIP 或?TAR 所没有提供的。它们包括:
jar
工具(有关l节参阅 jar
工具 )在默认情况下压羃文g。未压羃?JAR 文g一般可以比压羃q的 JAR 文g更快地装载,因ؓ在装载过E中要解压羃文gQ但是未压羃的文件在|络上的下蝲旉可能更长?
大多?JAR 文g包含一?META-INF 目录Q它用于存储包和扩展的配|数据,如安全性和版本信息。Java 2 q_识别q解?META-INF 目录中的下述文g和目录,以便配置应用E序、扩展和c装载器Q?/p>
jar
工具的新选项 -i
生成Q它包含在应用程序或者扩展中定义的包的位|信息。它?JarIndex 实现的一部分Qƈq装蝲器用于加速类装蝲q程?Z?JAR 文g执行基本的Q务,要用作为Java Development Kit 的一部分提供?Java Archive Tool ( jar
工具)。用 jar
命o调用 jar
工具。表 1 昄了一些常见的应用Q?
功能 | 命o |
用一个单独的文g创徏一?JAR 文g | jar cf jar-file input-file... |
用一个目录创Z?JAR 文g | jar cf jar-file dir-name |
创徏一个未压羃?JAR 文g | jar cf0 jar-file dir-name |
更新一?JAR 文g | jar uf jar-file input-file... |
查看一?JAR 文g的内?/td> | jar tf jar-file |
提取一?JAR 文g的内?/td> | jar xf jar-file |
从一?JAR 文g中提取特定的文g | jar xf jar-file archived-file... |
q行一个打包ؓ可执?JAR 文g的应用程?/td> | java -jar app.jar |
![]() ![]() |
![]()
|
一?可执行的 jar 文g是一个自包含?Java 应用E序Q它存储在特别配|的JAR 文g中,可以?JVM 直接执行它而无需事先提取文g或者设|类路径。要q行存储在非可执行的 JAR 中的应用E序Q必d它加入到您的c\径中Qƈ用名字调用应用程序的ȝ。但是用可执行?JAR 文gQ我们可以不用提取它或者知道主要入口点可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用E序?
创徏一个可执行 JAR 很容易。首先将所有应用程序代码放C个目录中。假讑ֺ用程序中的主cL com.mycompany.myapp.Sample
。您要创Z个包含应用程序代码的 JAR 文gq标识出ȝ。ؓ此,在某个位|?不是在应用程序目录中)创徏一个名?manifest
的文Ӟq在其中加入以下一行:
Main-Class: com.mycompany.myapp.Sample |
然后Q像q样创徏 JAR 文gQ?/p>
jar cmf manifest ExecutableJar.jar application-dir |
所要做的就是这些了 -- 现在可以?java -jar
执行q个 JAR 文g ExecutableJar.jar?
一个可执行?JAR 必须通过 menifest 文g的头引用它所需要的所有其他从?JAR。如果用了 -jar
选项Q那么环境变?CLASSPATH 和在命o行中指定的所有类路径都被 JVM 所忽略?
既然我们已经自q应用E序打包C一个名?ExecutableJar.jar 的可执行 JAR 中了Q那么我们就可以用下面的命o直接从文件启动这个应用程序:
java -jar ExecutableJar.jar |
![]() ![]() |
![]()
|
密封 JAR 文g中的一个包意味着在这个包中定义的所有类都必d同一?JAR 文g中找到。这使包的作者可以增强打包类之间的版本一致性。密还提供了防止代码篡改的手段?/p>
要密包Q需要在 JAR ?manifest 文g中ؓ包添加一?Name
_然后加上gؓ“true”?Sealed
头。与可执行的 JAR 一P可以在创?JAR Ӟ通过指定一个具有适当头元素的 manifest 文g密封一?JARQ如下所C:
Name: com/samplePackage/ Sealed: true |
Name
头标识出包的相对路径名。它以一?#8220;/”l束以与文g名区别。在 Name
头后面第一个空行之前的所有头都作用于?Name
头中指定的文件或者包。在上述例子中,因ؓ Sealed
头出现在 Name
头后q且中间没有IQ所?Sealed
头将被解释ؓ只应用到?com/samplePackage
上?
如果试图从密包所在的 JAR 文g以外的其他地方装载密包中的一个类Q那?JVM 抛Z?SecurityException
?
扩展打包
扩展?Java q_增加了功能,?JAR 文g格式中已l加入了扩展机制。扩展机制?JAR 文g可以通过 manifest 文g中的 Class-Path
头指定所需要的其他 JAR 文g?
假设 extension1.jar ?extension2.jar 是同一个目录中的两?JAR 文gQextension1.jar ?manifest 文g包含以下_
Class-Path: extension2.jar |
q个头表?extension2.jar 中的cL extension1.jar 中的cȝ 扩展c?/em>。extension1.jar 中的cd以调?extension2.jar 中的c,q且不要?extension2.jar 处在c\径中?
在装载用扩展机制的 JAR ӞJVM 会高效而自动地在 Class-Path
头中引用?JAR d到类路径中。不q,扩展 JAR 路径被解释ؓ相对路径Q所以一般来_扩展 JAR 必须存储在引用它?JAR 所在的同一目录中?
例如Q假讄 ExtensionClient
引用了类 ExtensionDemo
,它捆l在一个名?ExtensionClient.jar ?JAR 文g中,而类 ExtensionDemo
则捆l在 ExtensionDemo.jar 中。ؓ了 ExtensionDemo.jar 可以成ؓ扩展Q必d ExtensionDemo.jar 列在 ExtensionClient.jar ?manifest ?Class-Path
头中Q如下所C:
Manifest-Version: 1.0 Class-Path: ExtensionDemo.jar |
在这?manifest ?Class-Path
头的值是没有指定路径?ExtensionDemo.jarQ表?ExtensionDemo.jar ?ExtensionClient JAR 文g处在同一目录中?
![]() ![]() |
![]()
|
JAR 文g可以?jarsigner
工具或者直接通过 java.security
API {。一个签名的 JAR 文g与原来的 JAR 文g完全相同Q只是更C它的 manifestQƈ?META-INF 目录中增加了两个文gQ一个签名文件和一个签名块文g?
JAR 文g是用一个存储在 Keystore 数据库中的证书签名的。存储在 keystore 中的证书有密码保护,必须?jarsigner
工具提供q个密码才能?JAR 文g{?
JAR 的每一位签名者都由在 JAR 文g?META-INF 目录中的一个具?.SF 扩展名的{文g表示。这个文件的格式cM?manifest 文g -- 一l?RFC-822 头。如下所C,它的l成包括一个主要部分,它包括了q名者提供的信息、但是不特别针对M特定?JAR 文g,q有一pd的单独的,q些也必须包含?menifest 文g中。在验证一个签名的 JAR Ӟ签名文件的摘要g?JAR 文g中的相应计的摘要D行比较?/p>
清单 1. { JAR 中的 Manifest ?signature 文g
Contents of signature file META-INF/MANIFEST.MF Manifest-Version: 1.0 Created-By: 1.3.0 (Sun Microsystems Inc.) Name: Sample.java SHA1-Digest: 3+DdYW8INICtyG8ZarHlFxX0W6g= Name: Sample.class SHA1-Digest: YJ5yQHBZBJ3SsTNcHJFqUkfWEmI= Contents of signature file META-INF/JAMES.SF Signature-Version: 1.0 SHA1-Digest-Manifest: HBstZOJBuuTJ6QMIdB90T8sjaOM= Created-By: 1.3.0 (Sun Microsystems Inc.) Name: Sample.java SHA1-Digest: qipMDrkurQcKwnyIlI3Jtrnia8Q= Name: Sample.class SHA1-Digest: pT2DYby8QXPcCzv2NwpLxd8p4G4= |
一个数字签名是.SF {文g的已{版本。数字签名文件是二进制文Ӟq且?.SF 文g有相同的文g名,但是扩展名不同。根据数字签名的cd -- RSA、DSA 或?PGP -- 以及用于{ JAR 的证书类型而有不同的扩展名?/p>
要签名一?JAR 文gQ必首先有一个私钥。私钥及其相关的公钥证书存储在名?keystores
的、有密码保护的数据库中。JDK 包含创徏和修?keystores 的工兗keystore 中的每一个密钥都可以用一个别名标识,它通常是拥有这个密钥的{者的名字?
所?keystore ?密钥和信ȝ证书?都是用唯一别名讉K的。别名是在用 keytool -genkey
命o生成密钥?公钥和私?q在 keystore 中添加项时指定的。之后的 keytool
命o必须使用同样的别名引用这一V?
例如Q要用别?#8220;james”生成一个新的公?U钥对ƈ公钥包装到自签名的证书中,要用下q命令:
keytool -genkey -alias james -keypass jamespass -validity 80 -keystore jamesKeyStore -storepass jamesKeyStorePass |
q个命o序列指定了一个初始密?#8220;jamespass”Q后l的命o在访?keystore “jamesKeyStore”中与别名“james”相关联的U钥Ӟ需要这个密码。如?keystore“jamesKeyStore”不存在,?keytool
会自动创建它?
jarsigner
工具使用 keystore 生成或者验?JAR 文g的数字签名?
假设像上qC子那样创Z keystore “jamesKeyStore”Qƈ且它包含一个别名ؓ“james”的密钥,可以用下面的命o{一?JAR 文gQ?/p>
jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass -keypass jamespass -signedjar SSample.jar Sample.jar james |
q个命o用密?#8220;jamesKeyStorePass”从名?#8220;jamesKeyStore”?keystore 中提出别名ؓ“james”、密码ؓ“jamespass”的密钥,q对 Sample.jar 文g{、创Z个签名的 JAR -- SSample.jar?/p>
jarsigner
工具q可以验证一个签名的 JAR 文gQ这U操作比{ JAR 文g要简单得多,只需执行以下命oQ?
jarsigner -verify SSample.jar |
如果{?JAR 文g没有被篡改过Q那?jarsigner
工具׃告诉?JAR 通过验证了。否则,它会抛出一?SecurityException
Q?表明哪些文g没有通过验证?
q可以用 java.util.jar
?java.security
API 以编E方式签?JAR(有关l节参阅 参考资?/font>)。也可以使用?Netscape Object Signing Tool q样的工兗?
![]() ![]() |
![]()
|
如果一个应用程序或?applet 捆绑到多?JAR 文g中,那么c装载器׃用一个简单的U性搜索算法搜索类路径中的每一个元素,qɾc装载器可能要下载ƈ打开许多?JAR 文gQ直到找到所要的cL者资源。如果类装蝲器试囑֯找一个不存在的资源,那么在应用程序或?applet 中的所?JAR 文g都会下蝲。对于大型的|络应用E序?appletQ这会导致启动缓慢、响应迟~ƈ费带宽?/p>
?JDK 1.3 以后QJAR 文g格式开始支持烦引以优化|络应用E序中类的搜索过E,特别?applet。JarIndex 机制攉?applet 或者应用程序中定义的所?JAR 文g的内容,q将q些信息存储到第一?JAR 文g中的索引文g中。下载了W一?JAR 文g后,applet c装载器用收集的内容信息高效地装?JAR 文g。这个目录信息存储在?JAR 文g?META-INF 目录中的一个名?INDEX.LIST 的简单文本文件中?/p>
创徏一?JarIndex
可以通过?jar
命o中指?-i
选项创徏一?JarIndex。假设我们的目录l构如下图所C:
您将使用下述命o?JarIndex_Main.jar、JarIndex_test.jar ?JarIndex_test1.jar 创徏一个烦引文Ӟ
jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar |
INDEX.LIST 文g的格式很单,包含每个已烦引的 JAR 文g中包含的包或者类的名字,如清?2 所C:
JarIndex-Version: 1.0 JarIndex_Main.jar sp JarIndex_test.jar Sample SampleDir/JarIndex_test1.jar org org/apache org/apache/xerces org/apache/xerces/framework org/apache/xerces/framework/xml4j |
![]() ![]() |
![]()
|
JAR 格式q远出了一U压~格式,它有许多可以改进效率、安全性和l织 Java 应用E序的功能。因些功能已l徏立在核心q_ -- 包括~译器和c装载器 -- 中了Q所以开发h员可以利?JAR 文g格式的能力简化和改进开发和部vq程?
![]() |
||
|
![]() |
Pagadala J. Suresh ?IBM Global Services India 的Y件工E师。他擅长的领域包?Java 技术、WebSphere Application Server ?WebSphere Studio Application Developer (WSAD)、Ariba Buyer。他参与?WebSphere ?IBM Redbook 目。可以通过 pjsuresh@in.ibm.com ?Pagadala 联系? |
![]() |
||
|
![]() |
Palaniyappan Thiagarajan 是位于印度班加罗的 IBM Global Services India 的Y件工E师。他是IBM 认证?IBM WebSphere Application Server V3.5 ?IBM DB2 UDB V7.1 Family Fundamentals 专家。可以通过 tpalaniy@in.ibm.com ?Palaniyappan 联系? |
对于q两U应用,通常W一考虑是性能要最优,性能是我们选择IT技术的主要依据之一?/p>
到最大化的性能Q对于JavapȝQ以前通常的作法是使用对象池,q样节约对象生成时的性能开销Q也是说系l启动时Q预先生成一定数目的对象实例在内存中Q需要用时Q从对象池中取出实例Q用完,归还对象池,对于有状态的应用Q可以用相x久化QpersistenceQ策略来保存状态?/p>
下一步,如何q行讉K对象池将是非帔R要,java的多U程技术ؓ我们提供了实现可能,U程的创建销毁也是可能非常耗时的,那么Q无疑象使用对象池一P我们必须使用U程池来实现多线Eƈ行计的最优化?/p>
使用U程池和对象池,每次客户端请求发生一ơ就从线E池中借用一个线E,处理完这个请求就线E返回线E池Q同P使用U程快速的讉K对象Q对象也是从对象池中借用Q用完就q回对象池?整个q样的架构设计在性能上是最优的?/p>
有了性能保证Q安全机制、事务机制、集?cluster)技术也是选择IT技术的主要依据?/p>
J2EE是q样一个实Cq多U考量的综合标准框架系l,在具体用中Q也许我们对所有这些考量的要求ƈ不都一样重视,比如Q如果纯_追求性能是第一Q可以忽视事务机Ӟ那么Q完整的J2EE技术也许就q不适合你?/p>
那么我们先看看J2EE是如何从性能上保证我们的应用pȝ以最快速度q行的,也就是说J2EE中必然应该有上述U程池和对象池的实现技术,servlet实际是基于线E池的更好的U程容器QEJB是基于对象池的更好的对象容器?/p>
看看Servler的架构图Q?/p>
当client1发生h时servlet容器会从U程池中分配一个线E给q个request.
再看看EJB的架构图Q?/p>
instance Pool作ؓ一个对象实例池Q维持着EJB实例Q当然这个对象池是用生命周期的,单的?EJB=对象?q程对象?/p>
但是QEJBq整合了相当的其它增强功能,如安?事务机制{,q些对于一般应用都是必需的,当然你还必须Ҏ你的需要来选择是否使用J2EEQ如果你的应用对安全 事务机制没有要求Q直接用线E池和对象池技术肯定获得最好的性能?/p>
所以,ҎServler和EJB的原理,我们已经可以规划我们的应用,什么可以放在servletQ或什么需要放在EJB中实玎ͼ
U程的本质决定了servlet只适合一些轻量的应用Q如分析单XML文档, 通过JDBC讉K数据源,使用JMS或JavaMail处理单的信息MessageQ或使用JTS/JTA处理单的事务机制Q注意这些用词都??的,一旦复杂了Q就要用EJB了?/p>
下面从客L和服务器端两个方面来具体考量q两个技术的使用Q这里的客户端不一定是指最l客LQ因为J2EE是多层结构,中间层可能在多个服务器上实现Q如果一个服务器上的服务是供另外一个服务器上的应用讉K的,那么后者我们也UCؓ客户端?/p>
Ҏ应用的复杂程度和要求不同Q分下列情况Q?/p>
1.在WEB层可以实现的一些应?/p>
如果你的pȝ没有很复杂的事务处理Q或讉K很多企业原有的资源,那么可以借助javabeanq样的一些Help性质的类来实C的应用,但是Q这LҎ不是最q净clean, 最有效efficient, 或最有扩展性的scalable?/p>
否则Q将所有核心计放|入EJB中?/p>
2.所有的复杂商务计算核心都在EJB中完?/p>
如果你的客户端和服务器端之间有防火墙Q那么目前能够无障碍通过防火墙的协议只有Http?Web Service也是Zhttp是q个道理)Q既然用http了,而Servlet是基于Http协议的,那么需要通过servlet来访问EJBQ这是我们最普遍的应用情c?/p>
但是Q如果你的客L和服务器端可以放|在一个网l内Q之间没有防火墙Q那么就不必使用ServletQ直接用Java调用RMI来访问EJBQ这h能是最好的Q这时的Servlet大概只有用于控制Jsp的页面的输出?MVC模式中的控制作用)?/p>
如果是非java客户端,可以通过CORBAlg来访问EJB?/p>
3.如果你的应用寚w度要求很高Q要求非常快Q对于事务处理等斚w几乎无要?/p>
直接使用J2SEQ加上线E池和对象池技术,会使你的javapȝ性能发挥极致。Jakarta.Apache.org有这两种技术的源码Q线E池可以从Servlet容器Tomcat的源码中发现?/p>