軟件中間件技術(shù)UNIT12_第1頁(yè)
軟件中間件技術(shù)UNIT12_第2頁(yè)
軟件中間件技術(shù)UNIT12_第3頁(yè)
軟件中間件技術(shù)UNIT12_第4頁(yè)
軟件中間件技術(shù)UNIT12_第5頁(yè)
已閱讀5頁(yè),還剩83頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、會(huì)話會(huì)話Bean Session Bean 主要與商業(yè)處理邏輯有關(guān),它代表一個(gè)商業(yè)處理過(guò)程。會(huì)話會(huì)話Bean12.1 Session Bean 的作用的作用 12.3 Session Bean的分類的分類12.4 創(chuàng)建無(wú)狀態(tài)創(chuàng)建無(wú)狀態(tài) Session Bean 12.2 Session Bean 的生命周期的生命周期12.5 創(chuàng)建有狀態(tài)創(chuàng)建有狀態(tài) Session Bean會(huì)話會(huì)話Bean12.6 Sessin Bean的更多細(xì)節(jié)問(wèn)題的更多細(xì)節(jié)問(wèn)題 12.8 Remote和和Home接口的限制接口的限制12.7 Session Bean要求、限制和許可要求、限制和許可 12.1 Session

2、Bean的作用的作用 Session Bean代表客戶應(yīng)用和EJB容器之間的會(huì)話。Session Bean通常都是實(shí)現(xiàn)商業(yè)邏輯并且和entity bean交互以執(zhí)行具體操作。不過(guò)session bean并不一定要使用entity bean。如果需要,它可以直接和數(shù)據(jù)庫(kù)通信。 12.2 Session Bean的生命周期的生命周期 Session Bean 和 Entity Bean 的最大區(qū)別在于它們的生命周期。 Session Bean 的生命周期很短,通常它的壽命和一個(gè)會(huì)話的時(shí)間或客戶端的一次調(diào)用過(guò)程相當(dāng)。 一個(gè)客戶端的會(huì)話過(guò)程可能會(huì)持續(xù)到瀏覽器窗口完全關(guān)閉,或持續(xù)到Java應(yīng)用程序運(yùn)行結(jié)

3、束??蛻舳艘淮螘?huì)話時(shí)間的長(zhǎng)短決定了Session Bean 的生命周期的長(zhǎng)短,這就是“會(huì)話” Bean 的來(lái)歷。12.2 Session Bean的生命周期的生命周期 EJB容器負(fù)責(zé)管理Session Bean 的生命周期,通常每個(gè)Session Bean 都有一個(gè)生命期限的限制,當(dāng)客戶端連接時(shí)間超過(guò)這個(gè)時(shí)間限制,EJB容器自動(dòng)刪除該 Session Bean。如果應(yīng)用程序關(guān)閉或重新啟動(dòng), Session Bean就徹底刪除了,也就是說(shuō) Session Bean 是生存在內(nèi)存中的。 Session Bean不能進(jìn)行永久性存儲(chǔ),但 Session Bean 也可以執(zhí)行數(shù)據(jù)庫(kù)相關(guān)操作,但它自己卻并

4、不是一個(gè)永久性對(duì)象。12.3 Session Bean的分類的分類 無(wú)狀態(tài)的Session Bean(Stateless Session Bean) 無(wú)狀態(tài)的Session Bean并不保存客戶端狀態(tài),所以對(duì)于客戶端每個(gè)Bean實(shí)例都是一樣的,這就意味著任何一個(gè)Bean實(shí)例都可以為任何一個(gè)客戶端提供服務(wù),也就是說(shuō)無(wú)狀態(tài)Session Bean可以一直生存在Bean池中供客戶端使用,而不需要浪費(fèi)時(shí)間重新初始化和創(chuàng)建。12.3 Session Bean的分類的分類 有狀態(tài)的Session Bean(Stateful Session Bean) 有狀態(tài)的Session Bean需要維護(hù)客戶端與Ses

5、sion Bean之間的會(huì)話狀態(tài),為了節(jié)省資源,希望一個(gè)Session Bean實(shí)例可以服務(wù)于多個(gè)客戶端,當(dāng)一個(gè)客戶端暫時(shí)不發(fā)出請(qǐng)求時(shí),Session Bean會(huì)把與客戶端對(duì)應(yīng)的會(huì)話保存起來(lái),這叫Bean的鈍化(Passivate),然后這個(gè)Bean就可以服務(wù)于其他客戶端了,當(dāng)重新發(fā)出請(qǐng)求時(shí), 容器從Bean池中取出一個(gè)Bean實(shí)例,或者新創(chuàng)建一個(gè)Bean實(shí)例,或者先鈍化一個(gè)Bean實(shí)例,然后再讀入相關(guān)信息到Bean實(shí)例,這個(gè)過(guò)程叫做Bean的激活(Activated) 。12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean 從編程的角度看,創(chuàng)建無(wú)狀態(tài)的Session Bean和創(chuàng)建有狀

