??xml version="1.0" encoding="utf-8" standalone="yes"?> J2EE serverQJ2EE服务器) J2EE产品的运行时服务部分。一个J2EE服务器提供EJB容器QEJB ContainerQ和Web容器QWeb ContainerQ? EJB容器,Web容器,Application client containerQ应用程序客L容器Q?/FONT> ,Applet containerQApplet容器Q?/FONT>
j2ee是一钟基于java的开发标?一般由多层l构使其企业lg能够灉|部v.j2ee应用E序q件构? J2EE规范定义了下面一些组?
1) lgQ一个应用的Y件单?BR> J2SE拥有JavaBeansQJ2EE拥有EJBQEnterprise JavaBeansQ?BR> 2) pȝU实体容?BR> 提供Q运行支持、生命周期管理、安全、部|Ӏ线E?BR> 3) applet和客户应用程?BR> 客户端组件执行自qJava虚拟机(JVMQ?BR> 4) WEBlgQ?BR> 软g实体Q响应请?BR> 通常为基于WEB的应用提供用h?BR> J2EE的两U组Ӟ◎Servlets ◎JavaServer Pages(JSP)
?j2ee容器
容器QContainerQ是lg和支持组件功能的底层特定q_Q如数据库)之间的接口。在q行Weblg、企业Bean或者J2EE应用E序客户端之前,你必d它们装配C个J2EE应用E序中,q|它们到容器中?BR>
EJB的上层的分布式应用程序是Z对象lg模型的,低层的事务服务用了API技术。EJB技术简化了用JAVA语言~写的企业应用系l的开发,配置Q和执行。EJB的体pȝ构的规范由Sun Microsystems公司制定。Inprise的EJB容器是基?.1版的规范?
EJB技术定义了一l可重用的组ӞEnterprise Beans。你可以利用q些lgQ象搭积木一L建立你的分布式应用程序。当你把代码写好之后Q这些组件就被组合到特定的文件中厅R每个文件有一个或多个Enterprise BeansQ在加上一些配|参数。最后,q些Enterprise Beans被配|到一个装了EJB容器的^C。客戯够通过q些Beans的home接口Q定位到某个BeansQƈ产生q个beans的一个实例。这P客户p够调用Beans的应用方法和q程接口?
EJB服务器作为容器和低层q_的桥梁管理着EJB容器和函数。它向EJB容器提供了访问系l服务的能力。例如:数据库的理和事务的理Q或者对于其它的Enterprise的应用服务器?
所有的EJB 实例都运行在EJB容器中。容器提供了pȝU的服务Q控制了EJB的生命周期。因为容器掌握了l大多数pȝU的issues(呵呵Q不知道怎么译)。Enterprise Beans 的开发者不需要应用逻辑考虑q来。通常来说QEJB容器掌握了以下的pȝUissues.
1、Security--配置描述器(The Deployment descriptorQ定义了客户能够讉K的不同的应用函数。容器通过只允许授权的客户讉Kq些函数来达到这个效果?
2、Remote Connectivity--容器E链接管理着低层的通信issuesQ而且对Enterprise Beas的开发者和客户都隐藏了通信issues.Enterprise Beans的开发者在~写应用Ҏ的时候,p是在条用本地的^CL。客户也不清楚他们调用的Ҏ可能是在q程被处理的?
3、Life Cycle managment--客户单的创徏一个Enterprise beans的实例,q常取消一个实例。而容器管理着Enterprise Beans的实例,使Enterprise Beans实现最大的效能和内存利用率。容器能够这hȀzdLEnterprise BeansQ保持众多客户共享的实例池。等{?
4、Trasction management—配|描q器定义了Enterprise beans 的事务处理的需求。容器管理着那些理分布式事务处理的复杂的issues。这些事务可能要在不同的q_之间更新数据库。容器ɘq些事务之间互相独立Q互不干扰。保证所有的更新数据库都是成功发生的Q否者,回滚到事务处理之前的状态?
Enterprise Beans lgQ?
Enterprise Beans 是基于分布式事务处理的企业应用E序的组件。所有的Enterprise beans都有如下的特点:
Enterprise beans包含了处理企业数据的应用逻辑。Enterprise beans provider定义了Enterprise beans的客L面(Enterprise beans 的远E界面)。这L界面不受容器和服务器的媄响。于是,当一个Enterprise beans被集合到一个应用程序中LQ不用更改代码和重新~译。Enterprise beans能够被定制各U系l的服务,例如安全和事务处理的Ҏ,都不是属于Enterprise beans class的。而是由配|和l装应用E序的工h实现。有两种cd的Enterprise beans: Session beans ?entity beans.(q有一Umessage driven bean,q里暂时不加讨论)
Session beans:
Session beans 是一U作为单个的client执行的对象。作为对q程的Q务请求的相应Q容器生一个Session beans 的实例。一个Session beans有一个client.从某U程度上来说Q一个Session bean 对于服务器来说就代表了它的那个client.Session beans 也能用于事务Q它能够更新׃n的数据,但它不直接描l这些共享的数据?
Session beans 的生命周期是相对较短的。典型的是,只有当client保持会话的时候,Session beans 才是zȝ的。一旦client退ZQSession beans ׃再与client相联pM。Session beans被看成是瞬时的,因ؓ如果容器崩溃了,那么client必须重新建立一个新的Session对象来l会话?
一个Session bean典型的声明了与client的互操作或者会话。也是_Session bean了在客户会话期间Q通过Ҏ的调用,掌握Client的信息。一个具有状态的Session beanUCؓ有状态的Session bean.当clientl止与Session beans互操作的时?会话l止了,而且Qbean 也不再拥有状态倹{?
一个Session bean也可能是一个无状态的 session bean.无状态的Session beansq不掌握它的客户的信息或者状态。Client能够调用beans的方法来完成一些操作。但是,beans只是在方法调用的时候才知道client的参数变量。当Ҏ调用完成以后Qbeansq不l箋保持q些参数变量。这P所有的无状态的session beans的实例都是相同的Q除非它正在Ҏ调用期间。这P无状态的Session beansp够支持多个client.容器能够声明一个无状态的Session beans.能够Q何Session beans指定lQ何client.
Entity Beans:
Entity BeansҎ据库中的数据提供了一U对象的视图。例如:一个Entity bean能够模拟数据库表中一行相关的数据。多个client能够׃n讉K同一个Entity bean.多个client也能够同时的讉K同一个Entity bean.Entity beans通过事务的上下文来访问或更新下层的数据。这P数据的完整性就能够被保证?
Entity Beans能存zȝҎ长的旉Qƈ且状态是持箋的。只要数据库中的数据存在QEntity beans׃直存zR而不是按照应用程序或者服务进E来说的。即使EJB容器崩溃了,Entity beans也是存活的。Entity Beans生命周期能够被容器或?Beans自己理。如果由容器控制着保证 Entity beans持箋的issus。如果由Beans自己理Q就必须写Entity beans的代码,包括讉K数据库的调用?
Entity Beans是由主键Qprimary key 一U唯一的对象标识符Q标识的。通常Q主键与标识数据库中的一块数据,例如一个表中的一行,的主键是相同的。主键是client能够定位特定的数据块?
EJB roles:
EJB体系l构通过把编E的q程分ؓ6个不同的角色而开发复杂的的应用系l变的简单?个不同的角色Q每个都有特定的d?个角色包括下层的服务Q应用程序的开发,配置和操作说明(issuesQ?
EJB体系l构能够化应用程序开发h员的工作。在EJB体系l构中,容器和代理服务承担了很多在其他环境中又程序设计h员承担的工作。这L代理提供了很多原来需要程序设计h员编写代码的pȝU的服务?
Infrastructure roles;Q下层构造角Ԍ
EJB Server Providor服务提供者是典型的提供分布式低层服务的代理。EJB服务提供者提供了一个分布式应用E序开发者需要的q_和设施。也提供了分布式E序的运行时环境?
EJB Container Providor 容器提供者是分布式系l,事务处理Q安全方面的专家容器提供者提供了一个EJB的配|工P和这些配|实例的q行时支持?
一个容器对一个或多个EJB来说Q是一个运行时pȝ。它Enterprise Beans和EJB服务Q包括事务服务,安全服务Q分布式|络理{胶合在一赗容器是既是桓龆ㄖ频拇牒投蕴囟ǖ?Enterprise beans产生详细代码的工兗容器也提供了一个配|Enterprisebeans的工具和理监视应用E序的方法?
]]>
在早期的c/s应用模式?客户端程序负责数据访?实现业务逻辑,用合适的样式昄l果,弹出预先讑֮的用L?接收用户输入{?c/sl构通常在第一ơ部|的时候比较容?但难于升U和改进,而且l常Z某种专有的协?通常是某U数据库协议,它得重用业务逻辑和界面逻辑非常困难.更重要的是在web时代,二层化应用通常不能体现出很好的伸羃?因此很难适应internet的要?
Sun设计J2EE的部分v因就是想解决二层化结构的~陷。于是,J2EE定义了一套标准来化N层企业应用的开发。它定义了一套标准化的组Ӟqؓq些lg提供了完整的服务。J2EEq自动ؓ应用E序处理了很多实现细节,如安全、多U程{?BR> 用J2EE开发N层应用包括将二层化结构中的不同层面切分成许多层。一个N层化应用A能够Z下的每种服务提供一个分开的层Q?BR> 昄Q在一个典型的Web应用中,客户端机器上q行的浏览器负责实现用户界面?BR> 动态生成显C? 管览器可以完成某些动态内ҎC,但ؓ了兼容不同的览器,q些动态生成工作应该放在Web服务器端q行Q用JSP、ServletsQ或者XMLQ可扩展标记语言Q和Q可扩展样式表语aQ?BR> 业务逻辑Q业务逻辑适合用Session EJBsQ后面将介绍Q来实现?BR> 数据讉KQ数据访问适合用Entity EJBsQ后面将介绍Q和JDBC来实现?BR> 后台pȝ集成: 同后台系l的集成可能需要用到许多不同的技术,至于何种最佳需要根据后台系l的特征而定?BR> 您可能开始诧异:Z么有q么多的层?事实上,多层方式可以使企业应用h很强的~性,它允许每层专注于特定的角艌Ӏ例如,让Web服务器负责提供页面,应用服务器处理应用逻辑Q而数据库服务器提供数据库服务?BR> ׃J2EE建立在Java2q_标准版(J2SEQ的基础上,所以具备了J2SE的所有优点和功能。包括“编写一ơ,到处可用”的可移植性、通过JDBC讉K数据库、同原有企业资源q行交互的CORBA技术,以及一个经q验证的安全模型。在q些基础上,J2EE又增加了对EJBQ企业JavalgQ、Java servlets、Java服务器页面(JSPsQ和XML技术的支持?BR>
分布式结构与WebLogic应用服务?BR>
J2EE提供了一个框?-一套标准API--用于开发分布式l构的应用,q个框架的实际实现留l了W三方厂商。部分厂商只是专注于整个J2EE架构中的的特定组Ӟ例如Apache的Tomcat提供了对JSP和servlets的支持,BEApȝ公司则通过其WebLogic应用服务器品ؓ整个J2EE规范提供了一个较为完整的实现?BR> WebLogic服务器已使徏立和部v伸羃性较好的分布式应用的q程大ؓ化。WebLogic和J2EE代你处理了大量常规的~程dQ包括提供事务服务、安全领域、可靠的消息、名字和目录服务、数据库讉K和连接池、线E池、负载^衡和定w处理{?BR> 通过以一U标准、易用的方式提供q些公共服务Q象WebLogic服务器这L产品造就了具有更好~性和可维护性的应用pȝQ其ؓ大量的用h供了增长的可用性?BR>
J2EE技?BR>
在接下来的部分里Q我们将描述构成J2EE的各U技术,q且了解WebLogic服务器是如何在一个分布式应用中对它们q行支持的。最常用的J2EE技术应该是JDBC、JNDI、EJB、JSP和servletsQ对q些我们作更仔l的考察?BR> Java Database Connectivity (JDBC)
JDBC API以一U统一的方式来对各U各L数据库进行存取。和ODBC一PJDBC为开发h员隐藏了不同数据库的不同Ҏ。另外,׃JDBC建立在Java的基?因此q提供了数据库存取的q_独立性?BR> JDBC定义?U不同的驱动E序Q现分述如下Q?BR> cd 1: JDBC-ODBC Bridge
在JDBC出现的初期,JDBC-ODBC桥显然是非常有实用意义的Q通过JDBC-ODBC桥,开发h员可以用JDBC来存取ODBC数据源。不的是,他需要在客户端安装ODBC驱动E序Q换句话_必须安装Microsoft Windows的某个版本。用这一cd你需要牺牲JDBC的^台独立性。另外,ODBC驱动E序q需要具有客L的控制权限?BR> cd 2: JDBC-native driver bridge
JDBC本地驱动E序桥提供了一UJDBC接口Q它建立在本地数据库驱动E序的顶层,而不需要用ODBC?JDBC驱动E序对数据库的API从标准的JDBC调用转换为本地调用。用此cd需要牺牲JDBC的^台独立性,q要求在客户端安装一些本C码?BR> cd 3: JDBC-network bridge
JDBC|络桥驱动程序不再需要客L数据库驱动程序。它使用|络上的中间服务器来存取数据库。这U应用得以下技术的实现有了可能Q这些技术包括负载均衡、连接缓冲池和数据缓存等。由于第3U类型往往只需要相Ҏ的下蝲旉Q具有^台独立性,而且不需要在客户端安装ƈ取得控制权,所以很适合于Internet上的应用?BR> cd 4: Pure Java driver
W?U类型通过使用一个纯Java数据库驱动程序来执行数据库的直接讉K。此cd实际上在客户端实C2层结构。要在N-层结构中应用Q一个更好的做法是编写一个EJBQ让它包含存取代码ƈ提供一个对客户端具有数据库独立性的服务?BR> WebLogic服务器ؓ一些通常的数据库提供了JDBC驱动E序∣racle, Sybase, Microsoft SQL Server以及Informix。它也带有一UJDBC驱动E序用于CloudscapeQ这是一U纯Java的DBMSQWebLogic服务器中带有该数据库的评估版本?BR> 以下让我们看一个实例?BR> JDBC实例
在这个例子中我们假定你已l在Cloudscape中徏立了一个PhoneBook数据库,q且包含一个表Q名?CONTACT_TABLE Q它带有2个字D:NAME ?PHONE?开始的时候先装蝲Cloudscape JDBC driverQƈh driver manager得到一个对PhoneBook Cloudscape数据库的q接。通过q一q接Q我们可以构造一?Statement 对象q用它来执行一个简单的SQL查询。最后,用@环来遍历l果集的所有数据,q用标准输出NAME和PHONE字段的内容进行输出?BR> import java.sql.*;
public class JDBCExample
{
public static void main( String args[] )
{
try
{
Class.forName("COM.cloudscape.core.JDBCDriver");
Connection conn = DriverManager.getConnection("jdbc:cloudscape:PhoneBook");
Statement stmt = conn.createStatement();
String sql = "SELECT name, phone FROM CONTACT_TABLE ORDER BY name";
ResultSet resultSet = stmt.executeQuery( sql );
String name;
String phone;
while ( resultSet.next() )
{
name = resultSet.getString(1).trim();
phone = resultSet.getString(2).trim();
System.out.println( name + ", " + phone );
}
}
catch ( Exception e )
{
// Handle exception here
e.printStackTrace();
}
}
}
OK。接着我们来看一看JDBC是如何在企业应用中的q行使用?BR> JDBC在企业应用中的应用
以上实例其实是很基本的,可能有些微不道。它假定了一?层结构。在一个多层的企业U应用中Q更大的可能是在客户端和一个EJBq行通信Q该EJB徏立数据库q接。ؓ了实现和改进可~性和pȝ性能Q?WebLogic服务器提供了对连接缓冲池connection pool的支持?BR> Connection pool减少了徏立和释放数据库连接的消耗。在pȝ启动以后卛_建立q样的缓冲池Q此后如故再有对数据库的hQWebLogic服务器可以很单地从缓冲池中取出数据。数据缓冲池可以在WebLogic服务器的 weblogic.properties 文g中进行定义?可参?weblogic.properties 文g中的例子QWebLogic服务器的文档中还有更详细的参考信?
在企业应用的另一个常见的数据库特性是事务处理。事务是一l申明statementQ它们必d为同一个statement来处理以保证数据完整性。缺省情况下JDBC使用 auto-commit 事务模式。这可以通过使用Connectioncȝ setAutoCommit() Ҏ来实现?BR> 现在我们已经对JDBC有了一些认识,下面该{向JNDI?
Java Naming and Directory Interface (JNDI)
JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业U的资源如DNS和LDAPQ本地文件系l,后者在应用服务器中的对象?BR> 在JNDI中,在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。这里没有绝对名字的概念存在。对一个应用来_它可以通过使用 InitialContext cL得到其第一个context:
Context ctx = new InitialContext();
应用可以通过q个初始化的contextl有q个目录树来定位它所需要的资源或对象。例如,假设你在Weblogic服务器中展开了一个EJBq将home接口l定到名?myApp.myEJB Q那么该EJB的某个客户在取得一个初始化context以后Q可以通过以下语句定位home接口Q?BR> MyEJBHome home = ctx.lookup( "myApp.myEJB" );
在这个例子中Q一旦你有了对被h对象的参考,EJB的home接口可以在它上面调用方法。我们将在下面的"Enterprise Java Beans"章节中做更多的介l?BR> 以上关于JNDI的讨论只是冰׃一角而已。如果要更进一步地在context中查扑֯象,JNDI也提供了一些方法来q行以下操作Q
一个对象插入或l定到context。这在你展开一个EJB的时候是很有效的?BR> 从context中移d象?BR> 列出context中的所有对象?BR> 创徏或删除子一U的context?BR> 接下来,我们要开始关注EJB了?BR> Enterprise Java Beans (EJB)
J2EE技术之所以赢得某体广泛重视的原因之一是EJB。它们提供了一个框架来开发和实施分布式商务逻辑Q由此很显著地简化了h可~性和高度复杂的企业应用的开发。EJB规范定义了EJBlg在何时如何与它们的容器进行交互作用。容器负责提供公用的服务Q例如目录服务、事务管理、安全性、资源缓冲池以及定w性?BR> EJB规范定义?中基本的beancd:
Stateless session beans: 提供某种单一的服务,不维持Q何状态,在服务器故障发生时无法l存在,生命期相对较短。例如,一个stateless session bean可能被用于执行温度{换计?BR> Stateful session bean: T提供了与客户端的会话交互Q可以存储状态从而代表一个客戗典型例子是购物车。Stateful session bean在服务器故障时无法l生存,生命气相对较短。每一个实例只用于一个单个的U程?BR> Entity beans: 提供了一致性数据的表示-- 通常存放在数据库?-- 在服务器故障发生后能l箋存在。多用户情况下可以用EJB来表C相同的数据。entity EJB的一个典型例子是客户的帐号信息?BR> 管有以上的区别Q所有的EJBq是有许多的共同之处。它们都处理home interface。它定义了一个客L是如何创Z消亡EJB的。可以在bean中对定义了客LҎ的远E接口进行调用;beancd执行了主要的商务逻辑?BR> 描述EJB的开发已l超Z本文的范围。但是,如果一个EJB已经被开发了或者从W三方进行了购买Q它必d应用服务器中q行发布。WebLogic Server 5.1带有一个EJB Deployer Tool来协助处理EJB的发布。当你用EJB Deployer Tool的时候,你要定义客户端所用的JNDI名字来定位EJB。Deployer Tool生成wrappercL处理和容器的通信以及在一个jar文g中把被请求的Javacȝ定在一赗?BR> 一旦EJB被发布,客户端就可以使用它的JNDI名字来定位EJB。首先,它必dC个到home接口的reference。然后,客户端可以用该接口Q调用一?create() Ҏ来得到服务器上运行的某个bean实例的句柄;最后,客户端可以用该句柄在bean中调用方法?BR> 了解 EJB后,让我们再来看JSP?BR> JavaServer Pages (JSPs)
我们中间可能已经有许多h已经熟悉Microsoft的Active Server Pages (ASP)技术了。JSP和ASP相对应的Q但更具有^台对立性。他们被设计用以帮助Web内容开发h员创建动态网,q且只需要相对较的代码?即Web设计师不懂得如何~程也可以用JSPQ因为JSP应用是很方便的?JSP面由HTML代码和嵌入其中的Java代码所l成。服务器在页面被客户端所h以后对这些Java代码q行处理Q然后将生成的HTML面q回l客L的浏览器?BR> 下面我们来看一个JSP的简单实例。它只显CZ服务器的当前日期和时间。虽Ӟ对语法的具体解释已经出了本文的范围Q但我们q是可以很直观地看到QJava代码被放在符L中间Q而Java的表辑ּ则放在符号之间?BR> Date JSP sample
The current date is .
您可能有时候听说过JHTML。这是JSP以前的一U较老的标准。WebLogic服务器既可支持JSPQ又可支持JHTML。请注意Q在~省状况下,JSP在WebLogic服务器中q没有处于有效状态。要使之有效Q你可以~辑weblogic.properties文g。如果Web服务器还没有处于有效状态,则要先之有效。Servlet的情况和JSP是一L?BR> 下面? Java servlets
Java servlets
servlet提供的功能大多与JSPcMQ不q实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码Q而servlets全部由Java写成q且生成HTML?BR> servlet是一U小型的JavaE序Q它扩展了Web服务器的功能。作ZU服务器端的应用Q当被请求时开始执行,q和CGI Perl脚本很相伹{Servlets和CGI脚本的一个很大的区别是:每一个CGI在开始的时候都要求开始一个新的进E?-- 而servlets是在servlet引擎中以分离的线E来q行的。因此servlets在可伸羃性上提供了很好的改进?BR> 在开发servlets的时候,您常帔R要扩展javax.servlet.http.HttpServlet c,q且override一些它的方法,其中包括Q?BR> service(): 作ؓdispatcher来实现命?定义Ҏ
doGet(): 处理客户端的HTTP GETh?BR> doPost(): q行HTTP POST操作
其它的方法还包括处理不同cd的HTTPh -- 可以参考HttpServlet API文档?BR> 以上描述的是标准J2EE Servlet API的各U方法。WebLogic服务器提供了一个该API完整的实现途径。一旦你开发了一个servletQ你可以在weblogic.properties 中加以注册ƈ由此可以在WebLogic服务器中对它q行配置?BR> 通过Java servlets,我们已经到达了J2EE主要技术的末尾了。但J2EE所提供的ƈ不止于这些。下面的D落中我们将要地看一下现存的一些技术,包括RMI, Java IDL和CORBA, JTA, 以及XMLQ等{?BR> Remote Method Invocation (RMI)
正如其名字所表示的那PRMI协议是在q程对象上调用一些方法。它使用了连l序列方式在客户端和服务器端传递数据。RMI是一U被EJB使用的更下层的协议?BR> Java IDL/CORBA
在Java IDL的支持下Q开发h员可以将Java和CORBA集成在一赗?他们可以创徏Java对象q之可在CORBA ORB中展开, 或者他们还可以创徏Javacdƈ作ؓ和其它ORB一起展开的CORBA对象的客戗后一U方法提供了另外一U途径Q通过它Java可以被用于将你的新的应用和legacypȝ盔R成?BR> Java Transaction Architecture (JTA)/Java Transaction Service (JTS)
JTA定义了一U标准的APIQ应用系l由此可以存取各U事务监控?BR> JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务理器是在高层支持Java Transaction API (JTA)规范Qƈ且在较底层实现OMG OTS specification的Java映像。JTS事务理器ؓ应用服务器、资源管理器、独立的应用以及通信资源理器提供了事务服务?BR> JavaMail and JavaBeans Activation Framework
JavaMail是用于存取邮件服务器的APIQ它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器,也支持IMAP服务器?BR> JavaMail利用JavaBeans Activation Framework (JAF)来处理MIME-~码的邮仉件。MIME的字节流可以被{换成Java对象Q或者{换自Java对象。由此大多数应用都可以不需要直接用JAF?BR> Java Messaging Service (JMS)
JMS是用于和面向消息的中间g怺通信的应用程序接?API)。它既支持点对点的域Q有支持发布/订阅(publish/subscribe)cd的域Qƈ且提供对下列cd的支持:l认可的消息传?事务型消息的传递,一致性消息和h持久性的订阅者支持。JMSq提供了另一U方式来Ҏ的应用与legacy backendpȝ盔R成?BR> Extensible Markup Language (XML)
XML是一U可以用来定义其它标记语a的语a。它被用来在不同的商务过E中׃n数据。XML的发展和Java是相互独立的Q但是,它和Javah的相同目标正是^台独立性。通过Java和XML的组合,您可以得C个完的hq_独立性的解决Ҏ。目前正有许多不同的公司在ؓJava和XML的组合而努力。如果要了解更多的这斚w的信息,可以讉KSun的Java-XML面Q或者IBM developerWorks的XML Zone?