教程java开发技术ejb入门_第1页
教程java开发技术ejb入门_第2页
教程java开发技术ejb入门_第3页
教程java开发技术ejb入门_第4页
教程java开发技术ejb入门_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

服务框EJB并不是一个产品。Java服务器端服务框架的规范,软件厂商根据它来EJB服务器。EJB规范详细地解释了一些最小但是必须的服务,如事务,安全和名字等。软件厂商根据这些规范要求以保证一个enterprisebean能使用某个必需的服务。规范并没有说明厂商如何实现这些服务。这使得通过阅读规范来学习EJB更加,因为它允许厂商在不牺牲服务的可移植性的前提下来提供一些增强功能。JavaBeans和EnterpriseJavaBeans是Java的组件模型。在JavaBeans规范中定义了和属性等特征。EnterpriseJavaBeans定义了一个JavaEnterpriseJavaBeans件模型和JavaBeans组件模型是不同的。JavaBeans重点是允许开发者在开发工具中可视化的组件。JavaBeans规范详细地解释了组件间登记、传递、识别和属性使用、定制和持久化的应用编程接口和语意。EnterpriseJavaBeans的侧重点是详细地定义了一个可以portably地部署Java组件的服务框架模型。因此,其中并没提及,因为enterprisebean通常不发送和接受。同样也没有提及属 属性定制并不是在开发时进行,而是在运行时(实际上在部署时)通过一部署描述符来描述不要寻找JavaBeans和EnterpriseJavaBeans之间的相似性。他们都是组件模型规范,但是前者说明了开发工具中应用程序组装的问题,而后者则侧重于部署组件的服务框架的细节。不要错误地认为JavaBeans是用于客户端的开发,EnterpriseJavaBeans是用于服务器端的开发。JavaBeans也可作为进行非图形化服务器端Java应用开发的组件模型。区别是当你使用JavaBeans创建服务器应用时,你还得设计整个的服务框架。用EnterpriseJavabeans框架是现成的,你只需遵守它的APIs.对于复杂的服务器端应用程序,显然使用EnterpriseJavaBeans新开发更简单。EnterpriseJavaBeans系结EJB服务器是管理EJB容器的高端进程或应用程序,并提供对系统服务的。EJB服务器也可以提供厂商自己的特性,如优化的数据库接口,对其他服务(如CORBA服务)的,对SSL3.0的支持等。一个EJB服务器必须提供对可JNDI的名字服务和事务服务支持。一些可能的EJB服务器的例子如:·数据库服·应用服务·中间件服EJB容器是一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类所现在没有EJB服务器和EJB容器间接口的规范。因为目前容器通常由EJB服务器来提供,所以一旦接口标准化了,厂商就可能提供可以在任何兼容的EJB服务器上运行的容器。Home接口列出了所有定位、创建、删除EJB类实例的方法。Home对象home接口的实现。EJB类开发者必须定义home接口。容器厂商应该提供从home接口中产生home对象实现的方接口(remoteinterface)列出了EJB类中的商业方法。EJBObject实现接口,并且客户端通过它EJB实例的商业方法。EJB类开发者定义接口,容器开发商提生相应的EJBObject的方法。客户端不能得到EJB实例的,只能得到它的EJBObject实例的。当客户端调用一个方法,EJBObject接受请求并把它传给EJB实例,同时提供进程中必要的包装功能。客户端应用程序通过home对象来定位、创建、删除EJB类的实例,通过EJBObject来调用实例中的商业方法。客户端可以Java来编程JavaRMI来home对象EJBObject,或用其他语言编程并通过CORBA/IIOP,使得部署的服务器端组件可以通过CORBA接口来。上图是EnterpriseJavaBeans体系结构的一个描述。下一节详细讨论了每个组件的细Home个或多个用来创建enterprisebeancreate()方法。这个home接口不是由bean来实现,而是通过称为homeobject的类来实现。一个homeobject的实例在服务器中实例定位homeobject一个homeobject的被放在名字服务中,客户端能通过JNDI它。EJB服务器一般提供某种名字空间的实现,虽然有时可以使用外部的名字空间。在端的applet可能接收名字空间和JNDI上下文类作为applet的参数。homeobject.这些必须在客户形式指定名字树,如ejb/accounting/AccountsPayable.客户端必须获得这个完整的路径名来定位并获得AccountsPayablehomeobject的。并不是说客户端通过JNDI获得容器。客户端使用JNDI查找home接口的实现。Home接口的实现由某个特殊的container来提供,但这是该容器厂商的细节,enterprisebean开发者和客户端应该忽Home接口中的方Enterprisebean开发者定义ejbCreate()方法的同时必须在home接口中与其相应的create()方法。实体bean可以包含finder方法以使得客户端能定位已有的实体bean.Home接口是通过继承javax.ejb.EJBHome来定义的。该接口包含如下的方法:publicinterfacejavax.ejb.EJBHomeextendsRemotepublicvoidremove(Handlehandle)throwspublicvoidremove(ObjectprimaryKey)throwspublicinterfacemyHomeextendsEJBHomepublicmyRemcreate()throwsRemoteException,CreateException;publicmyRemcreate(Stringstr)throwspublicinterfacemyRemextendsEJBObject{…EJB规范时容器这个术语并不应从字面上简单地理解为类,而是一层代明而不暗示特殊类的服务需求。支持enterprisebeanEJBObject和容器类都由容器开bean方法的事务属性。然而,这些商业方法通过EJBObject调用。EJBObject必须与容器通讯来确定调用商业方法的事务上下文。确定以后,EJBObject在调用商业方法以前建立事务上下文。重要的是EJBObject和容器的协同工作来实现容器目前厂商提供工具来读home接口并产生作为容器的homeobject.在这种情况下厂商对每个enterprisebean类使用不同的容器类。容器厂商可以使用其它的实现策略,如一homehomeobject实现。唯一的必要条件是容器厂商必须使客户端能通过JNDIhomeobject.客户端和bean开发者都不需关心容器和homeobject的实现细节。Enterprisebean是开发者编写的提供应用程序功能的类。开发者可以选择创建bean或实体bean,通过实现不同的接口其部署描述符来加以区分。对于会话bean:publicclassmyBeanimplementsjavax.ejb.SessionBean客户端不会直接enterprisebean中的任何方法。客户端通过EJBObject间接调用方法调用创建一个新的事务上下文,当方法返回到EJBObject时提交或回滚事务。stubskeleton.beanstubskeletonbean不会通过网络被。EJBObject是真正的网络对象。Bean是包含应用相关的商业编码的代表。beanbean实例生成后,homeobject中的create()的任何参数会传递bean相应的ejbCreate()方法。Enterprise详述会话和实体bean的章节中会cover.Remote编写完enterprisebean后开发者创建了一个客户端可创建方法的homeinterfacehomeinterfacecreate()bean中都必须有一个object.Remoteinterface中列出的方法名和signature必须bean的方法名和signature相同。这不同于homeinterface--方法signature是一样的,而名字却不同。publicinterfaceAccountextendsjavax.ejb.EJBObjectpublicvoiddeposit(doubleamount)throwsRemoteException;publicvoidwithdraw(doubleamount)throwsRemoteException;publicdoublebalance() throwsRemoteException;}兼容的。但这并不意味着排除了用其它的传输方式的stub/skeleton实现,如EJBObject是网络上可视的对象,包含stub和skeleton,作为bean的。Bean的remoteinterfaceEJBObjectEJBObjectremoteinterface,beanEJBObjectbeanEJBObject类。EJBObjectbeanremoteinterfacepublicinterfacejavax.ejb.EJBObjectextends{publicEJBHomegetEJBHome()throwsRemoteException;publicObjectgetPrimaryKey()throwsRemoteException;publicHandlegetHandle() throwsRemoteException;publicvoid remove()throwsRemoteException,RemoveException;publicbooleanisIdentical(EJBObjectother)throws}interface.注意bean本身不是一个remoteobject,在网络上是不可视的。当容器实例厂商的实现是EJBObject实例和bean实例的一对一关系。因为remoteinterface包EJBObjectbeanremoteinterface,bean安EJBObject的源代码,这些产生的源代码实现了beanremoteinterface.典型的EJBObject有一个独特的类名,作为EJBObject类和bean的联系。会话bean是一种通过homeinterface创建并对客户端连接专有的enterprisebean.会话个公共的购货车中加私人的货物。定义一个会话bean{publicvoidejbActivate()throwsRemoteException;publicvoidejbPassivate()throwsRemoteException;publicvoidejbRemove()throwsRemoteException;publicvoidsetSessionContext(SessionContextthrows}会话bean的交换容器开发商可以实现把会话bean的实例从主存移到二级中的交换机制,这可以增加活动状态时间达到这个阙值,容器就把这个bean拷贝到二级中并从主存中删除。容器可以使用任何机制来实现bean的持久性。最常用的方式是通过bean的串行化。Beanbeantransientfields。EjbActivate()ejbPassivate()过程,活化--把bean恢复到主存中去的过程。在SessionBean接口中的EjbActivate()和ejbPassivate()方法,允许容器通知已经被活化的bean它将要被统资源。一个可能的例子是数据库连接,作为有限的系统资源,不能被钝化的bean使transient.transient可能是不安全的,因为串行化机制自动地把值设为null或0。而通过ejbActivate()和ejbPassivate()方法时该行为会发生改变。如果容器不提供交换,那么这些方法将不会被调用。时,它通知容器需要活化的bean.当活化完成时,EJBObject对bean的方法调用。beanbean放在主存中更有效率,因为事务么这些方法可置空。在大多数情况下,bean开发者不必在这些方法中做任何事。调用间不任何状态信息的bean。通常,会话bean的优点是代替客户端状态。然而,让会话bean无状态也有一个好处。无状态bean不能被钝化。因为它不状态,所以没有需要保存的信息。容器可以删除bean的实例。客户端不会知道无状态bean的删除过程。客户端的是EJBObject.如果客户端稍后又调用了一个商业方法,则EJBObject通知容器在实例化一个新的会话bean.因为没有状态,因此也没有信息需要恢用间不能状态,因此从技术上讲在homeinterface的create()方法不应有参数。在创建时向bean传递参数意味着在ejbCreate()返回时需要bean的状态。而且,经由EJBObject调用商业方法的结果使得容器必须能重创建一个无状态的bean.这时在开始创bean时的参数就不存在了。厂商的安装工具应该能检查homeinterface的无状态bean以保证其不包含带参数的create()方法。bean中还可以考虑包含厂商的增强功能,如对象--关系映射的集成。cache并减小旧数据bean,应用程序开发者(客户端开发者)EJB删除了。因此,一般不把删除作为实体bean生命周期的一部分。创建一个实体bean意味着一个记录进数据库中。与删除操作类似,创建操作通常也实体bean生命周期的一部分客户端实体bean需要先找到它。publicinterfaceAccountHomeextendsEJBHomepublicAccountfindByFirstLast(Stringfirst,StringthrowsRemoteException,FinderException;publicAccountfindByAccountNumber(StringacctNum) }的的PublicclassmyEntityBeanimplementsEntityBean…publicObejctejbFindByFirstLast(Stringfirst,Stringlast)//runsappropriatesingletonSELECT//returnsprimarykeyforselected}publicObejctejbFindByAccountNumber(StringacctNum)//runsappropriatesingletonSELECT//returnsprimarykeyforselected}}的参数。注意homeinterface中的finder方法向客户端返回一个对EJBObject的。BeanFinder方法向容器返回一个唯一的标识符,称为主键。容器用这个主键实例化一选定的记录的EJBObject。不论如何实现finder方法,容器都用这个主键代表这个选finderSELECTbeanfinder方法返回一个主键的枚举类Homeinterface的Finder方法定义成向客户端返回EJBObjectPublicinterfaceAccountHomeextendsEJBHome…public }publicclassmyEntityBeanimplementsEntityBean…public Name)//runsappropriateSELECT//returnsanEnumerationofprimary}}bean例的主键保存在EJBObject中。EJBObject.容器也可以初上调用商业方法时再实例化bean,以节省内存资源。经存在。如果该主键的EJBObject已经存在,那么容器不会创建一个新的个记录只有一个EJBObject的实例,所有的客户端共享EJBObject.主键只是在该类中唯一地标识bean的实例,容器负责保证其范围。应该明确finderbean的实例,只产生包含该主键的Homeobject保证客户端可以以下方法:publicmyRemfindByPrimaryKey(Obejctkey)throws⋯;EJBObject提供以下方法的一个实现:PublicObject{publicvoidejbActivate()throwsRemoteException;publicvoidejbPassivate()throwsRemoteException;publicvoidejbRemove()throwsRemoteException,RemoveException;publicvoidsetEntityContext(EntityContextctx)throwsRemoteException;publicvoidunsetEntityContext()throwsRemoteException;publicvoidejbLoad()throwsRemoteException;publicvoidejbStore()throws}态实体bean时只会删除它。但是因为容器调用finder方法需要的实体bean,容器可能为此把不活动的实体bean钝化到一个私有内存池中。一旦从EJBObject中删除实体bean.beanEJBObject重用。容器可以可以不任何有EJBObject的实体bean,除非有一个商业方法在通过EJBObject被调用。如果实体bean在事务中则需保持其与EJBObject的关联。因为实体bean代表底层的数据,因此我们需要把数据从数据从数据库中取出然后放在beanejbLoad()方法。在这个方法中开发者必须提供从数据库中取出正确的数据并把它放在bean中。当容器将要提交一个事务它首先调用bean的ejbLoad(方法完成时,benbenejbLoattnn方法。这个方法现在运行在事务上下文中。这个事务上下文传递给数据库,根据部署描述符中指定的孤立性级别,这个事务锁定数据库中被的数据。时,容器首先调用bean的ejbStore()方法,把bean中的数据回写到数据库中。ejbLoad()ejbStore()bean和数据库间的同如果部署描述符bean使用容器管理的持久性,则不用ejbLoad()和ejbStore()来访beanejbStore()方法来完成把数据回写到数据库中。这些方法实际上没有执行任何数据库操作。当开发复杂的工具来提供容器管理持久性时,如自动产生能进行对象--关系bean类,规范规定了厂商必须提供的容器管理实体持EJB开发者来说是非常好的服务,且不需对象--关系影射等其的,甚至在不同EJB平台间也是可移植的。Enterprisebean的行为控制整以保证适当的用户能在运行时使用bean.其它属性,如事务信息,有可能完全由开发的部署描述符放在一个jar文件中并和enterprisebean类一起送到部署环境。部署者读来安装enterprisebean.描述这个bean的描述符。·accesscontrollistDeploymentDescriptor有两个子类:DeploymentDescriptor中指定·Methodobjecttowhichthisdescriptor部署一个enterprisebean时,分配对应的描述符,然后初始化,串行化,再将其与enterprisebean类一起放入到一个jar文件中。不同厂商在定义部署描述符时可能有不EJBJarenterprisebean,beanjar文件中。这个jar文件必须有一个manifest文件的以一个enterprisebean的部署除了定义enterprisebean,还提供jar文件中所有文件的完整描述。开发者不必关心有必须的文件打包进一个jar文件中。CORBA 同意提交,第二阶段才会开始。事务管理器发送独立的提交操作令。OTS如何工作,我们需要先看看其关键部件。以下的部件可以直接地映射到EJB,而理解这些部件如何在OTS中工作能使我们更好地理解EJB中的的Resource对象都适用。Control对象代表一个事务。从该对象我们可以得到CoordinatorTerminatorEJBControlbean用Control对象来管理事务。当一个bean方法返回且该方法在部署描述符中在方法返回前需提交该事务时,容器也用Terminator来提交或回滚事务。提交或回滚事务时,所有事务中的对Resource。应用的锁级别会在部署描述符中指定。这个对象的完全的方法显示这Resource不同,它并不参与两段提交协议,所以无权表决一个事务应该提交还是回滚。在事务中它扮演一个的角色。Coordinator是使这一切工作起作用这个对象。Transaction-awareobjectsthatareintendedforusewithEJBwilltransparentlyobtainareferencetothecurrenttransaction'sCoordinatortoregisteritself.Resources)enterprisebeanbean在容器试图提交或回滚之前可以有权表决回滚一个事务。在EJBContextBeanCoordinatorrollback_only()方法作为SessionSynchronizationbean有关一个事务的结果。bean的部署描述符包含一个ControlDescriptor对象的数组。每个身的方法不能其事务属性。容器这些控制值来bean的相应的事务你可以通过厂商提供的创建部署描述符的工具bean设置合适的该方法不应运行在事务上下文中。如果在一个事务中执行线程,那么这个事务将挂起直到线程从方法中返回。该方法不需要事务,运行该方法时线程可能有一个活动的事务该方法必须运行在事务中。如果线程已经有一个事务,则这个线程允许进入此方法。如果线程没有事务,则容器代表线程启动一个允许线程进入的事务,当线程返回是终止事务。一般应提交事务。如果现成调用不论线程是否有一个事务,容器都会在方法调用期间创建一个事务。当线程返回时,容器提交或回滚这个事务。如果线程有一个进行中的事务,则新事务会挂起直到线程返回或方法的事务当调用这个方法时线程必须已经在一个事务中。如果线程没有事务,则容器会抛出一个例这个与上述几个不同。这种方法表明容器不应在事务管理中起作以作为其它服务的接口。对于事务控制方式为自管理的bean,可以通过这个如下是UserTransaction接口的定义publicinterface{publicvoidbegin()throwsIllegalStateException;publicvoidcommit()throwsPublicvoidrollback()throwsPublicvoidsetRollbackOnly()throwspublicvoidsetTransactionTimeout(intseconds);publicintgetStatus(); }务控制应用于单个的方法时这个控制只能应用于整个的bean.bean事务服务的能力Bean分别通过初始化时setSessionContext()或setEntityContext()方法的参数SessionContext或EntityContext来事务服务。这些接口都是EJBContext的子类。EJBContext的定义如下:Publicinterface{publicIdentitypublicEJBHomegetEJBHome();publicPropertiespublicbooleangetRollbackOnly();publicvoidset}一旦bean获得了一个UserTransaction的,就可以用这个管理自己的事务nnnbean.n在事务中且执行不同事务上ben,nn出一个例外。Leavingatranactionactiveacrossmethodcallsisstateful,andisnotallowedforstaesssessionbeans.Frosimilarreasons,entityarealsonotallowedtomaintainanopentransactionstateacross中执行它的任务,bean开发者可以实现在bean中实现 接口。容器能自动检测这个接口,容器会使用areimplicitlytransactionaware,所以容器使用不同的方法控制一个事务中的实体SessionSynchronization接口定义如{publicvoidafterBegin()throwsRemoteException;publicvoid public pletion(booleanyn)throws}个会话bean,容器首先调用它的afterBegin()方法。Bean可以记录所有的商业方法运行则会执行事务操作的请求。直到调用 pletion()方法,bean会继续认为商 现它将要提交一个事务时,将在这个事务的所有的sessionBean上调用据写入数据库。反之,当Container发现,将要回滚一个事务撕, 方法将不会被调用,因为将一个将被回滚的产生的数据写入数据库是没有意义pletion()是在一个事务即将提交或回滚时被调用,来通知Bean事务操作的最它将要保存的事务。尽管sessionBean可以创建,提交和回滚它自己的事务,但通常不推荐这样做。SessionSynchronization接口不提供整合外部和内部事务的能力。如果一个sessionbean实现了这个接口,则意味着它在方法调用之间要保持事务的状态。特别地,这也暗示在afterBegin()和 pletion()调用之间bean是处于一个事务中。这样,如果一个bean实现了SessionSynchronization接口并且在装配符中是无状态无状态的sessionbean可以加入一个事务,但它们不能实现这个接口。事务可以是解决这个问题的一个方法是使container挂起现存的事务,强迫方法总是认为线程没有 接口面的一节中已经介绍了。其中有两个方法publicvoidsetRoolbackOnly();beanbean将不会用到这些方法,因为这些方法不是用当一个bean调用了setRollBackOnly()方法时,它是在向事务管理器询问何时结束将要UserTransaction接口中,但由于大多数的bean都不这个接口,这些方法必须直接这样,以使得一个bean不能够改变另一个bean的回滚请求。bean也许希望使用getRoolBackOnly()方法,来检查当前的事务的状态。如果另一JEB厂商所必须的,大服务器厂商也许决定提供一个类,使得用户可以直接访会希望这样做。当然,每个bean的装配符可以允许这样的行为。用户可以创建一个事作为调用的一部分进行传递。一旦调用结束,用户将推测地结束事务。有container厂商产生的stub和skeleton将支持事务上下文的隐式传递。Currentcurrent=newCurrent();Container的角色是决定在这个事务中执行的所有行为应该提交还是回滚。这里提这样container式地管理。尽管可以在这种情况下使用非事务感知的JDBCDriver,但开发者必须清楚bean的事务,开发者还必须确保在从方法返回之前结束数据库连接事务。试图使用SessionSynchronization接口来合并数据库连接事务和bean本身的事务是不可靠的,是不应该作的。.serverbean.EJBObjectstubskeleton来隐式地获得当前事务的上下的EJBObject的skeleton必须请求这个事务的上下文。今天终于开始我们的EJB了。我会带着大家一点点的学习EJB的开发、使用以及Java开发人员来说,EJB是一个小的关口,因为它比单纯的开发java、servlet、JSP了几分系统设置上的麻烦,同时需要你更先要去了解更为广泛的知识后才能好的利用它。好了,我们就开始我们的又一次EJB学习品罢。sunJ2EE系统(J2EE设置上有什么问题,可以去参见本人的代码人生之学习品中的《J2EE使用指南》的文章J2EE中的一个最简单的例使用的编辑和make工具是JBuilder不过你也可以使用手动来用javac将java文件编译成为.classJbuilder来开发相关的程序,哪么请在Project中加入一lib,它包含J2EElibj2ee.jar文件。并且在我Projectlibjavac以命令行方式来进行编译,哪么请在你的CLASSPATH中加入上面这个jar文件。JbuilderejbtestProject(注意要J2EElib加入到工程中来。然后我们会加入Converter.java(实现接口的工作)、ConverterHome.java(实现Home接口工作)、ConverterEJB.java(EJB实体文件 EJBTest Copyright(c) Code<p>@author@versionpackageimportjavax.ejb.EJBObject;publicinterfaceConverterextendsEJBObjectpublicdoubledollarToYen(doubledollars)throwsRemoteException;publicdoubleyenToEuro(doubleyen)throwsRemoteException;}ConverterHome.java文件 EJBTest Copyright(c) Code<p>@author@versionpackageimportjavax.ejb.CreateException;importjavax.ejb.EJBHome;publicinterfaceConverterHomeextendsEJBHomeConvertercreate()throwsRemoteException,}ConverterEJB.java文件 EJBTest Copyright(c) Code<p>@author@versionpackageimportjavax.ejb.SessionBean;importjavax.ejb.SessionContext;publicdoubledollarToYen(doubledollars)returndollars*}publicdoubleyenToEuro(doubleyen)returnyen*}publicConverterEJB(){}publicvoidejbCreate(){}publicvoidejbRemove(){}publicvoidejbActivate(){}publicvoidejbPassivate()publicvoidsetSessionContext(SessionContextsc)}好,一切都正常,哪么我们来编译它。如果出现了什么Error#:302cannotaccessclassjavax.ejb…..这样的错误,哪么就说明你没有将EJB的相关jar文件的lib加入到工程中来。如果正确,哪么你就可以在工程的bin中得到相应的三个class文件了。classJ2EEEJB服务器中。我们先来将这三个class文件打包成Converpp.ear文件。J2EEServerj2ee–verbosej2ee也提供了一个叫做deploytool的开发工具来帮助开发人员部属EJB。要启动这个开发工具,在动ApplicationDeploymenttool。ApplicationFileNameConverpp.ear(我在它之前还写入了文件路径。同时可以在框中写入这个Application的注释,如下图所示:OKApplicationearFile-NewEnterpriseBean来构建系统所使用的EJB的jar文件。启动后会出现一个框说明这个向三个class文件:这里RootDirectory选择到工程的bin ,将光标放到ejbtest 上,点击add就Interface下拉框中选择ejbtest.ConverterHome、在RemoteInterface下拉列表框中选择ejbtest.Converter。中时在BeanType中点中Session和Staess。在EnterpriseBeanDisyName中写入你想要让它显示的名称如下图:NextFinish就可以了。这时系统就EJBJARConverppJNDInamesTab,ConverterBeanComponent/ReferenceName。我们在其后的菜单中的Tool-DeployApplication项。就会出现DeployConverpp-Introduction框。启动了J2EE服务器,所以现在我们可以直接就发布。但我们还将下面的ReturnJar localhost主机名,就会在ServerApplications列表里出现Conver pp名字了。这就说明Application正确的发布到了服务器中了。程序就试一下,一般是不会有什么问题的。在下一讲中来说明客户端程序的编写。在上一讲,EJB通过ApplicationDeploymentTool发布进了J2EE服务器中去。JNDIJNDI是通过什么来Home接口呢?哪再来理一下,首先,我们通JNDInameJNDI来得到一Home接口。再通过这个Home接口中的creat方法来得到一个Bean的实例化对象。以下为这段程序的代码:我们新建一EJB 的工程,在这个工程中我们加入一Converter.java文件,同时在工程中加入J2EE的lib,并且更增加一个lib,这个lib指向我们在上一讲中使用ApplicationDeploymentTool生成的Converpp.jar文件。这里包括了EJB在客户端所使用的库文件。以下是Converter.java文件代码: Test Copyright(c) Code<p>@author@versionpackageejbimportjavax.naming.Context;import//了EJB及EJB在Home的接importejbtest.Converter;publicclassConverterpublicstaticvoidmain(String[]args)try//创建一个JNDInamingcontestContextinitial=newInitialContext();//从JNDI中以MyConverter名子来定位到对象(我们在发布时指定了这里能定位的JNDI的名称)Objectobjref=ConverterHomehome=ConvertercurrencyConverter=doubleamount=currencyConverter.dollarToYen(100.00);amount=currencyConverter.yenToEuro(100.00);}catch(Exceptionex)System.err.println("Caughtanunexpectedexception!");}}}javaJbuildermake工程一次。这样就会得到Converter.class文件。在运行前我们要设置一下Jbuilder的工程,在Project-ProjectProperties…的ProjectProperties框中的RunTab中设置Application的MainClass为Converter。java.lang.ClassCastExceptionProjectlib中加入了对Converpp.jar包的。另外你一定要确认你在工程中使用的JNDIname是否与你在程序中使用的名称一样。通常出现问题就在这点了。EJB的程序。实际上很简单,不是吗?我们会在下一讲中来讲讲EJB实施的原理。我在大多数的中都看到的是将理论放在最开始的地方,EJB有一个深入的认识。我们在下一讲中来依照我们刚完成的实例理解一下EJB的部属和使用。在我们使用EJB的过程中,难免会碰到EJB调用这个问题。下面就在学习EJB的过程中所总结的一些经验解释一下EJB调用,如果有什么不对的地方,欢从原理上来说,要调用机器上的首先得指定机器的IP地址和端口,这里我们假设机器的IP地址,端7001namingproviderWeblogic就使用自己的特殊的namingprovider,那么你还需要指定namingfactory,Weblogic的namingfactory叫做weblogic.jndi.WLInitialContextFactory再次,如果你还考虑到安全性,那么你还得指定用户和,这里假设用户名javaonline,12345以使用下列4种方法中的任何一种:在Java.exe-D来指定系统属性:----2Sperties,1是一样的,只不过不是在程序中3HashtableInitialContextContextctx=Hashtableht=newHashtable();tryctx=new//Usethecontextinyour}catch(NamingExceptione)//afailure}finallytry{ctx.close();}catch(Exceptione)//afailure}}4WeblogicEnvironmentInitialContextEnvironmentenv=newEnvironment();Contextctx=附:在Weblogic中调用Weblogic服务器启动的时候加参数就可以了,对其他服务器原理上startWebLogic.cmdsetServerPort=7001setsetPassword=SetEJB_Option=%EJB_Option%-Djava.naming.security.principal=%User%Weblogic --.-Djava.security.manager-Djava.security.=.\weblogic.为 --%EJB_Option%【axeon2000-08-3014:11:19java?:关于ejb()EJB最大的之处是她把应用程序和服务器分开了,EJB的实质EJB是BEANS,BEANS是什么概念,那就是得有一个容纳她这个容器可是功能强大之极!她首先要包装你BEAN,EJB的客户程序实际上从来就不和你编写的EJB直接打交道,他们之间是通过HOME/REMOTE接口来的.它负责你的BEAN的所有的吃喝睡,BEAN的持续化,安全性,事务管理...EJB服务器新了EJB容器,或者叫EJB服务器.它很好的和J2EE的HTTP服务器和Servlet引擎一起构筑了功能相当强大,是很多构筑的理想WEB服务器,它也已经加入了EJB的行列,在EJB方面有着不俗的表现.InpriseIAS更是一个功能强大的WEB服务器,同样,也嵌入了还有象IBM的WebSphere也不错,另外,推荐一个EJBoss,是一个完全免费的EJB服务器,而且是原代码公开的EJB容器如何包装你的这年头没有天上掉馅饼的好事情,EJB也不例外比如我的EJB的HOME接口和REMOTE接口是哪一个类,总之,EJBEJB容器把所有都交代清楚.这样,剩下的,就看EJB容器的了!!!当你DEPLOY他们时,容器会首先根据HOMEREMOTE接口生成他们的实现代码,然后,RMICHOME_IMPLREMOTE_IMPL(STUB和SKELETON请参见RMI的相关概念)7文件,EJB工作起来生成实体EJB对应的数据库的库为什么除了写BEAN,还得写接口文件,而且干嘛要HOME和REMOTE两个接口什么意思?说开了吧,HOME用来规范容器相关的操作方法,举例说明HOME接口就是我们家人令,我们家人令决定了我如何吃喝睡,EJB的分EJB分为实体(Entity)EJB和EJB根本根本不和数据库打交道,为什么,因为他根本不用序列化!a.有状态(sessionful)EJB而且他仅仅被一个用户的一次session所使用,不和别人共享,我管他叫,不过这""翻出b.无状态(sessionless)EJBBEAN管理持续化的实体EJB(BMP)说了半天了,大家珍贵的脑资源恐怕被我消耗的差不多了好,让我们来剖析一个BEAN管理持续化的实体EJB(BMP)吧file://这些都是商业方法,而且这里写了的,必须在BEAN中都实现publicvoiddeposit(doubleamt)throwsRemoteException;publicdoublewithdraw(doubleamt)throwsAccountException,RemoteException;publicdoublegetBalance()throwsRemoteException;publicStringgetOwnerName()throwspublicvoidsetOwnerName(Stringname)throws}HOMEpublicinterfaceAccountHomeextendsEJBHomeAccountcreate(StringaccountID,StringownerName)throwsCreateException,publicAccountfindByPrimaryKey(AccountPKkey)throwsFinderException,file://Name字段查publicAccountfindByOwnerName(Stringname)throwsFinderException,}file://三个PUBLIC字段,他们将来对应库表publicStringaccountIDpublicdoublebalance;file://HOME中的create方法的影射实publicAccountPKejbCreate(StringaccountID,StringownerName)throwsCreateException,RemoteException{Connectionconn=null;trythis.ownerName=ownerName;this.balance=0;conn=pstmt=conn.prepareStatement("insertintoaccounts(id,ownerName,balance)values(?,?,?)");pstmt.setString(1,accountID);pstmt.setString(2,ownerName);pstmt.setDouble(3,balance);returnnew}catch(Exceptione)thrownew{try{}catch(Exceptione){}}publicAccountPKejbFindByOwnerName(Stringname)throwsFinderException,RemoteException{Connectionconn=null;tryconn=pstmt=conn.prepareStatement("selectidfromaccountswhereownerNamepstmt.setString(1,ResultSetrspstmt.executeQuery();returnnew}catch(Exceptione)thrownew{try{}catch(Exceptione){}}file://---REMOTE中的一个方法的实现publicdoublegetBalance(){returnbalance;} 其他的方法,由于篇幅问题就不一一列出了,请大家参阅原代码}JavaBeansJavaWebServerEJB的容器是ApplicationServer (2.0sunEnterprisebeans当前两个类型(2.0中有新内容,还没理解,不多讲了SessionBeans(又包括stateful和staess)业务过程相关的逻辑,比如各种计算,entitybeans法。EJB的容器使用这些方法来管理你的Bean以及传递sesssionbeansentitybeans有许多接口都是从这个特定的接口继承来的(所以你bean并不直接实现EnterpriseBean接口。所有的sessionbeans都从javax.ejb.SessionBean继承,同理所有的EntityBeanjavax.ejb.EntityBean继remoteobjectMiddleSoftwareremoteinterface接口---客户端的应用调用的接publicinterfaceEJBObjectextends{public throwsjava.rmi.RemoteException; file://一个EJB的持续,起来重新构 java.lang.ObjectgetPrimaryKey()throws booleanisIdentical(javax.ejb.EJBObjectparam1)throws voidremove()throwsjava.rmi.RemoteException,}homeobject-- EJBobjectfactory,EJBcontainer的一部分创建EJBobjectsEJBobjectsforentityhomeinterface--本地接口packagejavax.ejb;import//Referencedclassesofpackage RemoveException,EJBMetaData,HomeHandle,extendsRemote{ throwsRemoteException; throwsRemoteException; voidremove(ObjectthrowsRemoteException, voidremove(Handlehandle)}sessionbeanimport//Referencedclassesofpackage extends{ voidthrowsEJBException, voidthrowsEJBException, voidthrowsEJBException, voidsetSessionContext(SessionContextsessioncontext)throwsEJBException,RemoteException;}setSessionContext(SessionContextsessioncontextsessionbeancontainerimport{privateSessionBeanpublicvoidsetSessionContext(SessionContextsessioncontext)throwsEJBException,RemoteException{this.sessiontext=}}publicvoidhomeobject中有钝化和激活---仅用于statefulsessionbean voidejbPassivate() voidsessionbean被事例化时,containerhomeobject有相应的无参数create()方法1、Lookupahome2、UsethehomeobjecttocreateanEJBobject.3、CallbusinessmethodsontheEJBobject.4、RemovetheEJBLookupahomeyourcodemustusetheJNDI.J2EEproductsexploitdirectoryservicestostroelocationinfromationforresourcesthatyourapplicationcodeusesinanenterprisedeployment.TheseresourcescouldbeEJBhomeobjects,enterprisebeanenviromentproperties,databasederivers,messageservicedrivers,andotherresources.Byusingdirectoryservices,youcanwriterapplicationcodethatdoesnotdependonspecificmachinenamesorlocations.ThisisallpartofEJB'slocationtransparency,anditkeepsyourcodeportable.Iflateryoudecidethataresourcesshouldbelocatedelsewhere,yourcodewillnotneedtoberebuiltbecausethedirectoryservicecansimplybeupdatedtoreflectthenewresourcelocations.Thisgreatlyenhancesmaintenanceofamulti-tierdeploymentthatmayevolveoverTherearetwocommonstepsthatmustbetakentofindanyresourceinaJ2EEAssociatetheresourcewitha"nickname"inyourdeploymentdescriptor.YourJ2EEproductwillbindthenicknametotheresource.softheresourcecanusethenicknamewithJNDItolookuptheresourceacrossadeployment.1Miscrosoft'sDistributeinterNetAppplicationsWolfpackInternetInformationServerManagementConsole2、SUN'sJ2EE是规范而不是产品,不至于让用户绑定到一个卖家( 支持高端的Unix平台内置CORBA支3、TheObjectManagementGroup'sCORBAStandardCommonObjectRequestBrokerArchitecture(CORBA)InternetInter-ORBProtocol(IIOP)EJB开发概第一步,写接口(remote实现),注意要throwsjava.rmi.RemoteException。packageimportjava.rmi.*;publicinterfaceMyEJBextends{publicStringsayo()throws}至少生成一个create方法,注意要throwsjava.rmi.RemoteExceptionpackageimportjava.rmi.*;{MyEJBcreate()throwsjava.rmi.RemoteException,}第三步,正的SessionBean的实现(实现定义在接口中的方法),需要实javax.ejb.SessionBeanpackagejsper.ejb;importjavax.ejb.*;publicclassMyEJBClassimplementsSessionBean}publicvoidejbCreate()throwsRemoteException,CreateException}publicvoidejbActivate()thro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论