2015-01-14 193 views
0

我最近了解到有關ejb中的有狀態和無狀態會話bean。我可以與無狀態會話bean一起工​​作,但沒有任何問題(創建了多個應用程序),但是我發現使用有狀態會話bean實現應用程序很困難。使用有狀態會話bean(EJB)

以下是我的場景: 客戶可以使用ID登錄並在其賬戶中進行交易。我想將id保存到登錄servlet本身的會話bean中,以便我可以從會話中檢索id來執行事務。

我知道如何使用httpSession而不是使用這些ejb會話(有狀態bean)。請指導,我想將帳戶ID保存到會話(ejb有狀態會話)並將其恢復回另一個servlet。

我用的HttpSession,下面是我的代碼:

HttpSession session=request.getSession(); 
session.setAttribute("accountID", accountid); 

但上面是正常的會話,我如何使用該帳戶會話bean保存ID和檢索。

謝謝

+0

這可能會幫助你:http://stackoverflow.com/questions/8480096/using-a-stateful-session-bean-to-track-an-users-session – asohun

回答

4

請參閱本教程here,它創建一個簡單的狀態會話Bean(EJB),並在Web應用程序上下文中使用它

更新感謝@Gimby:

關鍵在於'客戶端'(這個案例中的網絡應用程序本身在 中)通過將其粘貼在 的sessio中n,它使有狀態bean在服務器端保持活動狀態。

你需要做的第一件事就是試圖從像下面的HttpSession中得到你的EJB:

MyBean bean = (MyBean) request.getSession().getAttribute("myBean"); 

然後檢查豆爲空或不爲空,如果空創建EJB並把它添加到會話,如下所示:

if(bean == null){ 
      // EJB is not present in the HTTP session 
      // so let's fetch a new one from the container 
      try { 
      InitialContext ic = new InitialContext(); 
      bean = (MyBean) 
      ic.lookup("java:global/MyBean"); 

      // put EJB in HTTP session for future servlet calls 
      request.getSession().setAttribute(
       "myBean", 
       bean); 

      } catch (NamingException e) { 
      throw new ServletException(e); 
      } 
    } 

,這樣的方式在第一時間,你需要將創建它,並把它添加到會話bean的,第二個,第三個......等等,你將它存儲在會話中。

希望有幫助。

+0

關鍵是,'客戶'(在這種情況下,Web應用程序本身)通過將它粘在會話中來保持對有狀態bean的引用,這會將有狀態bean保持在服務器端處於活動狀態。 – Gimby

+0

@Gimby,這就是我試圖在我的答案中展示的那些。 –

+0

我知道,我不是抱怨(但我忘了upvote,對不起);我只是添加一些小故事來爲你的HOW添加一個WHY。海事組織這是非常重要的,尤其是因爲JEE教程解釋得相當糟糕。 – Gimby