软件中间件技术UNIT12_第1页
软件中间件技术UNIT12_第2页
软件中间件技术UNIT12_第3页
软件中间件技术UNIT12_第4页
软件中间件技术UNIT12_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

1、会话会话Bean Session Bean 主要与商业处理逻辑有关,它代表一个商业处理过程。会话会话Bean12.1 Session Bean 的作用的作用 12.3 Session Bean的分类的分类12.4 创建无状态创建无状态 Session Bean 12.2 Session Bean 的生命周期的生命周期12.5 创建有状态创建有状态 Session Bean会话会话Bean12.6 Sessin Bean的更多细节问题的更多细节问题 12.8 Remote和和Home接口的限制接口的限制12.7 Session Bean要求、限制和许可要求、限制和许可 12.1 Session

2、Bean的作用的作用 Session Bean代表客户应用和EJB容器之间的会话。Session Bean通常都是实现商业逻辑并且和entity bean交互以执行具体操作。不过session bean并不一定要使用entity bean。如果需要,它可以直接和数据库通信。 12.2 Session Bean的生命周期的生命周期 Session Bean 和 Entity Bean 的最大区别在于它们的生命周期。 Session Bean 的生命周期很短,通常它的寿命和一个会话的时间或客户端的一次调用过程相当。 一个客户端的会话过程可能会持续到浏览器窗口完全关闭,或持续到Java应用程序运行结

3、束。客户端一次会话时间的长短决定了Session Bean 的生命周期的长短,这就是“会话” Bean 的来历。12.2 Session Bean的生命周期的生命周期 EJB容器负责管理Session Bean 的生命周期,通常每个Session Bean 都有一个生命期限的限制,当客户端连接时间超过这个时间限制,EJB容器自动删除该 Session Bean。如果应用程序关闭或重新启动, Session Bean就彻底删除了,也就是说 Session Bean 是生存在内存中的。 Session Bean不能进行永久性存储,但 Session Bean 也可以执行数据库相关操作,但它自己却并

4、不是一个永久性对象。12.3 Session Bean的分类的分类 无状态的Session Bean(Stateless Session Bean) 无状态的Session Bean并不保存客户端状态,所以对于客户端每个Bean实例都是一样的,这就意味着任何一个Bean实例都可以为任何一个客户端提供服务,也就是说无状态Session Bean可以一直生存在Bean池中供客户端使用,而不需要浪费时间重新初始化和创建。12.3 Session Bean的分类的分类 有状态的Session Bean(Stateful Session Bean) 有状态的Session Bean需要维护客户端与Ses

5、sion Bean之间的会话状态,为了节省资源,希望一个Session Bean实例可以服务于多个客户端,当一个客户端暂时不发出请求时,Session Bean会把与客户端对应的会话保存起来,这叫Bean的钝化(Passivate),然后这个Bean就可以服务于其他客户端了,当重新发出请求时, 容器从Bean池中取出一个Bean实例,或者新创建一个Bean实例,或者先钝化一个Bean实例,然后再读入相关信息到Bean实例,这个过程叫做Bean的激活(Activated) 。12.4 创建无状态的创建无状态的Session Bean 从编程的角度看,创建无状态的Session Bean和创建有状

6、态的是一样简单的。除了在配置工具里修改一个设置外,仅有的一点不同是在bean的初始设计阶段,无状态的Session Bean并不记得方法调用之间的任何东西,bean需要的任何消息都必须由客户端获得。虽然无状态的Session Bean并不记得面向session的数据,不过可以在一个无状态的session bean中存放数据,只是不能存放与客户端相关的数据。 12.4 创建无状态的创建无状态的Session Bean 在StatelessHello的例子中,通过调用greet()方法,返回Hello+“参数” 。下面是“Hello World”session bean Remote 接口(无状态

7、版本)12.4 创建无状态的创建无状态的Session Beanimport java.rmi.*;import javax.ejb.*;/* Defines the methods you can call on a StatelessHello object */public interface StatelessHello extends EJBObject /* Returns a greeting for the named object */public String greet(String thingToGreet) throws RemoteException;12.4 创建

8、无状态的创建无状态的Session Bean 在这个例子中,Remote接口仅提供了一个greet方法,该方法接收一个参数并且返回一个欢迎词。例如,如果传送“World”参数给greet,greet方法将返回“Hello World!”。下面是StatelessHello bean的Home接口。12.4 创建无状态的创建无状态的Session Beanimport java.rmi.*;import javax.ejb.*;/* Defines the methods for creating a StatelessHelloWorld */public interface Stateles

