﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-重归混沌-随笔分类-EJB学习笔记</title><link>http://www.blogjava.net/wyxdeniro/category/42434.html</link><description>欲为诸佛龙象，必先做众生牛马</description><language>zh-cn</language><lastBuildDate>Sat, 21 Nov 2009 07:59:49 GMT</lastBuildDate><pubDate>Sat, 21 Nov 2009 07:59:49 GMT</pubDate><ttl>60</ttl><item><title>EJB学习笔记(十三) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303139.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sat, 21 Nov 2009 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303139.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/303139.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/303139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/303139.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; 实体Bean包含BMP和CMP两种类型。对BMP实体Bean而言，开发者必须提供各自的数据访问逻辑。为了实现BMP，通常会使用操作数据库的API,比如JDBC.对于CMP实体Bean而言，EJB容器会自动实现数据访问逻辑。这就是CMP的优势所在。通常，只有在应用服务器提供的CMP和目标RDBMS不能满足性能要求时，才去考虑BMP.此时，开发者能够细粒度调整BM...&nbsp;&nbsp;<a href='http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303139.html'>阅读全文</a><img src ="http://www.blogjava.net/wyxdeniro/aggbug/303139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-21 12:32 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(十二) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302399.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sun, 15 Nov 2009 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302399.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/302399.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/302399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/302399.html</trackback:ping><description><![CDATA[<p>持久化实体Bean的两种方式：<br />
&nbsp;&nbsp;&nbsp; 既然需要将实体Bean映射到存储源中，应用肯定需要提供操作RDBMS的代码。<br />
&nbsp;&nbsp;&nbsp; Bean管理持久化实体Bean,是手工完成持久化行为的EJB类型。换句话所，组件开发者必须开发代码，以将内存中的持久化域存储到底层存储源中。这种方式成为BMP。<br />
&nbsp;&nbsp;&nbsp; EJB规范还提供了BMP的替代组件类型：借助于EJB容器完成数据的持久化。这就是容器管理持久化(CMP)。此时，通常都要将持久化逻辑从CMP中剥离出来。然后借助于容器提供的工具完成数据的自动持久化。最后,EJB容器将生成访问数据库的代码。注意，CMP是独立于任何O/RMapping技术的数据对象，因此可以在各种企业环境中重用CMP组件。<br />
&nbsp;&nbsp;&nbsp; CMP极大减少了实体Bean的代码量，因为不用直接编写JDBC代码了。EJB容器将会处理所有的持久化操作，这是EJB势能应用的优势之一。<br />
&nbsp;&nbsp;&nbsp; 在执行ejbCreate()方法期间，即在初始化内存中的实体Bean时，将会在底层RDBMS中插入新的记录，并将这些记录同实体Bean实例建立起映射关系。当调用BMP实体Bean的ejbCreate()时，它将负责生成RDBMS中的数据。类似的，当调用BMP实体Bean的ejbRemo()时，它将负责RDBMS中数据的删除。</p>
<p>&nbsp;&nbsp;&nbsp; 在EJB领域中，客户并没有直接调用EJB实例，它们仅仅调用了EJB对象代理。借助于Home对象能够生成EJB对象。因此，对于定义在EJB Bean类中的各个ejbCreate()方法，在Home接口中也将存在对象的create()方法。当客户调用Home对象的create()方法时，容器将把调用请求委派给ejbCreate()方法。<br />
&nbsp;&nbsp;&nbsp; 开发者可以通过多种方式查找实体Bean.需要在实体Bean的Home接口中列举出这些查找方法。我们称这些方法为"finder"方法。除了暴露创建、销毁实体Bean实例的方法外，Home接口还需暴露finder方法。这是实体Bean的Home接口同其他EJB类型中的Home接口的最明显区别。</p>
<p>&nbsp;&nbsp;&nbsp; 实体上下文，所有的EJB组件都存在上下文对象供组件访问到容器环境使用。这些上下文对象含有EJB容器设置的环境信息。因此EJB组件能够访问到上下文，从而获取各种信息，比如事务，安全性信息。对于实体Bean而言，存在javax.ejb.EntityContext上下文接口。它继承自EJBContext<br />
public interface javax.ejb.EntityContext extends javax.ejb.EJBContext{<br />
&nbsp;public javax.ejb.EJBLocalObject getEJBLocalObject();<br />
&nbsp;public javax.ejb.EJBObject getEJBObject();<br />
&nbsp;public java.lang.Object getPrimarykey();<br />
}<br />
&nbsp;&nbsp;&nbsp; 通过调用getEJBObject()方法，当前客户能够获得某实体Bean实例对应的EJB对象。客户调用的是EJB对象，而不是实体Bean实例本身。因此，客户能够在应用中引用返回的EJB对象。<br />
&nbsp;&nbsp;&nbsp; 实体Bean实例对应的主键可以通过getPrimaryKey()方法获得。主键唯一标识某实体Bean实例。当实体Bean实例存储到存储源中时，可以使用主键获得单个实体Bean实例。由于在RDBMS中也存在主键，因此主键能够唯一标识某个实体Bean实例。</p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/302399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-15 12:21 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(十一) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302395.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sun, 15 Nov 2009 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302395.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/302395.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/302395.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/302395.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 实体Bean是持久化对象，它能够存储到持久化存储源中。实体Bean是EJB编程模型中最为重要的利器之一。<br />
&nbsp;&nbsp;&nbsp; 将对象映射到RDBMS的技术称之为对象-关系映射。它能够实现内存对象同关系数据的相互转换。O/R映射器能够将Java对象映射到任意RDBMS模式。比如简单的O/RMapping引擎能够将Java类映射成SQL表定义。Java语言提供的对象序列化功能比O/RMapping简单多了。O/RMapping是更加复杂、成熟的对象持久化机制。通过将Java对象分解成关系数据，应用便能够查找到所需的数据了。<br />
&nbsp;&nbsp;&nbsp; 通过如下两种方式能够完成Java对象到关系数据的映射。其一，通过硬编码实现O/RMapping.其二，借助于O/RMapping产品，自动完成映射过程，比如：Hibernate.<br />
&nbsp;&nbsp;&nbsp; 对于任何成熟的、基于OO多层部署的企业应用而言，总可以划分出2种截然不同的组件类型。1、应用逻辑组件，2、持久化数据组件。会话Bean和实体Bean的最大区别在于实体Bean是实体，客户是可以看的到的。因此实体Bean能够独立于客户应用的生命周期。对于实体Bean而言，通过比较它们各自含有的数据便能够区分不同的实体Bean.这意味着客户能够引用单个的实体Bean实例并将它传入到其他应用中，不同的客户可以共享同样的实体Bean实例，这对于会话Bean是办不到的。会话Bean建模过程或者工作流。实体Bean本身就是客户，它就是持久化状态对象。<br />
&nbsp;&nbsp;&nbsp; 实体Bean实例存在几方面的含义：<br />
1、持久化数据的Java表示，即它能够从持久化存储源装载数据到内存中。同时，实体Bean实例能够将装载到的数据存储到实例的成员变量中。<br />
2、通过修改内存中的Java对象可以改变数据的取值。<br />
3、还可以将修改后的数据保存到存储源汇中，从而更新RDBMS中的物理数据。<br />
&nbsp;&nbsp;&nbsp; 实体Bean是持久化对象，它能够长期存在。即使出现了不可恢复的失败，比如应用服务器瘫痪、数据库瘫痪，实体Bean还是能够存活的。原因在于实体Bean只是对底层具有容错行为的持久化存储源中数据的映射，因此，即使极其瘫痪，内存中的实体Bean实例还可以重新构建。在极其重启后，实体Bean实例需要从底层存储源装载数据，并使用获得的数据对实体Bean实例中的各个域进行setter操作。实体Bean比客户会话的生命周期要长。可以认为，数据库中记录存活的时间决定了实体Bean实例的生命周期。<br />
&nbsp;&nbsp;&nbsp; 相同数据往往存在多分物理拷贝，比如内存中的实体Bean实例、实体Bean数据本身，他们都是对RDBMS中数据的拷贝。因此，EJB容器需要提供某种机制实现数据在Java对象和RDBMS间的自动传输。实体Bean的Bean类为此提供了2个特殊方法：<br />
ejbLoad():它能够从持久化存储源中读取数据，并存储到实体Bean实例的域中。<br />
ejbStore():它能够将当前实体Bean实例的域值保存到底层RDBMS中。<br />
那么何时需要完成内存中实体Bean实例和RDBMS中数据的传递和转换，开发者需要知道是谁调用了ejbLoad()和ejbStore(),答案是EJB容器。它们是回调方法，供EJB容器调用。EJB规范要求所有的实体Bean组件必须提供它们。至于读取或存储数据的时机，由EJB容器决定。依据实体Bean实例当前的事务状态，EJB容器会自动计算出需要调用实体Bean实例中的ejbLoad()，ejbStore()方法的时机，这也是使用实体Bean组件的优势之一：开发者不用考虑java对象同步底层RDBMS的问题。</p>
<p>&nbsp;&nbsp;&nbsp; 为了满足大量并发客户访问同一数据的要求，架构师需要借助于实体Bean设计出高性能的访问系统。如下给出一种解决方案：允许多个客户共享同一实体Bean实例。因此，实体Bean实例能够同时服务多个客户。尽管表面上看是可行的，但是对于EJB而言，这是行不通的。原因有亮点：其一，为实现实体Bean实例服务多个并发客户，必须保证实体Bean实例是线程安全的，开发线程安全的代码并不是一件容易的工作，而且经常会出现一堆错我。其二，底层事务系统几乎不可能控制多个线程的并发执行，事务往往同具体的线程绑定在一起。因此，基于上述理由，单个实体Bean实例只能够在单线程环境中运行。对于所有的EJB组件而言，包括会话Bean、消息驱动Bean、实体Bean，它们都是以单线程方式运行的。<br />
&nbsp;&nbsp;&nbsp; 当然，强制要求各个实体Bean实例只能同时服务单个客户，将引入性能瓶颈。由于实例以单线程方式运行，客户需要排队等候实体Bean实例，从而获得对实体Bean实例的调用，这对于大型企业应用而言，是不允许出现的<br />
&nbsp;&nbsp;&nbsp; 为了提供系统性能，EJB容器会实例化同一实体Bean的多个实例。这使得多个客户能够并发同不同实体Bean实例进行交互，而这些实体Bean实例代表了同一RDBMS数据。事实上，这就是EJB容器的运行行为。因此，客户再也不用排队等候实体Bean实例，因为存在多个实体Bean实例了。<br />
&nbsp;&nbsp;&nbsp; 一旦多个实体Bean实例代表了同一RDBMS数据，则引入了另外一个问题：数据瘫痪。如果多个实体Bean实例代表的数据是通过缓存管理的，则需要在内存中拷贝多分缓存中的数据。显然，某些缓存中的数据将变得陈旧，因此会出现很多过期的数据。<br />
&nbsp;&nbsp;&nbsp; 为了实现实体Bean实例的缓存一致性，各个实体Bean实例必须同底层存储元进行同步。EJB容器将通过调用ejbLoad(),ejbStore()方法同步这些实体Bean实例。<br />
&nbsp;&nbsp;&nbsp; 至于实体Bean实例同底层RDBMS数据的同步频率，则取决于事务。事务将各个客户请求隔离起来。借助于事务实现数据同步。</p>
<p>&nbsp;&nbsp;&nbsp; EJB容器提供的实例池是很有意义的。当然，并不是只有实体Bean才存在实例池。在将实体Bean实例重新分配给不同EJB对象时，会存在一些问题，并要求容器去解决。比如当实体Bean实例被指定给EJB对象时，它可能还持有资源(比如Socket连接)。如果将实体Bean实例放置在实例池中，Socket连接不在需要。因此为实现资源的获取和释放，实体Bean的Bean类需要实现如下2个回调方法：<br />
1、ejbActivate().在将实体Bean实例从实例池中取出来时，EJB容器会自动调用它。该过程称之为激活。进而，EJB容器会将实体Bean实例分配给某EJB对象，并同时获得主键对象。在执行ejbActivate()方法期间，实例需要获得所需的资源，比如Socke,否则，在将实体Bean实例分配给某EJB对象时，无法对资源进行操作。<br />
2、ejbPassivate().在将实体Bean实例放置到实例池中时，EJB容器会调用它。注意，它也是回调方法。这一过程称之为挂起。进而，EJB容器需要从某EJB对象中取回分配于它的实体Bean实例，并将实例的主键对象也收回。在执行ejbPassivate()方法期间，需要释放ejbActivate()执行期间获得的相关资源，比如：Socket.<br />
&nbsp;&nbsp;&nbsp; 一旦实体Bean实例被挂起，不但要释放它持有的资源，还将实例的状态信息保存起来。因此，实体Bean实例最新的状态信息可以从RDBMS中找到了。为了保存实体Bean实例的域信息到RDBMS中，容器要在挂起实例前调用ejbStore()方法。类似的，一旦实体Bean被激活，不但要获得所需的资源，还要从RDBMS装载最新的数据，为了完成数据的读取，EJB容器将在激活实体Bean实例后调用ejbLoad()方法。</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/302395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-15 11:46 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(十) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/13/302257.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 13 Nov 2009 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/13/302257.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/302257.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/13/302257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/302257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/302257.html</trackback:ping><description><![CDATA[实现WEB服务客户<br />
web服务是跨平台的、跨语言的，所以WEB服务的客户端使用的语言和平台和他的服务端没有必然的关系。比如我们可以在.Net下开发、部署web服务，然后在J2EE平台下调用它，或者使用在J2EE平台下开发、部署web服务，然后使用VB来调用它。<br />
在J2EE平台中，WEB服务客户同EJB客户类似。如下两种方式能够访问到WEB服务：<br />
1、不借助于JNDI查找，即使用单独的JAX-RPC客户访问。<br />
2、借助于JNDI上下文访问WEB服务的J2EE客户<br />
第一种方法称之为静态存根，此时需要在客户端预先生成SOAP客户存根，这同RMI存根类似。第二种方法称之为动态代理。它将在运行时获得WSDL描述，然后创建动态代理。无论采用哪种方式访问WEB服务，客户都需要获得服务Endpoint地址URL，否则单凭JNDI名是很难访问到WEB服务的。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.testproject.ejb.web;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.net.URL;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.namespace.QName;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.rpc.Service;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.rpc.ServiceFactory;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_158_217_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_217_Open_Text.style.display='none'; Codehighlighter1_158_217_Closed_Image.style.display='inline'; Codehighlighter1_158_217_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_158_217_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_158_217_Closed_Text.style.display='none'; Codehighlighter1_158_217_Open_Image.style.display='inline'; Codehighlighter1_158_217_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_158_217_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_158_217_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;单独JAX-RPC客户代码实例。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;它使用了动态代理方法，以获得对远程WEB服务的引用。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_244_1046_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_1046_Open_Text.style.display='none'; Codehighlighter1_244_1046_Closed_Image.style.display='inline'; Codehighlighter1_244_1046_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_244_1046_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_244_1046_Closed_Text.style.display='none'; Codehighlighter1_244_1046_Open_Image.style.display='inline'; Codehighlighter1_244_1046_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloClient&nbsp;</span><span id="Codehighlighter1_244_1046_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_244_1046_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;host&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">localhost</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">web服务的名字</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;serviceURL&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">HelloBean</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">名称空间</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;nameSpaceUri&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">urn:examples</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;serviceName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">HelloWorldWS</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">web服务调用的地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;serviceEndpointAddress&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">host</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">:8000</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">serviceURL;<br />
<img id="Codehighlighter1_577_1044_Open_Image" onclick="this.style.display='none'; Codehighlighter1_577_1044_Open_Text.style.display='none'; Codehighlighter1_577_1044_Closed_Image.style.display='inline'; Codehighlighter1_577_1044_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_577_1044_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_577_1044_Closed_Text.style.display='none'; Codehighlighter1_577_1044_Open_Image.style.display='inline'; Codehighlighter1_577_1044_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_577_1044_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_577_1044_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloInterface&nbsp;hello&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">动态代理方法<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">1、指定WSDL文件的位置</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;URL(serviceEndpointAddress</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">?WSDL</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">2、创建服务工厂实例</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceFactory&nbsp;serviceFactory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ServiceFactory.newInstance();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">3、创建服务对象，以作为代理工厂</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;HelloService&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;serviceFactory.createService(url,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QName(nameSpaceUri,serviceName));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">4、获得port引用</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hello&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(HelloInterface)HelloService.getPort(HelloInterface.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用hello()方法</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Dynamic&nbsp;Proxy:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">hello.hello());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/302257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-13 16:45 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/13/302257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(九) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/13/302247.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 13 Nov 2009 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/13/302247.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/302247.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/13/302247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/302247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/302247.html</trackback:ping><description><![CDATA[EJB2.1和web服务<br />
1、下载安装服务器后，需要设置环境变量。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Set&nbsp;J2EE_HOME</span><span style="color: #000000">=</span><span style="color: #000000">J2EE安装目录<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Set&nbsp;CLASSPATH&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%J2EE_HOME%\\lib\\j2ee.jar;.</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">Set&nbsp;Path&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">%Path%</span><span style="color: #008000">;</span><span style="color: #008000">%J2EE_HOME%\\bin;.</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
2、创建初始目录<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">+HelloBeanService<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;+META-INF(application.xml；sun-j2ee-ri.xml&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;+ejb<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+META-INF（ejb-jar.xml；&nbsp;webservices.xml；mapping.xml）<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-*.java文件（EJB相关的类）<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-config.xml<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
3、定义web服务接口<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.testproject.ejb.web;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_34_166_Open_Image" onclick="this.style.display='none'; Codehighlighter1_34_166_Open_Text.style.display='none'; Codehighlighter1_34_166_Closed_Image.style.display='inline'; Codehighlighter1_34_166_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_34_166_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_34_166_Closed_Text.style.display='none'; Codehighlighter1_34_166_Open_Image.style.display='inline'; Codehighlighter1_34_166_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_34_166_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_34_166_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;Hello服务Endpoint接口<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;需要注意的是，这里使用的是EJB2.1无状态会话Bean,它作为WEB服务端点时可以不提供Home接口和Remote<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;Locale接口，它提供的是web服务端点接口，这个接口扩展了Remote接口。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_224_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_224_281_Open_Text.style.display='none'; Codehighlighter1_224_281_Closed_Image.style.display='inline'; Codehighlighter1_224_281_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_224_281_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_224_281_Closed_Text.style.display='none'; Codehighlighter1_224_281_Open_Image.style.display='inline'; Codehighlighter1_224_281_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;HelloInterface&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;java.rmi.Remote&nbsp;</span><span id="Codehighlighter1_224_281_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_224_281_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;hello()</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;java.rmi.RemoteException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
4、实现服务端点接口<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.testproject.ejb.web;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.rmi.RemoteException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.EJBException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.SessionBean;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.SessionContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_163_257_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_257_Open_Text.style.display='none'; Codehighlighter1_163_257_Closed_Image.style.display='inline'; Codehighlighter1_163_257_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_163_257_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_163_257_Closed_Text.style.display='none'; Codehighlighter1_163_257_Open_Image.style.display='inline'; Codehighlighter1_163_257_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_163_257_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_163_257_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;定义了服务端点接口，接下来的任务就是开发无状态会话Bean。无状态会话Bean同样需要实现SessionBean接口，<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;服务端点接口定义的方法在会话Bean中实现。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_305_748_Open_Image" onclick="this.style.display='none'; Codehighlighter1_305_748_Open_Text.style.display='none'; Codehighlighter1_305_748_Closed_Image.style.display='inline'; Codehighlighter1_305_748_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_305_748_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_305_748_Closed_Text.style.display='none'; Codehighlighter1_305_748_Open_Image.style.display='inline'; Codehighlighter1_305_748_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloBean&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;SessionBean&nbsp;</span><span id="Codehighlighter1_305_748_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_305_748_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_333_363_Open_Image" onclick="this.style.display='none'; Codehighlighter1_333_363_Open_Text.style.display='none'; Codehighlighter1_333_363_Closed_Image.style.display='inline'; Codehighlighter1_333_363_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_333_363_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_333_363_Closed_Text.style.display='none'; Codehighlighter1_333_363_Open_Image.style.display='inline'; Codehighlighter1_333_363_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ejbCreate()</span><span id="Codehighlighter1_333_363_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_333_363_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_337_360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_337_360_Open_Text.style.display='none'; Codehighlighter1_337_360_Closed_Image.style.display='inline'; Codehighlighter1_337_360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_337_360_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_337_360_Closed_Text.style.display='none'; Codehighlighter1_337_360_Open_Image.style.display='inline'; Codehighlighter1_337_360_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_337_360_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_337_360_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;这里不能接收任何参数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_430_433_Open_Image" onclick="this.style.display='none'; Codehighlighter1_430_433_Open_Text.style.display='none'; Codehighlighter1_430_433_Closed_Image.style.display='inline'; Codehighlighter1_430_433_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_430_433_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_430_433_Closed_Text.style.display='none'; Codehighlighter1_430_433_Open_Image.style.display='inline'; Codehighlighter1_430_433_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ejbActivate()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;EJBException,&nbsp;RemoteException&nbsp;</span><span id="Codehighlighter1_430_433_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_430_433_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_501_504_Open_Image" onclick="this.style.display='none'; Codehighlighter1_501_504_Open_Text.style.display='none'; Codehighlighter1_501_504_Closed_Image.style.display='inline'; Codehighlighter1_501_504_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_501_504_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_501_504_Closed_Text.style.display='none'; Codehighlighter1_501_504_Open_Image.style.display='inline'; Codehighlighter1_501_504_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ejbPassivate()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;EJBException,&nbsp;RemoteException&nbsp;</span><span id="Codehighlighter1_501_504_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_501_504_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_569_572_Open_Image" onclick="this.style.display='none'; Codehighlighter1_569_572_Open_Text.style.display='none'; Codehighlighter1_569_572_Closed_Image.style.display='inline'; Codehighlighter1_569_572_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_569_572_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_569_572_Closed_Text.style.display='none'; Codehighlighter1_569_572_Open_Image.style.display='inline'; Codehighlighter1_569_572_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ejbRemove()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;EJBException,&nbsp;RemoteException&nbsp;</span><span id="Codehighlighter1_569_572_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_569_572_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setSessionContext(SessionContext&nbsp;arg0)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;EJBException,<br />
<img id="Codehighlighter1_667_670_Open_Image" onclick="this.style.display='none'; Codehighlighter1_667_670_Open_Text.style.display='none'; Codehighlighter1_667_670_Closed_Image.style.display='inline'; Codehighlighter1_667_670_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_667_670_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_667_670_Closed_Text.style.display='none'; Codehighlighter1_667_670_Open_Image.style.display='inline'; Codehighlighter1_667_670_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemoteException&nbsp;</span><span id="Codehighlighter1_667_670_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_667_670_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_673_696_Open_Image" onclick="this.style.display='none'; Codehighlighter1_673_696_Open_Text.style.display='none'; Codehighlighter1_673_696_Closed_Image.style.display='inline'; Codehighlighter1_673_696_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_673_696_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_673_696_Closed_Text.style.display='none'; Codehighlighter1_673_696_Open_Image.style.display='inline'; Codehighlighter1_673_696_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_673_696_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_673_696_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;业务方法：输出hello<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_720_745_Open_Image" onclick="this.style.display='none'; Codehighlighter1_720_745_Open_Text.style.display='none'; Codehighlighter1_720_745_Closed_Image.style.display='inline'; Codehighlighter1_720_745_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_720_745_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_720_745_Closed_Text.style.display='none'; Codehighlighter1_720_745_Open_Image.style.display='inline'; Codehighlighter1_720_745_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;hello()</span><span id="Codehighlighter1_720_745_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_720_745_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;wyq</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
5、创建EJB描述<br />
用于部署成Web服务的无状态会话Bean的描述符和普通的无状态会话Bean不同ejb-jar.xml<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ejb-jar&nbsp;</span><span style="color: #ff0000">version</span><span style="color: #0000ff">="2.1"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />xmlns</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000">&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />xsi:schemaLocation</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">display-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloBean</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">display-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">enterprise-beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">session</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">display-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloBean</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">display-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ejb-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloBean</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ejb-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">service-endpoint</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.testproject.ejb.web.HelloInterface</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">service-endpoint</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ejb-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.testproject.ejb.web.HelloBean</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ejb-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">session-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Stateless</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">session-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">transaction-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Container</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">transaction-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">session</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">enterprise-beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ejb-jar</span><span style="color: #0000ff">&gt;</span></div>
<br />
在这个新的部署描述符中，使用&lt;service-endpoint&gt;指定了服务端点，同时，必须指定EJB为无状态会话Bean<br />
6、生成WEB服务描述<br />
<p>下面的任务就是生成一个Web服务描述，我们通常使用工具来生成这个描述符。在这里使用J2EE提供的wscompile工具来生成。在使用wscompile工具生成web服务描述前，首先手工编写一个简单的XML描述config.xml<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">configuration&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/jax-rpc/ri/config"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">service&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="MyHelloBeanService"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetNamespace</span><span style="color: #0000ff">="urn:HelloBean"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typeNamespace</span><span style="color: #0000ff">="urn:HelloBean"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageName</span><span style="color: #0000ff">="helloBeanService"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interface&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="com.testproject.ejb.web.HelloInterface"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">service</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span></div>
<p>在这个描述中，指定了目标的名称空间、包的名字和Web服务端点接口：HelloInterface。如下命令就可以生成一个web服务描述</p>
<pre class="displaycode">c:\\ HelloBeanService\\ejb \\&gt;wscompile -define -d . -nd . -classpath . config.xml</pre>
<pre class="displaycode">自动生成MyHelloBeanService.wsdl文件。</pre>
<pre class="displaycode">7、编写一个web服务映射文件：<br />
在ejb\\META-INF目录下新建一个mapping.xml文件，然后编辑这个描述符</pre>
<pre class="displaycode">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;java-wsdl-mapping&nbsp;PUBLIC<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"-//IBM&nbsp;Corporation,Inc.//DTD&nbsp;J2EE&nbsp;JAX-RPC&nbsp;mapping&nbsp;1.0//EN"<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"http://www.ibm.com/standards/xml/webservices/j2ee/j2ee_jaxrpc_mapping_1_0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">java-wsdl-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloBeanService</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">namespaceURI</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">urn:HelloBean</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">namespaceURI</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">java-wsdl-mapping</span><span style="color: #0000ff">&gt;</span></div>
</pre>
<pre class="displaycode">8、编写webservices.xml文件<br />
另外，还需要提供webservices.xml文件，并存放到Ejb-jar存档的META-INF目录中。各个J2EE产品可能提供相应的部署工具来创建这个文件。</pre>
<pre class="displaycode">9、EJB打包<br />
另外，web服务部署描述符在EJB-JAR文件中的位置是META-INF/webservices.xml.把生成的HelloBeanService.wsdl拷贝到ejb\\META-INF目录下<br />
c:\\HelloBeanService\\ejb\\jar cvf ejb.jar com META-INF<br />
10、Application打包<br />
HelloBeanService\\MEAT-INF目录下创建2个文件：application.xml和sun-j2ee-ri.xml<br />
application.xml</pre>
<pre class="displaycode">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;application&nbsp;PUBLIC&nbsp;'-//Sun&nbsp;Microsystems,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Inc.//DTD&nbsp;J2EE&nbsp;Application&nbsp;1.3//EN'<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;'http://java.sun.com/dtd/application_1_3.dtd'</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">application</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Application&nbsp;description</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">display-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">HelloBeanServiceApp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">display-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">module</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ejb</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">ejb.jar</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ejb</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">module</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">application</span><span style="color: #0000ff">&gt;</span></div>
</pre>
<pre class="displaycode"><br />
最后归档</pre>
<pre class="displaycode">c:\\ HelloBeanService\\ejb\\&gt;copy ejb.jar ../<br />
c:\\ HelloBeanService\\ejb\\&gt;cd..<br />
c:\\ HelloBeanService\\\\&gt;jar cvf encryptservice.ear ejb.jar META-INF<br />
<br />
</pre>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/302247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-13 16:13 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/13/302247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(八) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/09/301660.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 09 Nov 2009 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/09/301660.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/301660.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/09/301660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/301660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/301660.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Web服务是构建B2B应用最为重要的利器之一，使用它能够构建、集成大型的系统。这一切都是通过发送XML消息给已定义的模块化接口完成的。借助于无状态会话Bean能够构建Web服务。为实现Java客户对Web服务的访问，需要使用到JAX-RPC.Web服务是构建SOA的一种方式。SOA是架构方法，它能够将各种异构应用集成起来，并组成更大的分布式应用，最后通过服务接口的形式将整个应用支撑起来。<br />
&nbsp;&nbsp;&nbsp; 服务提供者创建抽象服务定义，并将它发布到服务注册器中。对于WEB服务而言，服务定义是通过WSDL文件给出的；服务注册器需要遵循UDDI标准。服务请求者可以使用一套查询机制从服务注册器中查找到WSDL文件，如果找到合适的服务定义，请求者将绑定到服务提供者上。<br />
&nbsp;&nbsp;&nbsp; 服务接口类似于对象或EJB接口。但是对于WEB服务而言，服务接口更为灵活。比如服务实现和客户处于松耦合的关系，而这在其他EJB应用或分布式应用中是实现不了的。这种松耦合使得客户和服务实现能够运行在不同平台上，比如Microsoft.NET客户能够访问到J2EE应用服务器中所运行的服务。另外，相比Java对象而言，Web服务实体的粒度更粗。<br />
&nbsp;&nbsp;&nbsp; 通过标准化接口，能够加强SOA的模块化；通过松耦合，能够提高SOA的灵活性；通过XML，能够增强SOA扩展性。在B2B场合，这些都是很重要的因素。WEB服务能够在那些使用了多种异构平台的企业应用中大显身手。所有的WEB服务都是构建在XML和Internet协议上的。EJB只能够采用Java开发。如果使用其他语言开发应用，互操作如何实现？<br />
&nbsp;&nbsp;&nbsp; 组成WEB服务的事实标准可以通过如下等式表达：<br />
&nbsp;&nbsp;&nbsp; Web服务 = WSDL+SOAP+UDDI<br />
<p>1、WSDL语言比Java更抽象、广度更大。HelloWorldWSDL中存在&lt;service&gt;标签，它能够在具体地址提供若干&lt;port&gt;.&lt;port&gt;代表了服务接口及对具体协议的绑定。<br />
2、服务描述包含了Endpoint地址。WSDL是由Java接口和对象引用构成的。换句话说，Web服务不存在真正的实体，它们不是对象，因此必须将它们按照模块化对待。<br />
3、根据输入、输出定义操作。开发者需要将输入、输出消息表示为XML元素。<br />
4、采用的绑定是SOAP绑定。到目前为止，只能采用SOAP绑定。也请注意，&lt;soap:binding&gt;标签还存在style="rpc"属性，因此可以看出style还存在其他取值，目前，用于交换SOAP消息的另一种风格是文档风格(document-style)。文档风格意味着在SOAP消息体中不在包含对具体操作的描述。</p>
<p>&nbsp;&nbsp;&nbsp; SOAP协议为Web服务和它们的客户定义了XML消息格式。SOAP消息格式非常简单。它实际包含两部分内容：其一，HTTP POST请求头信息。其二，XML文档，这就是SOAP信封(Envelope)。另外，通过上述两分SOAP消息，我们还想表达Web服务中的另一个重要概念。从SOAP协议的使用过程来看，它非常轻量，因为它对处于交互中的客户和服务没有任何限制。但是，从SOAP协议的大小、性能角度考虑，它并不轻量。如果不压缩SOAP消息，则需要在网络上传递大量的SOAP数据消息。因此，采用二进制更为明智，比如CORAB的IIOP协议。对于含有大量的SOAP数据消息进行压包和解包操作将耗费大量的CPU时间。请不要忘记，WEB服务的诞生背景，它只是为集成应用而来的，而不是替换现有的高性能中间件平台技术。否则，就不需要使用web服务了。</p>
<p>&nbsp;&nbsp;&nbsp; XML文档和平台无关性，借助于标准化的XML文档，WEB服务能够帮助集成异构的分布式系统。在实际应用开发过程中，它具有许多优势，比如松耦合、平台无关性、遵循XML方面的标准、能够合并不同的XML技术等。借助于XML能够实现应用和中间件平台的松耦合，这是很重要的优势。<br />
&nbsp;&nbsp;&nbsp; 比如在开发EJB组件时，客户和服务器端同事需要使用组件接口。一旦组件接口发生变动，比如需要往方法签名中新增参数，则EJB组件本身需要重新构建、集成、部署。当然，客户也逃脱不了重新编译的命运。因此，它们之间并没有实现松耦合，开发者不能独立的开发应用组件。否则，一旦某些组件发生变动，应用的其他部分也需要变动。我们都希望应用具有良好的扩展性。对基于IIOP的请求消息而言，所有的参与者必须使用相同的类型信息，否则不能够正确对消息进行解包操作。而且，在IIOP技术领域中，应用必须能够理解消息的所有内容。如果基于XML和XML消息开发应用，则这些限制将不复存在。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; J2EE平台技术对WEB服务提供了一流的支持能力。无论WEB服务实现，还是WEB服务客户，都可以使用JAVA语言开发完成。在J2EE中，使用WEB服务同RMI、RMI-IIOP并没有多大区别。他们都将具体传输层屏蔽掉，使得开发者能够专注于业务逻辑。<br />
&nbsp;&nbsp;&nbsp; JSR921规范，即实现企业WEB服务，定义了WEB服务编程模型。它使用术语port组件，描述web服务的服务器端视图。它是服务接口的java实现。而且，它遵循服务接口到Java的映射，并提供了相应的Java实现。需要将它部署并运行在容器中。使用EJB开发WEB服务需要创建若干port组件。其中，还需要提供若干XML部署描述符。当然，直接基于EJB实现WEB服务是J2EE平台中实现WEB服务的最大优势。</p>
<p>&nbsp;&nbsp;&nbsp; JAX-RPC服务端点接口，现在，来开发另一远程接口，它将企业Bean所提供的业务方法都列举出来，我们称之为服务Endpoint接口(Service Endpoint Interface,SEI)，下面给出了代码。<br />
&nbsp;&nbsp;&nbsp; </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.testproject.ejb.web;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_34_166_Open_Image" onclick="this.style.display='none'; Codehighlighter1_34_166_Open_Text.style.display='none'; Codehighlighter1_34_166_Closed_Image.style.display='inline'; Codehighlighter1_34_166_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_34_166_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_34_166_Closed_Text.style.display='none'; Codehighlighter1_34_166_Open_Image.style.display='inline'; Codehighlighter1_34_166_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_34_166_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_34_166_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;Hello服务Endpoint接口<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;需要注意的是，这里使用的是EJB2.1无状态会话Bean,它作为WEB服务端点时可以不提供Home接口和Remote<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;Locale接口，它提供的是web服务端点接口，这个接口扩展了Remote接口。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_224_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_224_281_Open_Text.style.display='none'; Codehighlighter1_224_281_Closed_Image.style.display='inline'; Codehighlighter1_224_281_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_224_281_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_224_281_Closed_Text.style.display='none'; Codehighlighter1_224_281_Open_Image.style.display='inline'; Codehighlighter1_224_281_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;HelloInterface&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;java.rmi.Remote&nbsp;</span><span id="Codehighlighter1_224_281_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_224_281_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;hello()</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;java.rmi.RemoteException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; JAX-RPC要求WEB服务提供SEI，EJB容器同WEB服务交互时需要使用它。JAX-RPC规范要求SEI遵循如下规则：<br />
1、接口必须间接或直接继承java.rmi.Remote.<br />
2、所有的方法必须抛出java.rmi.RemoteException.<br />
3、方法参数和返回类型必须是JAX-RPC支持的JAVA类型。<br />
4、SEI中不能包含敞亮。</p>
<p>&nbsp;&nbsp;&nbsp; 在J2EE1.4平台中，可以对EJB技术进行了升级，使得无状态会话Bean可以直接部署为Web服务端点。这样，在J2ee1.4平台下，开发Web服务将更加简单。这样，EJB2.1中的无状态会话Bean可以有3种不同的客户端：本地接口的客户端、远程接口的客户端和web服务客户端。EJB的WEB服务客户端视图通过WSDL文档描述。<br />
&nbsp;&nbsp;&nbsp; 待续......</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/301660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-09 10:22 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/09/301660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(七) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/02/300753.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 02 Nov 2009 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/02/300753.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/300753.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/02/300753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/300753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/300753.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 会话Bean同其他企业Bean类型最主要的区别是生命周期的差异性。会话Bean实例是存活短暂的对象，会话Bean实例并不能够在多客户间共享。<br />
&nbsp;&nbsp;&nbsp; 通常，客户会话的持续期决定了使用中的会话Bean的存活期，一旦应用服务器瘫痪，会话Bean实例也应该不复存在。因为，会话Bean仅仅是内存对象，一旦其生存的周边环境遭到破坏，会话Bean也将不复存在。会话Bean并不是持久化的，因此，会话Bean并不会保存到持久化存储源中，这同实体Bean不一样，会话Bean能够操作RDBMS,但是其本身并不是持久化对象。<br />
&nbsp;&nbsp;&nbsp; 会话指客户同EJB组件的交互，它由客户和EJB组件间的多次方法调用构成。会话Bean存在2种子类型：有状态会话Bean和无状态会话Bean,各自用于建模不同类型的会话。有状态会话Bean是这样一种EJB,即其服务的业务过程能够延伸到多个方法请求或者事务中，为完成这种业务过程，有状态会话Bean需要为单个客户保存状态信息。如果在方法调用期间有状态会话Bean的状态发生改变，则这种改变必须反映到同一客户的随后调用中。无状态会话Bean是这样一种EJB,即其服务的业务过程只需要单个业务方法即可完成。由于他们不需维护客户多个方法调用间的会话状态，因此它是无状态的。在每次方法调用结束后，EJB容器可能会销毁无状态会话Bean实例，或者实例化新的实例，或者清楚掉上次方法调用中的相关信息。<br />
&nbsp;&nbsp;&nbsp; 无状态意指不存在会话状态。无状态会话Bean能够含有同特定客户不相关的状态信息，比如所有客户将使用到数据库链接工厂，开发者可以将它存储在private变量中。如果开发者将数据存储在private变量中，则将随时丢失其中存储的数据。<br />
&nbsp;&nbsp;&nbsp; EJB容器将维护EJB实例池，而且这些EJB实例是可重用的。在每次方法调用时，都会有不同EJB实例或同一实例服务客户。为了限制内存中运行的有状态会话Bean实例的数量，EJB容器需要将有状态会话Bean的会话状态保存到硬盘或者其他存储源中。该过程称之为挂起。在挂起有状态会话Bean后，会话状态被安全的保存下来，而且其释放的内存可以供其他应用使用。一旦被挂起的有状态会话Bean实例的客户再次调用它，被挂起的会话状态将重新回到有状态会话Bean实例中，该过程称之为激活。<br />
&nbsp;&nbsp;&nbsp; 有状态会话Bean实例的会话状态必须遵循Java对象序列化设定的规则。在挂起有状态会话Bean实例时，EJB容器借助于对象序列化将会话状态转换成二进制blob,然后将它写入到硬盘中。在转移会话状态信息后，有状态会话Bean实例(指刮起了会话状态的那些EJB实例)还能够服务于其他客户，即同新的客户进行新的会话过程。<br />
<br />
&nbsp;&nbsp;&nbsp; 一旦EJB中的成员变量符合如下条件，则可以认为它是会话状态的组成部分之一。<br />
1、成员变量是非transient类型的java原始类型。<br />
2、成员变量是非transient类型的Java对象类型。<br />
&nbsp;&nbsp;&nbsp; 当容器将EJB实例挂起时，它需要将实例的会话状态写入到二级存储源中，比如文件或者RDBMS中。通过调用EJB实例的ejbPassivate()回调方法，容器能够完成实例的挂起工作。借助于ejbPassivate()方法能够告知EJB实例：EJB容器需要挂起它，这使得释放其持有的资源成为可能。比如EJB实例可能持有的资源有：RDBMS连接、已打开的Socket和文件或者其他任何资源。<br />
&nbsp;&nbsp;&nbsp; 在实际场合中，客户调用了EJB对象中的某个方法，而当时在内存中暂时找不到该EJB对象，与此同时，EJB容器持有的企业Bean实例的个数已经到达了设定的上限。因此在处理客户请求前，容器需要挂起最近未使用的EJB实例，在挂起它后，容器才能够获得所需的EJB对象。<br />
&nbsp;&nbsp;&nbsp; 有状态会话Bean的部署描述符。<br />
&nbsp;&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ejb-jar&nbsp;</span><span style="color: #ff0000;">version</span><span style="color: #0000ff;">="2.1"</span><span style="color: #ff0000;">&nbsp;xmlns</span><span style="color: #0000ff;">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000;"><br />
&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br />
&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="http://java.sun.com/xml/ns/j2ee<br />
&nbsp;http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">enterprise-beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">session</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ejb-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Count</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ejb-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">home</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">examples.CountHome</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">home</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">remote</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">examples.Count</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">remote</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ejb-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">examples.CountBean</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ejb-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">session-type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Stateful</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">session-type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">transaction-type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Container</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">transaction-type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">session</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">enterprise-beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ejb-jar</span><span style="color: #0000ff;">&gt;</span></div>
<br />
服务端企业Bean:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.ejb02;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.rmi.RemoteException;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.CreateException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.EJBException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.SessionBean;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.SessionContext;<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;演示有状态Bean<br />
&nbsp;*&nbsp;它会初始化val,并提供业务方法。<br />
&nbsp;*&nbsp;该实例演示了最简单的有状态会话Bean,并给出了挂起、激活的工作机理。<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CountBean&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;SessionBean&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">会话状态</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">业务方法</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">count</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ejbCreate(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;CreateException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ejbCreate()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ejbActivate()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;EJBException,&nbsp;RemoteException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ejbActivate()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ejbPassivate()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;EJBException,&nbsp;RemoteException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ejbPassivate()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ejbRemove()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;EJBException,&nbsp;RemoteException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ejbRemove()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setSessionContext(SessionContext&nbsp;ctx)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;EJBException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemoteException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
客户端调用：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.ejb02;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Properties;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.naming.Context;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.naming.InitialContext;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.wyq.ejb01.HelloHome;<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;1、获得JNDI&nbsp;InitialContext上下文。<br />
&nbsp;*&nbsp;2、借助于JNDI,定义Home对象。<br />
&nbsp;*&nbsp;3、使用Home对象创建3个不同的CountEjb对象。因此，这将建立起3个不同的会话过程，而且模拟了3个不同的客户。<br />
&nbsp;*&nbsp;4、由于内存中仅能存活2个EJB实例，因此在创建Count&nbsp;EJB实例期间，EJB容器需要完成实例的挂起操作。<br />
&nbsp;*&nbsp;5、调用各个EJB对象的count()方法。<br />
&nbsp;*&nbsp;6、最后，删除所有的EJB对象。<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CountClient&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;客户代码示例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;此时，创建了3个EJB对象。但我们规定容器：在内存中最多存在2个实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;因为，能够看到挂起操作的发生。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获得JNDI环境属性<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;props&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;System.getProperties();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获得对Home对象的引用，Home对象是EJB对象的工厂<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;ctx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InitialContext(props);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ctx.lookup(</span><span style="color: #000000;">"</span><span style="color: #000000;">CountHome</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CountHome&nbsp;home&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">(CountHome)javax.rmi.PortableRemoteObject.narrow(obj,CountHome.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;能够持有3个Count对象的数组&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Count&nbsp;count[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Count[</span><span style="color: #000000;">3</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;countVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;创建EJB实例，并调用各自的count()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Instantiating&nbsp;beans<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">3</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;创建EJB对象，并初始化它们<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count[i]&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;home.create(countVal);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加1，并打印出来<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;count[i].count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(countVal);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;等待1/2秒<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">500</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;调用各个EJB对象的count()方法，从而能够浏览到EJB被挂起，并被成功激活<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Calling&nbsp;count()&nbsp;on&nbsp;beans<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">3</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加1，并打印出来<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;count[i].count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(countVal);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;等待1/2秒<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">500</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用完后，销毁它们<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">3</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count[i].remove();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
会话Bean的声明周期流程图<br />
1、起初，EJB实例并不存在。<br />
2、EJB容器将决定是否需要实例化新的EJB实例。容器将何时实例化新的EJB实例，取决于容器使用的EJB实例池策略。<br />
3、容器实例化EJB Bean类。EJB容器将调用Class.newInsatance("HelloBean.class");即动态创建HelloBean实例，这使得容器不会将EJBBean类的名字硬编码在Java代码中。最后，这使得容器更具通用性，能够操控任何企业Bean.<br />
4、容器调用setSessionContext()方法。这为EJB实例设置了上下文对象。最终，EJB实例将能够访问到EJB容器。<br />
5、容器调用ejbCreate().这将初始化EJB实例。由于无状态会话Bean的ejbCreate()方法并不存在参数，因此EJB客户不可能为它提供任何启动EJB实例的参数信息。<br />
6、EJB容器调用EJB实例的业务方法。对于EJB实例提供的所有业务方法，EJB容器都可以使用。由于所有EJB实例间不存在区别，因此完全不同的客户可以调用相同的业务方法。在业务方法调用结束后，各个无状态会话Bean实例依然是相同的，因此，EJB容器能够针对客户请求，在每个方法级将各个EJB实例指定给客户，即使同一客户对同一业务方法的多次调用，都可以由不同的EJB实例响应它，当然，将EJB实例指定给客户的具体实现策略取决于具体的EJB容器。<br />
7、最后，容器调用ejbRemove()方法。<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/300753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-02 16:35 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/02/300753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(六)</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/31/300464.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sat, 31 Oct 2009 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/31/300464.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/300464.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/31/300464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/300464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/300464.html</trackback:ping><description><![CDATA[为将企业Bean的中间件服务需求告知EJB容器，开发者还需生成部署描述符。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ejb-jar&nbsp;</span><span style="color: #ff0000;">version</span><span style="color: #0000ff;">="2.1"</span><span style="color: #ff0000;">&nbsp;xmlns</span><span style="color: #0000ff;">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000;"><br />
&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br />
&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="http://java.sun.com/xml/ns/j2ee<br />
&nbsp;http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-name&gt;:企业Bean的昵称。在部署描述符的其他地方能够引用它，供设置其他参数使用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;home&gt;:Home接口的全限定名。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;remote&gt;:远程接口的全限定名。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;local-home&gt;:本地Home接口的全限定名。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;local&gt;:本地接口的全限定名。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-class&gt;:企业Bean类的全限定名。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;session-type&gt;:标识企业Bean是有状态的，还是无状态的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;transaction-type&gt;:事务类型。<br />
&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">enterprise-beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">session</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ejb-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Hello</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ejb-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">home</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">examples.HelloHome</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">home</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">remote</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">examples.Hello</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">remote</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">local-home</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">examples.HelloLocalHome</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">local-home</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">local</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">examples.HelloLocal</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">local</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ejb-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">examples.HelloBean</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ejb-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">session-type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Stateless</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">session-type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">transaction-type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Container</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">transaction-type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">session</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">enterprise-beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ejb-jar</span><span style="color: #0000ff;">&gt;</span></div>
<br />
Ejb-jar文件：<br />
HelloWorld EJB组件准备好了之后只需将他们打包成Ejb-jar文件。手工创建jar文件<br />
jar cf HelloWorld.jar *<br />
<br />
注意：ejb-jar.xml文件必须放置在META-INF子目录中。当EJB容器初次打开Ejb-jar文件时，将在ejb-jar.xml中查找Ejb-jar所包含的EJB组件信息。<br />
<br />
如何调用EJB组件：<br />
目前，存在2类客户：<br />
1、基于Java RMI-IIOP的客户。这类客户使用JNDI,即通过网络查找对象。另外，它们使用JTA控制事务。<br />
2、CORBA客户。这类客户村寻CORBA标准。这对于使用其他语言访问EJB组件的客户而言，意义深远，CORBA客户使用CORBA命名服务，即通过网络查找对象。<br />
访问EJB组件的步骤：<br />
1、查找Home对象<br />
2、使用Home对象创建EJB对象<br />
3、调用EJB对象的业务方法<br />
4、销毁EJB对象<br />
<br />
查找Home对象：<br />
开发EJB应用的最主要目标之一是，应用代码能够"一次编写，到处运行".如果将已部署在机器A上的EJB应用迁移到机器B上，EJB应用代码不需要改动，因为EJB实现了位置透明性。<br />
借助于命名和目录服务能够实现EJB的位置透明性。命名和目录服务是能够在网络中存储和查找资源的产品。<br />
<br />
在企业部署场景中，EJB服务器使用命名服务存储位置信息，而这些位置信息是用于标识资源的，其中的资源涉及到EJB Home对象、企业Bean环境属性、数据库JDBC驱动、消息服务驱动和其他资源等。通过使用命名服务，应用代码不用将具体机器或资源名硬编码在代码中，这就是EJB所具备的位置透明性，它使得代码具有便携性。<br />
<br />
为实现位置透明性，EJB容器需要屏蔽掉Home对象的具体位置，使得EJB组件的客户代码感知不到其具体位置。客户不用将Home对象宿主的机器名硬编码于代码中。相反，使用JNDI就能够查找到Home对象。物理上，Home对象可以存在于网络上的任何地方，比如在运行EJB容器的同一进程地址空间中，其他机器上的EJB容器中。<br />
<br />
客户为定位Home对象，它必须提供企业Bean的Home对象的JNDI昵称。客户使用该昵称标识所需的Home对象。一旦将EJB组件部署到容器中，容器会自动将HelloHome昵称绑定到Home对象。因此，在对已部署EJB组件的物理机器位置不知情时，开发者能够在任一机器上使用该昵称查找到上述Home对象，借助于JNDI能够查找到它。JNDI能够在网络上查找命名服务，或在JNDI树中查找到Home对象，当然，Home对象也可能位于客户同一进程中，最后一旦找到Home对象，客户将获得对它的引用。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.ejb;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Properties;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.naming.Context;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.naming.InitialContext;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;客户代码实例，用于调用简单、无状态会话Bean中的方法。<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HelloClient&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;设置属性，用于JNDI初始化，从命令行读入属性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;props&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;System.getProperties();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;初始上下文是连接到JNDI树的入口。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;借助于环境属性，能够完成JNDI驱动、服务器的网络地址等的设置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;ctx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InitialContext(props);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获得对Home对象的引用。Home对象是创建EJB对象的工厂。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ctx.lookup(</span><span style="color: #000000;">"</span><span style="color: #000000;">HelloHome</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Home对象是RMI-IIOP对象。因此，需要借助于特殊的RMI-IIOP造型操作将它们造型成RMI-IIOP对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloHome&nbsp;home&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">(HelloHome)javax.rmi.PortableRemoteObject.narrow(obj,HelloHome.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用工厂，来创建Hello&nbsp;EJB对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello&nbsp;hello&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;home.create();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;调用EJB对象的hello()方法。它会将调用委派给EJB&nbsp;Bean类实例。一旦接收到响应结果，它便会返回。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hello.hello());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在使用完EJB对象后，需要销毁它。EJB容器负责销毁EJB对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hello.remove();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/300464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-31 12:36 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/31/300464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(五)</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/30/300330.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 30 Oct 2009 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/30/300330.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/300330.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/30/300330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/300330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/300330.html</trackback:ping><description><![CDATA[为创建和销毁EJB对象，开发者需要使用Home接口。Home接口的实现是Home对象，而Home对象由EJB服务器提供的工具生成。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.ejb;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.EJBHome;<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Hello&nbsp;EJB组件的Home接口。它由EJB服务器提供的工具实现。Home接口实现<br />
&nbsp;*&nbsp;称之为Home对象。Home对象充当了创建EJB对象的工厂。<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;在该Home接口中，存在create()方法。它对应于HelloBean中的ejbCreate()方法。<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;HelloHome&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;EJBHome&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;创建EJB对象，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;新建的EJB对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;Hello&nbsp;create()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;java.rmi.RemoteException,javax.ejb.CreateException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;1、为获得对EJB对象的引用，客户需要使用create方法。其中，create方法还能够完成<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;EJB组件的初始化工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;2、create方法抛出了如下异常：RemoteException和CreateException。由于Home对象是网络<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使能的基于RMI-IIOP的远程对象，因此要抛出RemoteException异常。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
}<br />
</span></div>
<br />
本地Home接口是Home接口的高性能版本。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.ejb;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.EJBLocalHome;<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Hello&nbsp;EJB组件的本地Home接口。它由EJB服务器提供的工具实现。<br />
&nbsp;*&nbsp;本地Home接口实现称之为本地Home对象。本地Home对象充当了创建EJB本地对象的工厂。<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;HelloLocalHome&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;EJBLocalHome&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;创建EJB本地对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;返回新创建的EJB本地对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;HelloLocal&nbsp;create()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;javax.ejb.CreateException;<br />
}<br />
</span></div>
<br />
<br />
创建企业Bean类<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.ejb;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.rmi.RemoteException;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.EJBException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.SessionBean;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.SessionContext;<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;演示无状态会话Bean.<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HelloBean&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;SessionBean&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;SessionContext&nbsp;ctx;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">EJB规范定义的方法</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ejbCreate(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ejbCreate()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ejbRemove()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;EJBException,&nbsp;RemoteException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ejbRemove()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ejbActivate()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;EJBException,&nbsp;RemoteException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ejbActivate()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ejbPassivate()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;EJBException,&nbsp;RemoteException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ejbPassivate()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;由于企业Bean宿主在受管容器中，因此容器能够在任何时候调用企业Bean的方法。但如果企业Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;需要查询容器的当前信息的话，需要为EJB提供何种信息呢？比如在EJB中，组件本身可能需要查询当前用户<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;的安全性凭证信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;容器将这些信息包含在称之为"EJB上下文"的对象中。EJB上下文对象是通往EJB容器的关口。其中，EJB上<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;下文是容器的组成部分，开发者能够在企业Bean中访问到它。因此，在某种程度上,EJB上下文是为企业Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;访问容器提供的回调。该回调有助于企业Bean探知其自身的状态，并修改他们。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;EJB上下文对于会话Bean、实体Bean、消息驱动Bean而言很有用。比如会话Bean含有会话上下文、实体Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;含有实体上下文、消息驱动Bean含有消息驱动上下文。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;依据EJB类型的不同，开发者能够分别通过调用setSessionContext、setEntityContext、setMessageDivenContext<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;方法设置EJB上下文信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setSessionContext(SessionContext&nbsp;ctx)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;EJBException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemoteException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.ctx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ctx;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">业务方法</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;hello(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">hello()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello,World!</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/300330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-30 13:01 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/30/300330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(四) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/30/300329.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 30 Oct 2009 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/30/300329.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/300329.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/30/300329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/300329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/300329.html</trackback:ping><description><![CDATA[首先开发远程接口，远程接口支持EJB组件暴露的所有业务方法。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.ejb;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.EJBObject;<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Hello&nbsp;EJB组件的远程接口<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;在客户同EJB对象交互时，需要使用这一接口。容器厂商会实现这一接口，而相应的实现对象<br />
&nbsp;*&nbsp;就是EJB对象。EJB对象会将客户请求委派给实际的EJB&nbsp;Bean类。<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;Hello&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;EJBObject&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;返回欢迎信息给客户。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;hello()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;java.rmi.RemoteException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;注意：远程接口继承于javax.ejb.EJBObject.其含义是：容器生成的EJB对象实现了远程接口(EJBObject)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;即javax.ejb.EJBObject接口中定义的各个方法。其中包括比较不同EJB对象的方法，删除EJB对象的方法等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;仅实现了单个业务方法,即hello().HelloWorld&nbsp;EJB组件的Bean类需要实现hello方法。另外，由于Hello<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;接口是RMI-IIOP类型的远程接口，因此必须抛出远程异常。这也是企业Bean类中hello方法签名同远程接口中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;hello方法签名的区别。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
}<br />
</span></div>
<br />
为访问EJB组件的业务方法，本地客户应该使用本地接口，而不是远程接口。<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.ejb;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.EJBLocalObject;<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Hello&nbsp;EJB组件的本地接口。<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;当本地客户同EJB本地对象交互时，需要使用这一接口。容器厂商会实现这一接口。<br />
&nbsp;*&nbsp;而相应的实现对象就是EJB本地对象。EJB本地对象会将客户请求委派给实际的EJB&nbsp;Bean类。<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;HelloLocal&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;EJBLocalObject&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;返回欢迎信息给客户,本地接口继承EjbLocalObject接口，并且不需要抛出RemoteException.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;hello();<br />
}<br />
</span></div>
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/300329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-30 13:00 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/30/300329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(三) </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/29/300193.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Thu, 29 Oct 2009 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/29/300193.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/300193.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/29/300193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/300193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/300193.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 由于EJB对象可以运行在与客户不同的机器上，因此客户不能够直接实例化EJB对象。EJB推崇位置透明性，因此从这个角<br />
<br />
度考虑客户不应该对EJB对象的位置信息进行关注。<br />
&nbsp;&nbsp;&nbsp; 为获得对EJB对象的引用，客户代码需要从EJB对象工厂中请求EJB对象。该工厂负责实例化EJB对象。EJB规范将这种工厂<br />
<br />
称之为Home对象。Home对象的职责主要有：<br />
1、创建EJB对象<br />
2、查找现有的EJB对象<br />
3、删除EJB对象<br />
&nbsp;&nbsp;&nbsp; 同EJB对象一样，Home对象专属于特定的EJB容器。Home对象含有容器特定的逻辑，如负载均衡逻辑、借助于图形化管理<br />
<br />
控制台追踪信息等。与此同时，Home对象也是EJB容器的组成部分，通过容器提供的工具能够自动创建它。<br />
&nbsp;&nbsp;&nbsp; Home对象是创建EJB对象的工厂。但是Home对象是如何实例化EJB对象的呢？为创建Home对象，EJB容器需要掌握这方面的<br />
<br />
信息。通过指定Home接口给容器即可完成这方面信息的注入。Home接口简单的定义了用于创建、销毁和查找EJB对象的方法。<br />
<br />
容器的Home对象实现了Home接口。<br />
&nbsp;&nbsp;&nbsp; 使用Home接口存在一个问题，即通过Home接口创建EJB实例速度很慢，而且，借助于远程接口调用EJB实例也是如此。当<br />
<br />
访问EJB对象时，通常会依次触发如下内容：<br />
1、客户调用本地存根<br />
2、存根将参数压包成适合网络传输格式<br />
3、存根借助于网络将参数传递给骨架<br />
4、骨架将参数解包成适合Java的格式。<br />
5、骨架调用EJB对象。<br />
6、EJB对象获得所需的中间件服务，如连接池、事务、安全性和生命周期服务。<br />
7、EJB对象调用企业Bean实例，Bean实例处理客户请求。<br />
从EJB2.0开始，客户能够通过本地对象(而不是EJB对象)快速、高效的访问企业Bean组件。具体过程如下：<br />
1、客户访问本地对象<br />
2、本地对象获得所需的中间件服务<br />
3、一旦企业Bean实例处理完客户请求，则将结果返回给本地对象，最终传回给客户。<br />
<br />
EJB对象指请求拦截器，远程接口指供请求拦截器使用的接口，Home对象指工厂，Home接口指工厂接口。<br />
本地接口存在的缺点:<br />
1、只在同一进程中有效。如在同一应用服务器中存在访问银行账号实体Bean的银行出纳会话Bean,如果EJB组件代码本身依赖<br />
<br />
于本地接口实现，则不能够通过远程访问到它。<br />
2、通过引用(传址)，而不是传值来marshal参数。<br />
<br />
部署描述符：借助于部署描述符文件，EJB组件能够声明其依赖的中间件服务。然后，EJB容器将通过部署描述符了解到组件<br />
<br />
待使用的中间件服务。<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/300193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-29 15:56 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/29/300193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(二)  </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/28/300067.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Wed, 28 Oct 2009 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/28/300067.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/300067.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/28/300067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/300067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/300067.html</trackback:ping><description><![CDATA[EJB技术有赖于2种重要技术的存在：Java RMI-IIOP和JNDI.EJB客户仅仅同其暴露的单一接口进行交互。其中暴露的接口<br />
<br />
和企业Bean本身必须遵循EJB规范。EJB规范要求企业Bean暴露若干所要求的方法，而这些暴露的方法是供EJB容器统一管理他<br />
<br />
们使用的，无论EJB组件部署在何种EJB容器中。<br />
&nbsp;&nbsp;&nbsp; EJB2.1规范定义了3种EJB组件类型。<br />
&nbsp; 会话Bean:会话Bean用于建模业务过程。即为完成某些任务而存在。<br />
&nbsp; 实体Bean:实体Bean用于建模业务数据。他们是数据对象。实体Bean是用于缓存数据库信息的Java对象。<br />
&nbsp; 消息驱动Bean:MDB类似于会话Bean,因为它们都是为完成某些任务而存在的。<br />
<br />
&nbsp;&nbsp;&nbsp; EJB组件是基于分布式对象构建的，远程系统能够调用分布式对象。当然，进程内的客户、进程外的客户及网络中的其他<br />
<br />
客户都能够与分布式对象进行交互。具体过程如下：<br />
&nbsp;&nbsp;&nbsp; 客户调用存根：即为客户端提供的代理对象。存根负责将网络通信屏蔽掉，这对于客户而言意义深远。存根能够使用<br />
<br />
Socket访问网络中的其他资源，其间将调用所需的参数构建成网络要求的调用格式。<br />
&nbsp;&nbsp;&nbsp; 借助于网络：存根能够实现与服务器端的骨架进行交互。骨架是为服务器端提供的代理对象。骨架负责将网络通信屏蔽<br />
<br />
掉，这对于分布式对象而言意义深远。骨架能够处理来自Socket的访问请求。当然，骨架还能够将存根构建好的参数转换成<br />
<br />
Java表示。<br />
&nbsp;&nbsp;&nbsp; 骨架将具体的客户调用委派给合适的分布式对象实现。因此，该对象将完成具体的访问请求，并将结果返回给骨架。依<br />
<br />
此类推，骨架将结果返回给存根，最后客户将获得分布式对象的响应结果(通过存根获得)。<br />
&nbsp;&nbsp;&nbsp; 重要：存根和服务器端实现的对象都实现了同一接口(称之为远程接口)。其意味着存根克隆了分布式对象的方法签名。<br />
<br />
调用存根中的方法的客户以为其自身直接调用了分布式对象，但实际情况是客户直接调用存根，而存根处理具体的网络访问<br />
<br />
工作。因此，这可以称之为分布透明性。<br />
&nbsp;&nbsp;&nbsp; 分布式对象是对如下几个协作对象的一种抽象：存根、骨架、实现的对象，单一的参与者不可能构成分布式对象。<br />
&nbsp;&nbsp;&nbsp; 分布式对象是很诱人的，因为开发者能够基于网络构建应用。在开发大型的分布式对象应用的时候，需要借助于中间件<br />
<br />
服务，如事务和安全性。<br />
&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; 远程对象：<br />
&nbsp;&nbsp;&nbsp; (1)、企业Bean的业务逻辑需要在Bean类中实现。EJB规范定义了企业Bean类待实现的若干接口。这些接口使得所有的企<br />
<br />
业Bean类能够暴露同一套接口。各种企业Bean的Bean类都需要实现javax.ejb.EnterpriseBean接口。<br />
&nbsp;&nbsp;&nbsp; 当然，EJB规范分别为会话Bean、实体Bean和消息驱动Bean提供了更专属的接口类型，<br />
<br />
SessionBean,EntityBean,MessageDriverBean.<br />
&nbsp;&nbsp;&nbsp; (2)、当客户使用企业Bean类的某实例时，它并不是直接调用Bean类的方法，EJB容器将拦截客户调用，然后委派给企业<br />
<br />
Bean实例。通过拦截客户请求，EJB容器能够自动操作隐式中间件服务。<br />
&nbsp;&nbsp;&nbsp; 因此，在客户和EJB组件间，引入了间接层，即EJB容器。引入的间接层将自身封装为单一的网络使能对象，即EJB对象，<br />
<br />
EJB对象正是请求拦截器。EJB对象是代理对象，它可以与网络、事务、安全性等进行交互。企业Bean客户调用EJB对象提供的<br />
<br />
方法，而不是企业Bean本身。因此，EJB对象必须复制企业Bean类暴露的业务方法。但是，自动生成EJB对象的工具是怎么知<br />
<br />
道业务方法的呢?答案是，通过企业Bean提供者提供的接口来实现，即远程接口。这个接口复制企业Bean类暴露的业务方法。<br />
<br />
EJB容器负责管理EJB组件，通过调用EJB组件提供的回调方法，EJB容器能够同EJB组件交互。这些回调方法仅供EJB容器管理<br />
<br />
EJB组件使用。<br />
&nbsp;&nbsp;&nbsp; EJB容器最为重要的一项工作是，提供EJB组件运行的环境。EJB容器宿主了EJB组件，从而供远程客户调用。因此，可以<br />
<br />
认为EJB容器充当了客户和EJB组件的中间人。EJB容器负责将客户连接到EJB组件，完成事务协调工作，提供持久化能力，管<br />
<br />
理EJB组件的声明周期及其他任务。<br />
&nbsp;&nbsp;&nbsp; EJB的远程接口还需复制企业Bean类的业务方法。一旦企业Bean客户调用业务方法，EJB对象将把调用操作委派给相应的<br />
<br />
Bean类。<br />
&nbsp;&nbsp;&nbsp; (3)、Java RMI-IIOP和EJB对象：javax.ejb.EJBObject继承于java.rmi.Remote.任何实现了Remote接口的对象都是远程<br />
<br />
对象，即能够从其他JVM中访问到它，这就是Java实现RMI方式。由于容器提供的EJB对象实现了EJB组件的远程接口，因此EJB<br />
<br />
对象也间接实现了java.rmi.Remote接口。EJB对象是具有完整网络功能的RMI-IIOP对象，供其他JVM或者网络中其他物理机器<br />
<br />
访问。实际上，EJB远程接口仅仅是RMI-IIOP远程接口，只不过它还遵循EJB规范罢了。<br />
&nbsp;&nbsp;&nbsp; 远程接口还必须遵从RMI-IIOP的参数传递约定。并不是所有的内容都能够跨越JVM传递的。方法中传递的参数必须是符合<br />
<br />
RMI-IIOP约定的有效Java类型，如Java原型、序列化对象和RMI-IIOP对象。<br />
&nbsp;&nbsp;&nbsp; 总之，EJB容器需要负责权衡资源管理和管理已部署EJB组件的生命周期。
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/300067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-28 15:39 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/28/300067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习笔记(一)</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299988.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Tue, 27 Oct 2009 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299988.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/299988.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/299988.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/299988.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; EJB组件技术吸收了企业级计算领域中各个方面的丰富经验和知识，比如分布式计算、数据库、安全性、组件驱动软件等。服务器端开发平台，即Java2平台企业版，企业Bean组件架构是J2EE的重要部分。<br />
&nbsp;&nbsp;&nbsp; J2EE是对概念、编程标准、技术革新的统称，即基于Java编程语言开发服务器端应用。借助于J2EE,开发者能够快速构建分布式、扩展性强、可靠的、便携性好、安全的服务器端应用。<br />
&nbsp;&nbsp;&nbsp; EJB，是基于Java的服务器端组件架构技术。在Java应用服务器提供商提供的分布式基础框架(比如，J2EE应用服务器)的基础之上，开发者能够快速、轻松的构建服务器端组件。EJB的重要设计初衷是保证应用能够在任一提供商提供的企业中间件服务上畅行无阻，而且其便携性、可重用性都是一流的。<br />
&nbsp;&nbsp;&nbsp; 分布式系统：通过将传统的大型应用系统分解成多层系统，这使得组成应用系统的各层相互独立，并且承担的职责各不相同。早先，在整个中间件领域至少存在50个应用服务器。起初，各个应用服务器分别以非标准、专有的方式提供组件服务。因此，它们对于组件服务的认识各不相同，而且对具体提供组件服务的方式都不尽相同。更不用谈组件同应用服务器的具体交互了。这样的结果是：一旦组件部署到某个应用服务器，则它就被锁定到该应用服务器上。这对于客户而言，是不希望看到的情景。<br />
&nbsp;&nbsp;&nbsp; 如果能够在不同ISV间达成共识，比如在应用服务器和组件间提供相同的接口，供开发和部署应用使用，则这将使得任何组件能够运行在任一应用服务器中。与此同时，组件也能够在不同应用服务器间实现热插拔，而且不用修改应用代码，甚至也不用重新编译组件本身。本书将这种共识称之为组件架构。<br />
&nbsp;&nbsp;&nbsp; 服务：就是一组提供具体业务操作功能的相关组件。SOA具有极强的独立性，这些SOA提供的服务能够同其他服务进行交互，而不管其实现方式和部署的目标平台如何。因此，将这些独立、松耦合的服务集成起来是很有现实意义的。<br />
&nbsp;&nbsp;&nbsp; SOAP:简单对象访问协议，SOAP是基于XML、应用级的协议，供分布式网络中交换信息使用。目前，SOAP支持2种分布式计算模型：面向RPC和面向文档风格的SOAP消息。<br />
&nbsp;&nbsp;&nbsp; Web服务为那些分布式、松耦合SOA应用场合提供了强有力的解决方案。借助于WSDL能够描述WEB服务；借助于SOAP能够访问到WEB服务。<br />
&nbsp;&nbsp;&nbsp; EJB仅仅是J2EE的组成部分之一。其中，J2EE平台规范是由JCP指定。J2EE平台规范的使命是，提供平台独立的、便携的、多用户的、安全的、遵循标准的企业级平台。而且，它必须基于java和在服务器端部署。<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/299988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-27 22:52 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>