有状态会话Bean课件_第1页
有状态会话Bean课件_第2页
有状态会话Bean课件_第3页
有状态会话Bean课件_第4页
有状态会话Bean课件_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

有状态会话Bean(StatefulBean)的开发

SessionBean是最简单的EJB组件,SessionBean又分为两类:无状态会话Bean(StatelessBean)有状态会话Bean(StatefulBean)无状态sessionbean每次调用只对客户提供业务逻辑,但不保存客户端的任何数据状态。有状态会话Bean(StatefulBean

)就是在客户引用期间维护Bean中的所有实例数据的状态值。这些数据在引用期间可以被其它方法所引用,其它客户不会共享同一个会话Bean的实例。购物车就是一个典型的会话Bean,当一个客户第一次使用购物车时,系统为它分配一个购物车的会话Bean,以后,当客户选购了商品时将改变购物车的商品记录,而这些记录数据将保存到用户会话数据中。有状态会话Bean的生命周期有状态会话Bean的寿命周期比无状态会话Bean复杂,有四种状态:不存在、方法现成、事务中方法现成和钝化。不存在(事务中)方法现成钝化组件池ejbRemove()ejbActivate()ejbPassivate()newInstance()setSessionContext()ejbCreate()客户端调用有状态会话Bean的初始状态为不存在,当客户引用一个Bean时,按照顺序调用newInstance()、setSessionContext()和ejbCreate()方法。当处于方法现成状态时,如果客户调用超时remove()方法,则回到不存在状态,并触发Bean的ejbRemove()方法。如果客户长时间不调用Bean或服务器准备释放一些内存资源,则容器将这些Bean从组件池中钝化,钝化过程中容器将调用Bean的ejbPassivate()方法,使程序员有机会在钝化Bean时释放分配的资源。当一个客户请求一个被钝化的Bean时,容器可以激活Bean,激活过程中容器将调用ejbActivate()方法,使程序员有机会在Bean转到方法现成状态时分配Bean所需的资源。有状态会话的开发例子

后面的实例2是一个有状态会话Bean的例子。实例2要为某银行编写一个管理基金帐户的基本功能的Bean组件:StatefulAccount,为了描述清楚有状态会话Bean的特性,我们将之简化成三个业务逻辑接口:addFunds()方法为基金帐户添加基金。removeFunds()方法从基金帐户中取出基金。getBalance()方法提供基金帐户的余额查询。

1)、编写remote接口packagecom.j2ee14.tyl;importjava.util.*;importjavax.ejb.EJBObject;importjava.rmi.RemoteException;publicinterfaceStatefulAccountextendsEJBObject{ //在remote接口了定义了EJB组件向外提供的业务方法。这个方法由EJB //的类实现publicvoidaddFunds(doubleamount)throwsRemoteException;publicvoidremoveFunds(doubleamount)throwsRemoteException;publicdoublegetBalance()throwsRemoteException;}EJB组件都需要编写两个接口:一个是remote接口,另一个是Home接口。Servlet首先查找到EJB的Home接口,然后通过Home接口创建remote接口的引用,并且通过remote接口来调用EJB的业务方法。remote接口又称为组件接口,它定义了EJB组件向外提供的业务方法。2)、编写Home接口packagecom.j2ee14.tyl;importjava.io.Serializable;importjava.rmi.RemoteException;importjavax.ejb.CreateException;importjavax.ejb.EJBHome;publicinterfaceStatefulAccountHomeextendsEJBHome{

StatefulAccount

create(doubleamount)throwsRemoteException, CreateException;}EJB的Home接口又称主接口,它由客户端使用,通过它来创建EJB的remote接口引用。3)、编写EJB的实现类packagecom.j2ee14.tyl;importjava.util.*;importjavax.ejb.*;importjavax.naming.*;publicclassStatefulAccountBeanimplementsSessionBean{//实例变量,有状态会话Bean将在组件池中维护这个实例的值privatedoublefundBalance; publicvoidejbCreate(doubleamount)throwsCreateException{if(amount<0)thrownewCreateException("InvalidAmount");fundBalance=amount;}//向基金帐户中增加基金publicvoidaddFunds(doubleamount)throwsException{if(amount<0)thrownewException("Invalidamount");fundBalance+=amount;}编写EJB的实现类(接上页)//向基金帐户中减除基金publicvoidremoveFunds(doubleamount)throwsException{if(amount<0)thrownewException("Invalidamount");if(fundBalance<amount)thrownewException("noenoughmoney");fundBalance-=amount;}

//得到基金帐户中减除基金publicdoublegetBalance()throwsException{returnfundBalance;}publicvoidejbRemove(){}publicvoidejbActivate(){}publicvoidejbPassivate(){}publicvoidsetSessionContext(SessionContextsc){}}5)、编写EJB在JBoss服务器上发布所需要的描述文件jboss.xml

jboss.xml是只当EJB组件发布到JBoss服务器中时才必须提供的发布描述文件,在这个文件中为EJB组件指定JNDI名字。<?xmlversion="1.0"encoding="UTF-8"?><jboss><enterprise-beans><session><ejb-name>StatefulAccountEJB</ejb-name><jndi-name>ejb/account</jndi-name></session></enterprise-beans></jboss>指定JNDI名字EJB名字在ejb-jar.xml中定义EJB组件的编译、打包、发布1)编译EJB文件在DOS窗口中,转到account目录下,执行