9、sHelloHome extends EJBHome /* Creates a StatelessHello session bean. A stateless session beancant have a create method that takes parameters. */public StatelessHello create() throws RemoteException, CreateException;12.4 创建无状态的创建无状态的Session Bean 无状态的session bean仅拥有一个create方法,而且该方法不能接受任何参数。这看起来有些奇怪,不过

10、如果考虑到无状态session bean的含义你就会明白了。这种bean不能记住某个客户的任何信息,实际上,为了性能上的原因,容器也许会不时地让不同的session处理某个客户的方法调用。由于session并不需要记住某个客户的信息,因此使用另一个bean来处理负载并不会带来任何问题。 12.4 创建无状态的创建无状态的Session Bean 如果bean的create方法接受任何的参数,session bean实例之间的行为将会有所不同,因为你为create方法提供不同的值。实现无状态session bean与有状态的session bean是一样简单的。下面是StatelessHello

11、Bean类,它实现了Remote和Home接口。12.4 创建无状态的创建无状态的Session Beanimport java.rmi.*;import java.util.*;import javax.ejb.*;/* The implementation class for the StatelessHello bean */public class StatelessHelloBean implements SessionBean/* The session context provided by the EJB container. A session bean must hold

12、on to the context it is given. */private SessionContext context;12.4 创建无状态的创建无状态的Session Bean/* An EJB must have a public, parameterless constructor */public StatelessHelloBean ()/* Called by the EJB container to set this sessions context */public void setSessionContext(SessionContext aContext)conte

13、xt = aContext; /* Called by the EJB container when a client calls the create() method inthe Home interface */public void ejbCreate()throws CreateException12.4 创建无状态的创建无状态的Session Bean/* Called by the EJB container to wake this session bean up after ithas been put to sleep with the ejbPassivate metho

14、d. */public void ejbActivate()/* Called by the EJB container to tell this session bean that it is beingsuspended from use (its being put to sleep). */public void ejbPassivate() 12.4 创建无状态的创建无状态的Session Bean/* Called by the EJB container to tell this session bean that it has beenremoved, either becau

15、se the client invoked the remove() method or thecontainer has timed the session out. */public void ejbRemove()/* Returns a greeting for the named object */public String greet(String thingToGreet)return Hello +thingToGreet+!; 12.4 创建无状态的创建无状态的Session Bean创建客户访问创建客户访问Session Bean 使用EJB时,只需要得到EJB Home接

16、口的一个引用。在得到Home接口的引用后,就可以通过其中的create方法来创建一个bean实例,然后调用bean的Remote接口的方法。 12.4 创建无状态的创建无状态的Session Bean创建客户访问创建客户访问Session Bean 首先做的第一件事情是得到JNDI naming context的一个引用,它是命名系统的一个接口,通过使用命名系统来找到EJB和其它对象。要得到naming context的一个引用,一个方法是创建一个InitialContext对象,如下:Context namingContext = new InitialContext();12.4 创建无状

17、态的创建无状态的Session Bean创建客户访问创建客户访问Session Bean javax.naming.InitialContext public class InitialContext extends Object implements Context12.4 创建无状态的创建无状态的Session Bean创建客户访问创建客户访问Session Bean拥有了naming context,这样就可以使用lookup方法来找到需要的EJB。例如,如果使用“StatelessHello”的JNDI名字来配置HelloWorldSession bean,以下的代码可以找到该bean

18、的Home接口:HelloWorldSessionHome home = (HelloWorldSessionHome)PortableRemoteObject.narrow(context.lookup( StatelessHello ),HelloWorldSessionHome.class);12.4 创建无状态的创建无状态的Session Bean创建客户端访问创建客户端访问Session Bean 使用EJB的时候,不能通过标准的Java强制转换操作符来转换远程的引用。必须使用PortableRemoteObject.narrow。EJB使用一个称为RMI-IIOP的特殊形式RMI,

19、需要这个特殊的语法来作转换。必须要记住的是无需找到EJB的Remote接口,只需要Home接口;然后就可以使用Home接口的create和find方法来得到Remote接口。12.4 创建无状态的创建无状态的Session Bean下面是一个客户测试无状态session bean的代码import java.util.*;import javax.naming.*;import javax.rmi.*;public class TestStatelessHello public static void main(String args) try /* Creates a JNDI naming

20、 context for location objects */Context context = new InitialContext();12.4 创建无状态的创建无状态的Session Bean/* Asks the context to locate an object named HelloWorld and expects theobject to implement the HelloWorldSessionHome interface */StatelessHelloHome home = (StatelessHelloHome)PortableRemoteObject.nar