6、態(tài)的是一樣簡(jiǎn)單的。除了在配置工具里修改一個(gè)設(shè)置外,僅有的一點(diǎn)不同是在bean的初始設(shè)計(jì)階段,無(wú)狀態(tài)的Session Bean并不記得方法調(diào)用之間的任何東西,bean需要的任何消息都必須由客戶端獲得。雖然無(wú)狀態(tài)的Session Bean并不記得面向session的數(shù)據(jù),不過(guò)可以在一個(gè)無(wú)狀態(tài)的session bean中存放數(shù)據(jù),只是不能存放與客戶端相關(guān)的數(shù)據(jù)。 12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean 在StatelessHello的例子中,通過(guò)調(diào)用greet()方法,返回Hello+“參數(shù)” 。下面是“Hello World”session bean Remote 接口(無(wú)狀態(tài)

7、版本)12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的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 創(chuàng)建

8、無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean 在這個(gè)例子中,Remote接口僅提供了一個(gè)greet方法,該方法接收一個(gè)參數(shù)并且返回一個(gè)歡迎詞。例如,如果傳送“World”參數(shù)給greet,greet方法將返回“Hello World!”。下面是StatelessHello bean的Home接口。12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的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 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean 無(wú)狀態(tài)的session bean僅擁有一個(gè)create方法,而且該方法不能接受任何參數(shù)。這看起來(lái)有些奇怪,不過(guò)

10、如果考慮到無(wú)狀態(tài)session bean的含義你就會(huì)明白了。這種bean不能記住某個(gè)客戶的任何信息,實(shí)際上,為了性能上的原因,容器也許會(huì)不時(shí)地讓不同的session處理某個(gè)客戶的方法調(diào)用。由于session并不需要記住某個(gè)客戶的信息,因此使用另一個(gè)bean來(lái)處理負(fù)載并不會(huì)帶來(lái)任何問(wèn)題。 12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean 如果bean的create方法接受任何的參數(shù),session bean實(shí)例之間的行為將會(huì)有所不同,因?yàn)槟銥閏reate方法提供不同的值。實(shí)現(xiàn)無(wú)狀態(tài)session bean與有狀態(tài)的session bean是一樣簡(jiǎn)單的。下面是StatelessHello

11、Bean類,它實(shí)現(xiàn)了Remote和Home接口。12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的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 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的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 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的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 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的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 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean創(chuàng)建客戶訪問(wèn)創(chuàng)建客戶訪問(wèn)Session Bean 使用EJB時(shí),只需要得到EJB Home接

16、口的一個(gè)引用。在得到Home接口的引用后,就可以通過(guò)其中的create方法來(lái)創(chuàng)建一個(gè)bean實(shí)例,然后調(diào)用bean的Remote接口的方法。 12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean創(chuàng)建客戶訪問(wèn)創(chuàng)建客戶訪問(wèn)Session Bean 首先做的第一件事情是得到JNDI naming context的一個(gè)引用,它是命名系統(tǒng)的一個(gè)接口,通過(guò)使用命名系統(tǒng)來(lái)找到EJB和其它對(duì)象。要得到naming context的一個(gè)引用,一個(gè)方法是創(chuàng)建一個(gè)InitialContext對(duì)象,如下:Context namingContext = new InitialContext();12.4 創(chuàng)建無(wú)狀

17、態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean創(chuàng)建客戶訪問(wèn)創(chuàng)建客戶訪問(wèn)Session Bean javax.naming.InitialContext public class InitialContext extends Object implements Context12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean創(chuàng)建客戶訪問(wèn)創(chuàng)建客戶訪問(wèn)Session Bean擁有了naming context,這樣就可以使用lookup方法來(lái)找到需要的EJB。例如,如果使用“StatelessHello”的JNDI名字來(lái)配置HelloWorldSession bean,以下的代碼可以找到該bean

