2009-09-18 81 views
4

形勢Java Servlets之間如何維護狀態?

我有需要的要求,做好本職工作,作出迴應,並做了幾單責任的Servlet - 沒有國家需要保持在這些情況下。

但是,我有我「簡單的舊Java對象」,它基於用戶在客戶端啓動的操作來維護狀態信息,我希望根據請求將其提供給我的Servlet。我想讓這個對象的單個實例可用,並且不需要/想要維護多個共享實例。

注意:這些數據是暫時的(需要保留10分鐘),而不是我想保留在數據庫中的東西。

問題

我都保持與前JSP的對象的共享實例,但在此,殼體一個Servlet更有意義。所以,我的問題是如何恰當地管理維護狀態的對象的生命週期,並且可以通過HTTP請求或其他機制在無狀態Servlet之間共享它?換句話說,如果這是一個非web應用程序,那麼無狀態的Servlets將成爲我將委託給任務的對象,而有狀態的對象將維護結果。

我已經看過ServletContext,但我不完全理解這個的目的,以瞭解這是否是我需要的。

回答

13

也許我理解你的問題是錯誤的,但你有沒有想過會議?

所以你真的需要這個會話。

您可以使用會話例如是這樣的:

public class TestServlet extends HttpServlet { 
.... 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    request.getSession().setAttribute("test", new Date()); 
    } 
.... 
} 

你存儲在那裏的對象, 需要 應該是可序列化IIRC。

如果您使用eclipse或netbeans,代碼洞察功能和javadoc應該引導您如何將它用於更高級的東西。

+3

+1 HttpSession的確是在這個問題中描述的。 – 2009-09-18 16:29:06

+3

+1對於你認爲是一個詭計問題的簡單回答 – Zoidberg 2009-09-18 16:31:22

+3

+1:是的,它聽起來像一個技巧性的問題,但會議是我在閱讀這個問題時腦海裏浮現的問題。 – Powerlord 2009-09-18 16:54:29

1

如果您可以將所有servlet保留在同一個webapp(上下文)下,則可以將會話存儲到ServletContext或HttpSession中。

如果你需要多個實例,ServletContext/HttpSession不會工作。我會建議將會話存儲在memcached中。

無論如何,您需要自己管理會話超時。

+0

大多數servlet容器應該支持節點間的會話複製 – 2009-09-18 16:46:28

+0

我不會推薦它。它很少工作(至少在Tomcat中)。在大多數情況下,我們添加更多的服務器,因爲內存不足。現在你有兩臺服務器都用完了內存......甚至沒有提到複製滯後...... memcached是更好的解決方案。 – 2009-09-18 16:54:03