21、row(context.lookup(StatelessHello),StatelessHelloHome.class);/* Asks the Home interface to create a new session bean */StatelessHello session = (StatelessHello) home.create();12.4 创建无状态的创建无状态的Session BeanSystem.out.println(session.greet(World);System.out.println(session.greet(Interstage Application

22、Server);System.out.println(session.greet(Apworks);/* Destroy this session */session.remove(); catch (Exception exc) exc.printStackTrace(); 13.5 创建有状态的创建有状态的Session Bean创建创建Remote接口接口 下面展示的是HelloWorldSession接口,它是Hello World session bean的Remote接口。 12.5 创建有状态的创建有状态的Session Beanimport java.rmi.*;import

23、javax.ejb.*;/* Defines the methods you can call on a HelloWorldSession object */public interface HelloWorldSession extends EJBObject /* Returns the sessions greeting */public String getGreeting() throws RemoteException;/* Changes the sessions greeting */public void setGreeting(String aGreeting) thro

24、ws RemoteException; 12.5 创建有状态的创建有状态的Session Bean创建创建Home接口接口 一个session bean的Home接口包含有创建新session的方法。对于Hello World例子,有两个不同的create方法,一个没有参数,而另一个允许你提供自己的欢迎词。下面展示了HelloWorldSessionHome接口。 12.5 创建有状态的创建有状态的Session Beanimport java.rmi.*;import javax.ejb.*;/* Defines the methods for creating a HelloWorldSe

25、ssion */public interface HelloWorldSessionHome extends EJBHome /* Creates a HelloWorldSession bean with default settings */public HelloWorldSession create() throws RemoteException, CreateException;/* Creates a HelloWorldSession bean with a specific initial greeting */public HelloWorldSession create(

26、String aGreeting)throws RemoteException, CreateException; 12.5 创建有状态的创建有状态的Session Bean创建实现的类创建实现的类 接口是EJB开发中比较简单的部分,而session bean还需要更多的工作。当你写一个session bean时,有一些方法你必须包含在bean中以满足EJB容器的要求。这些额外的方法是setSessionContext, ejbRemove, ejbActivate和 ejbPassivate。此外,当你实现你的create方法时,你需要将它们命名为ejbCreate而不只是create。 1

27、2.5 创建有状态的创建有状态的Session Bean注意注意要记住的是容器调用这些方法。当使用Home接口的方法来创建一个新的EJB时,容器最终会调用ejbCreate方法。同样,当删除一个bean时,容器将会调用ejbRemove方法来告诉bean它已经被移除。 下面展示的是HelloWorldSession和HelloWorldSessionHome接口的实现。 12.5 创建有状态的创建有状态的Session Beanimport java.rmi.*;import java.util.*;import javax.ejb.*;/* The implementation class

28、for the HelloWorldSession bean */public class HelloWorldSessionBean implements SessionBean/* Holds the sessions greeting */protected String greeting;12.5 创建有状态的创建有状态的Session Bean/* The session context provided by the EJB container. A session bean musthold on to the context it is given. */private Ses

29、sionContext context;/* An EJB must have a public, parameterless constructor */ public HelloWorldSessionBean ()/* Called by the EJB container to set this sessions context */public void setSessionContext(SessionContext aContext)context = aContext;12.5 创建有状态的创建有状态的Session Bean/* Called by the EJB conta

30、iner when a client calls the create() method inthe Home interface */public void ejbCreate()throws CreateExceptiongreeting = Hello World!;12.5 创建有状态的创建有状态的Session Bean/* Called by the EJB container when a client calls thecreate(String) method in the Home interface */ public void ejbCreate(String aGre

31、eting)throws CreateExceptiongreeting = aGreeting;/* Called by the EJB container to wake this session bean up after ithas been put to sleep with the ejbPassivate method. */public void ejbActivate()12.5 创建有状态的创建有状态的Session Bean/* Called by the EJB container to tell this session bean that it is being s

32、uspended from use (its being put to sleep). */public void ejbPassivate()/* Called by the EJB container to tell this session bean that it has been removed, either because the client invoked the remove() method or the container has timed the session out. */public void ejbRemove() 12.5 创建有状态的创建有状态的Sess

33、ion Bean/* Returns the sessions greeting */public String getGreeting()return greeting;/* Changes the sessions greeting */public void setGreeting(String aGreeting)greeting = aGreeting; 12.5 创建有状态的创建有状态的Session Bean 你想做的全部工作就是建立一个带有getGreeting和setGreeting方法的bean,最终会得到两个Java接口和一个有8个方法的类。 12.5 创建有状态的创建有

34、状态的Session Bean 提示提示 由于在编写EJB应用时你最终会产生很多的文件,因此对于产生的类使用一些一致的命名传统是重要的。Remote和 Home接口都通常命令为XXX和XXXHome,XXX是bean的名字。实现的类通常命令为XXXBean或者XXXImpl。你还可以考虑根据这个bean是一个session bean还是一个entity bean,将实现的类命令为XXXEB或者XXXSB。不管你决定如何命名你的类,它们都必须是一致的,这样在多人开发时会避免很多麻烦。 12.5 创建有状态的创建有状态的Session Bean注意注意 这里使用XXX代表Remote接口,XXXH

35、ome代表Home接口,而XXXImp1代表实现。该bean使用Remote接口名。如果Remote接口被称为ShoppingCart,Home的接口就是ShoppingCartHome,实现就是ShoppingCartImp1,而且该bean被引用为ShoppingCart bean。 12.5 创建有状态的创建有状态的Session Bean创建客户访问创建客户访问Session Bean下面显示了一个客户端程序。import java.util.*;import javax.naming.*;import javax.rmi.*;public class TestHellopublic

36、static void main(String args)try12.5 创建有状态的创建有状态的Session Bean创建客户访问创建客户访问Session Bean/* Creates a JNDI naming context for location objects */Context context = new InitialContext();/* Asks the context to locate an object named HelloWorld and expects the object to implement the HelloWorldSessionHome i

37、nterface */HelloWorldSessionHome home = (HelloWorldSessionHome)PortableRemoteObject.narrow(context.lookup(HelloWorld),HelloWorldSessionHome.class);12.5 创建有状态的创建有状态的Session Bean创建客户访问创建客户访问Session Bean/* Asks the Home interface to create a new session bean */HelloWorldSession session = (HelloWorldSes

38、sion) home.create();System.out.println(The default greeting is: +session.getGreeting();session.setGreeting(Interstage!);System.out.println(The greeting is now: +session.getGreeting();/* Destroy this session */session.remove();12.5 创建有状态的创建有状态的Session Bean创建客户访问创建客户访问Session Bean/* Now create a sessi

39、on with a different greeting */session = (HelloWorldSession) home.create(Welcome to J2EE!);System.out.println(Created a new session with a greeting of: +session.getGreeting();/* Destroy this session */session.remove();catch (Exception exc)exc.printStackTrace(); 12.6 Sessin Bean的更多细节问题的更多细节问题 Session

40、Bean的接口的接口setSessionContext SessionBean的接口的接口 每一个session bean都必须实现SessionBean接口,它包含有4个方法,EJB容器使用这些方法来管理session bean。 setSessionContext ejbRemove() ejbActivate() ejbPassivate() setSessionContext SessionContext对象包含有session bean运行环境的信息,并包含到Home接口的引用,以及自身的引用,事务信息和某个方法调用者的标识符。 对于每个session bean,setSession

41、Context方法都会被调用一次,这也是bean初始化的一部分。在调用setSessionContext后,该bean就成为EJB容器的一个活动部分,并且一直保持活动状态,直到调用ejbRemove为止。 setSessionContext提示提示 setSessionContext方法是放入初始代码的好地方,在这里可以创建数据库连接或者查找另一个bean的Home接口。 ejbRemove EJB容器调用session bean的ejbRemove方法来告诉该bean的服务将要停止。这时bean应该要清除它保留的全部资源。提示提示: 如果bean在setSessionContext方法中建立

42、了一个数据库连接,那么需要在ejbRemove方法中关闭该连接。如果你创建了任何的session bean,也可在ejbRemove方法中移除,同时将定位的Home接口设置为null。 ejbPassivate 和和 ejbActivate Enterprise JavaBeans规范中,提供了各种方法让EJB容器实现负载均衡以及其它各种和性能相关的工作。Passivation/Activation就是这样一个操作,它与计算机管理内存的方式是类似的。 ejbPassivate 和和 ejbActivate ejbPassivate 和 ejbActivate 方法允许一个EJB容器来使用内存交

43、换技术。在某个时刻,如果EJB容器觉得内存中的许多bean都有一段时间没人访问了,它可能选择将其中的bean存储到磁盘上。也就是说EJB容器使用对象串行化不常用的bean并存储在某个文件中。这个过程在EJB中被称为passivation。当一个客户想访问一个passivated的bean时,EJB容器通过将它由磁盘中读出,从而再次激活该bean。 ejbPassivate 和和 ejbActivate ejbPassivate和ejbActivate方法帮助EJB容器解决了一个问题-你不能串行化某些“活动的”操作系统资源,例如网络连接等。由于大部分的数据库连接都需要一个网络连接,这就意味着不能

44、串行化数据库连接。 如果你在setSessionContext方法中建立了一个数据库连接,在EJB容器需要passivate该session bean时,你必须对该连接做一些处理,通常是你应该关闭连接并且设置该连接变量为null。当EJB容器调用ejbActivate方法时,再重新建立连接。 ejbPassivate 和和 ejbActivate 提示 不要错误地认为在session bean首次创建时会调用ejbActivate。ejbActivate方法仅在ejbPassivate方法被调用后执行。 12.7 Session Bean要求、限制和许可要求、限制和许可 在EJB规范中,对Se

45、ssion Bean有一些限制和要求。这些限制会指出哪些是bean必须做的,哪些是不能做的,以及bean必须实现的一些方法和接口。也有一些规范指出哪些处理是允许做的,这是为了避免你以为这些处理是被其它限制禁止的。 实现实现SessionBean接口接口session bean必须实现javax.ejb.SessionBean接口声明该类为Public,而不是Final或者Abstract 要记住EJB容器需要创建bean实例,因此该类必须是public,而且不是抽象的。 创建一个创建一个Pubic,无参数的构造器,无参数的构造器 同样,由于EJB容器必须创建bean的实例。如果构造器是prot

46、ected或者private,容器就不能创建实例。 不要实现不要实现finalize方法方法 虽然你很少需要定义一个finalize方法,不过EJB规范中还是明文禁止在session和entity bean中定义finalize方法。如果你的bean需要做任何清除的操作,它们应该在ejbRemove或者ejbPassivate方法中进行。 实现实现create方法和所有的方法和所有的remote方法方法 一个session bean必须实现Home接口中指定的全部create方法,以及Remote接口中指定的全部方法。在实现这些方法时,有一些额外的要求:这些方法必须是public,而不能是st

47、atic或者final参数和返回的类型必须是有效的RMI/IIOP返回类型。在通常的情况下,这意味着必须是原有的类型(int, char, double等),可串行化的对象或者Remote接口方法名不能以ejb开头在必要时扩展其它类在必要时扩展其它类 你的实现类也可以是其它类的子类。实际上,该 超 类 也 可 以 是 另 一 类 b e a n 的 实 现 类 。不要抛出不要抛出RemoteException 如果需要抛出一个和EJB有关的异常,抛出javax.ejb.EJBException代替。 12.8 Remote和和Home接口的限制接口的限制 除了对实现类有限制外,对于Remote

48、和Home接口也有一些限制。这些限制大部分和实现类类似。 Remote接口必须扩展接口必须扩展javax.ejb.EJBObject Remote接口必须扩展javax.ejb.EJBObject Home接口必须扩展接口必须扩展javax.ejb.EJBHome 和Remote接口必须扩展EJBObject一样,EJBHome接口帮助标识Home接口,并且定义了一些你可以在每个Home接口上调用的方法。 参数和返回类型必须符合参数和返回类型必须符合RMI/IIOP 这意味着它们必须是原始类型、可串行化对象或者Remote接口。 所有的方法必须抛出所有的方法必须抛出java.rmi.Remot

49、eException 由 于 H o m e 和 R e m o t e 接 口 扩 展java.rmi.Remote接口,所以接口的全部方法都必须抛出java.rmi.RemoteException。RMI规范明确规定在Remote接口的所有方法都必须抛出 RemoteException。 所有的方法都必须有相应的实现所有的方法都必须有相应的实现 对于Home接口的每个create方法,在实现类中都必须有一个相应的ejbCreate方法。还有,create方法抛出CreateException。 扩展其它的接口扩展其它的接口 要支持Enterprise JavaBeans的子类,Home和Remote接口可以扩展其它的接口,只要父接口是扩展EJBO

温馨提示

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

评论

0/150

提交评论