18、的Home接口:HelloWorldSessionHome home = (HelloWorldSessionHome)PortableRemoteObject.narrow(context.lookup( StatelessHello ),HelloWorldSessionHome.class);12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean創(chuàng)建客戶端訪問(wèn)創(chuàng)建客戶端訪問(wèn)Session Bean 使用EJB的時(shí)候,不能通過(guò)標(biāo)準(zhǔn)的Java強(qiáng)制轉(zhuǎn)換操作符來(lái)轉(zhuǎn)換遠(yuǎn)程的引用。必須使用PortableRemoteObject.narrow。EJB使用一個(gè)稱為RMI-IIOP的特殊形式RMI,

19、需要這個(gè)特殊的語(yǔ)法來(lái)作轉(zhuǎn)換。必須要記住的是無(wú)需找到EJB的Remote接口,只需要Home接口;然后就可以使用Home接口的create和find方法來(lái)得到Remote接口。12.4 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的Session Bean下面是一個(gè)客戶測(cè)試無(wú)狀態(tài)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 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的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 創(chuàng)建無(wú)狀態(tài)的創(chuàng)建無(wú)狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean創(chuàng)建創(chuàng)建Remote接口接口 下面展示的是HelloWorldSession接口,它是Hello World session bean的Remote接口。 12.5 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean創(chuàng)建創(chuàng)建Home接口接口 一個(gè)session bean的Home接口包含有創(chuàng)建新session的方法。對(duì)于Hello World例子,有兩個(gè)不同的create方法,一個(gè)沒(méi)有參數(shù),而另一個(gè)允許你提供自己的歡迎詞。下面展示了HelloWorldSessionHome接口。 12.5 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean創(chuàng)建實(shí)現(xiàn)的類創(chuàng)建實(shí)現(xiàn)的類 接口是EJB開發(fā)中比較簡(jiǎn)單的部分,而session bean還需要更多的工作。當(dāng)你寫一個(gè)session bean時(shí),有一些方法你必須包含在bean中以滿足EJB容器的要求。這些額外的方法是setSessionContext, ejbRemove, ejbActivate和 ejbPassivate。此外,當(dāng)你實(shí)現(xiàn)你的create方法時(shí),你需要將它們命名為ejbCreate而不只是create。 1

27、2.5 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean注意注意要記住的是容器調(diào)用這些方法。當(dāng)使用Home接口的方法來(lái)創(chuàng)建一個(gè)新的EJB時(shí),容器最終會(huì)調(diào)用ejbCreate方法。同樣,當(dāng)刪除一個(gè)bean時(shí),容器將會(huì)調(diào)用ejbRemove方法來(lái)告訴bean它已經(jīng)被移除。 下面展示的是HelloWorldSession和HelloWorldSessionHome接口的實(shí)現(xiàn)。 12.5 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean 你想做的全部工作就是建立一個(gè)帶有g(shù)etGreeting和setGreeting方法的bean,最終會(huì)得到兩個(gè)Java接口和一個(gè)有8個(gè)方法的類。 12.5 創(chuàng)建有狀態(tài)的創(chuàng)建有

34、狀態(tài)的Session Bean 提示提示 由于在編寫EJB應(yīng)用時(shí)你最終會(huì)產(chǎn)生很多的文件,因此對(duì)于產(chǎn)生的類使用一些一致的命名傳統(tǒng)是重要的。Remote和 Home接口都通常命令為XXX和XXXHome,XXX是bean的名字。實(shí)現(xiàn)的類通常命令為XXXBean或者XXXImpl。你還可以考慮根據(jù)這個(gè)bean是一個(gè)session bean還是一個(gè)entity bean,將實(shí)現(xiàn)的類命令為XXXEB或者XXXSB。不管你決定如何命名你的類,它們都必須是一致的,這樣在多人開發(fā)時(shí)會(huì)避免很多麻煩。 12.5 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean注意注意 這里使用XXX代表Remote接口,XXXH

35、ome代表Home接口,而XXXImp1代表實(shí)現(xiàn)。該bean使用Remote接口名。如果Remote接口被稱為ShoppingCart,Home的接口就是ShoppingCartHome,實(shí)現(xiàn)就是ShoppingCartImp1,而且該bean被引用為ShoppingCart bean。 12.5 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean創(chuàng)建客戶訪問(wèn)創(chuàng)建客戶訪問(wèn)Session Bean下面顯示了一個(gè)客戶端程序。import java.util.*;import javax.naming.*;import javax.rmi.*;public class TestHellopublic

