2009-09-21 22 views
2

我有一個由1個Web模塊和1個EJB模塊組成的Java EE應用程序。在我的EJB模塊內部,我有一個包含業務邏輯的有狀態會話bean。Web與EJB層之間的Java EE會話管理

我想的是:

當我的web應用程序用戶登錄並創建Web層我希望該用戶被分配我的會話bean的實例,一個新的會話。

目前正在按照預期在Web層創建一個會話,但我不確定每次如何將Web層中的會話映射到新的EJB會話。目前我正在從我的Servlet調用我的EJB,這意味着只有1個bean實例正在創建。我試圖在我的EJB層中的Web會話和會話之間獲得1-1映射。

我知道這可以很容易地使用應用程序客戶端,但任何建議/設計模式,我怎麼能在Web層實現這一點將不勝感激。

+0

您正在使用J2EE 1.4或JEE 5,即EJB 2.x或EJB 3?一個關於你在做什麼的代碼清單會有所幫助。 – 2009-09-21 12:03:37

+0

我正在使用EJB3.0 – Karl 2009-09-21 12:18:07

回答

3

有狀態會話並不總是一個好的選擇,有時使用持久化到數據庫更容易。

在servlet中,當處理來自用戶的請求時,獲取SFSB的「句柄」。把這個「句柄」放到你的HttpSession中。現在,當該用戶的下一個請求到達時,您已準備好了句柄。

使用EJB 3.0可以這樣做。

聲明與類範圍@EJB豆的參考,這將設置引用您將使用後

@EJB 
(name=「CounterBean", beanInterface=Counter.class) 
public class MyStarterServlet … 

當你處理請求:使用JNDI訪問EJB和聲明bean名稱,記這個代碼在你的doGet()和/或doPost()方法中,「counter」變量必須是本地的(在堆棧上),因爲servlet對象在同一時間在多個請求之間共享。

Context ctx = new InitialContext(); 
Counter counter = (Counter) 
ctx.lookup(「java:comp/env/CounterBean」); 
counter.increment(); 

存儲在HttpSession對象的接口來獲取需要

session.setAttribute(「counter」, counter); 
+0

+1。有一件事是新手經常不會想到的 - 他們將EJB引用(在您的示例中爲counter)聲明爲servlet的成員,從而使其成爲單例。 – 2009-09-21 12:26:43

+0

謝謝,試圖讓這個更清楚。 – djna 2009-09-21 12:34:37