2011-03-16 63 views
2

我有一個login.java servlet,正如其名稱所述,它爲我的Web應用程序提供了登錄功能。如何從servlet調用EJB 3.1非零參數構造函數?

我是新手,我使用EJB 3.1和EE 6.在我的LoginBean.java EBJ中,我有一個無參數構造函數,另一個有一些參數(電子郵件,密碼等)。

在servlet代碼某一點我必須調用實例我EJB:

@EJB LoginBean loginBean; 

我想知道這是否是可能的(以及如何)來調用其他的構造函數,而不是零的論據之一。

非常感謝。 乾杯。

回答

4

你不想這樣做。所有用戶共享同一個servlet,因此EJB也在所有用戶之間共享。您不希望將用戶特定的數據存儲爲servlet或EJB類的實例變量。它將在所有網頁訪問者之間共享。

而是將參數移動到您在登錄servlet的doPost()方法中調用的EJB方法。

User user = loginBean.login(username, password); 

,然後其存儲在HTTP會話時它去成功

request.getSession().setAttribute("user", user); 

讓你的web應用的其餘部分可以在這個攔截,以確定用戶登錄或沒有。

if (request.getSession().getAttribute("user") != null) { 
    // User is logged in. 
} else { 
    // User is not logged in. 
} 
+0

我明白了。其實我對servlets和EJB的工作流程有些困惑。現在很明顯。再次感謝。 – LucasM 2011-03-19 09:26:59

1

我100%贊同BalusC。除了他的回答之外,我想補充一點,即使這樣做理論上有意義(例如傳遞某些依賴關係或某個配置參數時),您通常不會明確引用EJB bean的構造函數。

EJB bean是託管對象,您在@EJB註釋字段中獲得的內容不是實際對象,而是stub(代理)。存根指向的實際對象實例最有可能在獲取此存根之前就已經建立很久,並且很可能來自池。

(*)某些類型的單元測試可能是此規則的一個例外。

+0

是的,現在很明顯。我確實確實沒有直接訪問EJB,而是直接訪問它的存根(在本地)。我還讀了一些關於存根,骨架,RemoteObject(和其他一些EE <5框架相關)的東西。理解代碼注入是如何通過註釋完成是很有用的。謝謝! – LucasM 2011-03-19 09:30:35

相關問題