36、static void main(String args)try12.5 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean創(chuàng)建客戶訪問(wèn)創(chuàng)建客戶訪問(wèn)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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean創(chuàng)建客戶訪問(wèn)創(chuàng)建客戶訪問(wèn)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 創(chuàng)建有狀態(tài)的創(chuàng)建有狀態(tài)的Session Bean創(chuàng)建客戶訪問(wèn)創(chuàng)建客戶訪問(wèn)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的更多細(xì)節(jié)問(wèn)題的更多細(xì)節(jié)問(wèn)題 Session

40、Bean的接口的接口setSessionContext SessionBean的接口的接口 每一個(gè)session bean都必須實(shí)現(xiàn)SessionBean接口,它包含有4個(gè)方法,EJB容器使用這些方法來(lái)管理session bean。 setSessionContext ejbRemove() ejbActivate() ejbPassivate() setSessionContext SessionContext對(duì)象包含有session bean運(yùn)行環(huán)境的信息,并包含到Home接口的引用,以及自身的引用,事務(wù)信息和某個(gè)方法調(diào)用者的標(biāo)識(shí)符。 對(duì)于每個(gè)session bean,setSession

41、Context方法都會(huì)被調(diào)用一次,這也是bean初始化的一部分。在調(diào)用setSessionContext后,該bean就成為EJB容器的一個(gè)活動(dòng)部分,并且一直保持活動(dòng)狀態(tài),直到調(diào)用ejbRemove為止。 setSessionContext提示提示 setSessionContext方法是放入初始代碼的好地方,在這里可以創(chuàng)建數(shù)據(jù)庫(kù)連接或者查找另一個(gè)bean的Home接口。 ejbRemove EJB容器調(diào)用session bean的ejbRemove方法來(lái)告訴該bean的服務(wù)將要停止。這時(shí)bean應(yīng)該要清除它保留的全部資源。提示提示: 如果bean在setSessionContext方法中建立

42、了一個(gè)數(shù)據(jù)庫(kù)連接,那么需要在ejbRemove方法中關(guān)閉該連接。如果你創(chuàng)建了任何的session bean,也可在ejbRemove方法中移除,同時(shí)將定位的Home接口設(shè)置為null。 ejbPassivate 和和 ejbActivate Enterprise JavaBeans規(guī)范中,提供了各種方法讓EJB容器實(shí)現(xiàn)負(fù)載均衡以及其它各種和性能相關(guān)的工作。Passivation/Activation就是這樣一個(gè)操作,它與計(jì)算機(jī)管理內(nèi)存的方式是類似的。 ejbPassivate 和和 ejbActivate ejbPassivate 和 ejbActivate 方法允許一個(gè)EJB容器來(lái)使用內(nèi)存交

43、換技術(shù)。在某個(gè)時(shí)刻,如果EJB容器覺(jué)得內(nèi)存中的許多bean都有一段時(shí)間沒(méi)人訪問(wèn)了,它可能選擇將其中的bean存儲(chǔ)到磁盤上。也就是說(shuō)EJB容器使用對(duì)象串行化不常用的bean并存儲(chǔ)在某個(gè)文件中。這個(gè)過(guò)程在EJB中被稱為passivation。當(dāng)一個(gè)客戶想訪問(wèn)一個(gè)passivated的bean時(shí),EJB容器通過(guò)將它由磁盤中讀出,從而再次激活該bean。 ejbPassivate 和和 ejbActivate ejbPassivate和ejbActivate方法幫助EJB容器解決了一個(gè)問(wèn)題-你不能串行化某些“活動(dòng)的”操作系統(tǒng)資源,例如網(wǎng)絡(luò)連接等。由于大部分的數(shù)據(jù)庫(kù)連接都需要一個(gè)網(wǎng)絡(luò)連接,這就意味著不能

44、串行化數(shù)據(jù)庫(kù)連接。 如果你在setSessionContext方法中建立了一個(gè)數(shù)據(jù)庫(kù)連接,在EJB容器需要passivate該session bean時(shí),你必須對(duì)該連接做一些處理,通常是你應(yīng)該關(guān)閉連接并且設(shè)置該連接變量為null。當(dāng)EJB容器調(diào)用ejbActivate方法時(shí),再重新建立連接。 ejbPassivate 和和 ejbActivate 提示 不要錯(cuò)誤地認(rèn)為在session bean首次創(chuàng)建時(shí)會(huì)調(diào)用ejbActivate。ejbActivate方法僅在ejbPassivate方法被調(diào)用后執(zhí)行。 12.7 Session Bean要求、限制和許可要求、限制和許可 在EJB規(guī)范中,對(duì)Se