javac–d.*.java

如果执行正确,将会在该目录下创建com\j2ee14\tyl子目录,生成的class文件就将存放在该目录中2)给EJB组件打包。执行

jarcvfaccountejb.jarcomMETA_INF

在当前目录下将生成accountejb.jar文件。3)发布EJB组件。如果要单独发布上面生成的EJB组件,只要把accountejb.jar文件拷贝到<JBOSS_HOME>\server\default\deploy下面即可。

1)、编写Servletpackagecom.j2ee14.tyl;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importjavax.rmi.*;importjavax.naming.*;publicclassStatefulAccountServletextendsHttpServlet{privatestaticfinalStringCONTENT_TYPE="text/html";publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType(CONTENT_TYPE);PrintWriterout=response.getWriter();out.println("<html><head><title>theStatefulEJBTest</title></head><body>");try{InitialContextctx=newInitialContext();ObjectobjRef=ctx.lookup("ejb/account");//主接口StatefulAccountHomehome=(StatefulAccountHome)PortableRemoteObject.narrow(objRef,StatefulAccountHome.class);//得到一个基金帐户对象的引用,并初始化帐户金额为100000StatefulAccountaccount=home.create(100000.0);out.println("theinitialaccountbalance:"+account.getBalance()+"<br>");//向基金帐户增加5000.25account.addFunds(5000.25);out.println("methodofaddFunds(5000.25)result:"+account.getBalance()+"<br>");//从基金帐户取出1000.02account.removeFunds(1000.02);out.println("methodofremoveFunds(1000.02)result:"+account.getBalance()+"<br>");out.println("<br>");out.println("currentaccountbalance:"+account.getBalance()+"<br>");account=null;}catch(Exceptione){System.out.println("Remoteexceptioncaught:"+e);e.printStackTrace(out);}out.println("</body></html>");}}2)、编写Web应用的描述文件web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appid="WebApp_ID"version="2.4"xmlns=""xmlns:xsi=""xsi:schemaLocation=""><display-name>StatefulAccount</display-name><servlet><servlet-name>StatefulAccountServlet</servlet-name><servlet-class>com.j2ee14.tyl.StatefulAccountServlet</servlet-class></servlet><servlet-mapping><servlet-name>StatefulAccountServlet</servlet-name><url-pattern>/account_servlet</url-pattern></servlet-mapping><!--###EJBreferences(java:comp/env/ejb)--><ejb-ref><ejb-ref-name>ejb/account</ejb-ref-name><ejb-ref-type>Session</ejb-ref-type><home>com.j2ee14.tyl.StatefulAccountHome</home><remote>com.j2ee14.tyl.StatefulAccount</remote><ejb-link>StatefulAccountBean</ejb-link></ejb-ref></web-app>在JSPform中请求的URL在Web应用中访问了EJB组件,所以此处要声明ejb-ref元素3)、编写jboss-web.xml文件jboss-web.xml是当Web应用发布到JBOSS服务器中才必须提供的发布描述文件。在这个文件中指定<ejb-ref-name>和<jndi-name>的映射关系。<?xmlversion="1.0"encoding="UTF-8"?><jboss-web><ejb-ref><ejb-ref-name>ejb/account</ejb-ref-name>

温馨提示

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

评论

0/150

提交评论