45、ssion Bean有一些限制和要求。這些限制會(huì)指出哪些是bean必須做的,哪些是不能做的,以及bean必須實(shí)現(xiàn)的一些方法和接口。也有一些規(guī)范指出哪些處理是允許做的,這是為了避免你以為這些處理是被其它限制禁止的。 實(shí)現(xiàn)實(shí)現(xiàn)SessionBean接口接口session bean必須實(shí)現(xiàn)javax.ejb.SessionBean接口聲明該類為Public,而不是Final或者Abstract 要記住EJB容器需要?jiǎng)?chuàng)建bean實(shí)例,因此該類必須是public,而且不是抽象的。 創(chuàng)建一個(gè)創(chuàng)建一個(gè)Pubic,無(wú)參數(shù)的構(gòu)造器,無(wú)參數(shù)的構(gòu)造器 同樣,由于EJB容器必須創(chuàng)建bean的實(shí)例。如果構(gòu)造器是prot

46、ected或者private,容器就不能創(chuàng)建實(shí)例。 不要實(shí)現(xiàn)不要實(shí)現(xiàn)finalize方法方法 雖然你很少需要定義一個(gè)finalize方法,不過(guò)EJB規(guī)范中還是明文禁止在session和entity bean中定義finalize方法。如果你的bean需要做任何清除的操作,它們應(yīng)該在ejbRemove或者ejbPassivate方法中進(jìn)行。 實(shí)現(xiàn)實(shí)現(xiàn)create方法和所有的方法和所有的remote方法方法 一個(gè)session bean必須實(shí)現(xiàn)Home接口中指定的全部create方法,以及Remote接口中指定的全部方法。在實(shí)現(xiàn)這些方法時(shí),有一些額外的要求:這些方法必須是public,而不能是st

47、atic或者final參數(shù)和返回的類型必須是有效的RMI/IIOP返回類型。在通常的情況下,這意味著必須是原有的類型(int, char, double等),可串行化的對(duì)象或者Remote接口方法名不能以ejb開頭在必要時(shí)擴(kuò)展其它類在必要時(shí)擴(kuò)展其它類 你的實(shí)現(xiàn)類也可以是其它類的子類。實(shí)際上,該 超 類 也 可 以 是 另 一 類 b e a n 的 實(shí) 現(xiàn) 類 。不要拋出不要拋出RemoteException 如果需要拋出一個(gè)和EJB有關(guān)的異常,拋出javax.ejb.EJBException代替。 12.8 Remote和和Home接口的限制接口的限制 除了對(duì)實(shí)現(xiàn)類有限制外,對(duì)于Remote

48、和Home接口也有一些限制。這些限制大部分和實(shí)現(xiàn)類類似。 Remote接口必須擴(kuò)展接口必須擴(kuò)展javax.ejb.EJBObject Remote接口必須擴(kuò)展javax.ejb.EJBObject Home接口必須擴(kuò)展接口必須擴(kuò)展javax.ejb.EJBHome 和Remote接口必須擴(kuò)展EJBObject一樣,EJBHome接口幫助標(biāo)識(shí)Home接口,并且定義了一些你可以在每個(gè)Home接口上調(diào)用的方法。 參數(shù)和返回類型必須符合參數(shù)和返回類型必須符合RMI/IIOP 這意味著它們必須是原始類型、可串行化對(duì)象或者Remote接口。 所有的方法必須拋出所有的方法必須拋出java.rmi.Remot

49、eException 由 于 H o m e 和 R e m o t e 接 口 擴(kuò) 展java.rmi.Remote接口,所以接口的全部方法都必須拋出java.rmi.RemoteException。RMI規(guī)范明確規(guī)定在Remote接口的所有方法都必須拋出 RemoteException。 所有的方法都必須有相應(yīng)的實(shí)現(xiàn)所有的方法都必須有相應(yīng)的實(shí)現(xiàn) 對(duì)于Home接口的每個(gè)create方法,在實(shí)現(xiàn)類中都必須有一個(gè)相應(yīng)的ejbCreate方法。還有,create方法拋出CreateException。 擴(kuò)展其它的接口擴(kuò)展其它的接口 要支持Enterprise JavaBeans的子類,Home和Remote接口可以擴(kuò)展其它的接口,只要父接口是擴(kuò)展EJBObject(對(duì)于Remote接口)或者EJBHome(對(duì)于Home接口)。 創(chuàng)建創(chuàng)建 Session BeanSession Bean 11. 1. 新建一個(gè)項(xiàng)目新建一個(gè)項(xiàng)目 右擊右擊“包資源管理器包資源管理器”的空白處,的空白處, 在彈出菜單中在彈出菜單中選擇選擇“新建新建” -“Lomboz J2E

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論