2010-10-28 62 views
5

我有一個類public class GAE_SERVLETREQUESTServlet extends HttpServlet {servlet容器應該爲每個傳入請求創建新的javax.servlet.http.HttpServlet實例嗎?

不知道什麼是規範說的有關HTTPServlet的回收:如果servlet容器上的請求之間的每個傳入的請求還是可以執行重用班級創建這個新的類實例?

我在調查一個有趣的問題,看起來在GAE_SERVLETREQUESTServlet實例上創建的映射在請求之間維持狀態。

+0

Map是否定義爲實例變量? – JoseK 2010-10-28 12:35:57

+0

@JoseK:是的,受保護(不是靜態的)。 – 2010-10-28 13:02:39

+1

相關:http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC 2010-10-28 13:26:09

回答

11

對於一般情況 - 非分佈式,多線程,它保證只有一個servlet實例。從Servlet 3.0規範:

2.1請求處理方法

基本Servlet接口定義用於處理客戶請求服務的方法。 對servlet容器路由到servlet的實例 的每個請求調用此方法。 對Web應用程序的併發請求的處理通常要求Web開發人員設計Servlet,以便在特定時間處理在服務方法內執行的多個線程。 通常,Web容器通過在不同線程上併發執行服務方法來處理對同一個Servlet的併發請求。

2.2實例

該servlet聲明其是經由註釋如第8章所描述的數量, 「註解和可插拔」或部分含有Servlet的Web 應用程序的部署描述符,如第14章「部署 描述符」中所述,它控制servlet容器如何提供servlet實例。 對於不在分佈式環境中託管的servlet(默認),servlet 容器必須每個servlet聲明只使用一個實例。但是,對於實現SingleThreadModel接口的servlet ,servlet容器可能會實例化多個實例來處理沉重的請求負載,並將請求 的請求序列化到特定實例。

在一個servlet被派往標誌着 部署描述符爲分佈式應用程序的一部分的情況下,一個容器可以有每個Java虛擬機(JVM™)1元 只有一個實例的servlet聲明。但是,如果 可分發應用程序中的servlet實現SingleThreadModel接口,容器 可能會在容器的每個JVM中實例化該servlet的多個實例。

0

如果要保存與每個用戶相關的數據,則應將其存儲在HTTP會話中。如skaffman所述,不要將數據存儲在您希望每個用戶都不相同的servlet類中。 這是一個簡單的例子。

 

class MyServlet extends HttpServlet 
{ 
    private Object ThisIsTheWrongPlaceToStorePerUserData; 

    ... stuff ... doPut(HttpServletRequest httpRequest, ... more stuff ...) 
    { 
     Object iAmGood = new Object(); 
     HttpSession session = httpRequest.getSession(true); 

     session.setAttribute("GoodPlaceToStorePerUserData", iAmGood); 

     ... stuff ... 
    } 
} 
 
+0

我不想將對象存儲在會話中,因爲我沒有理由啓動cookie上的用戶,也不想存儲服務器端「每個用戶」狀態數據。這是後端服務,這是我開始尋找替代品的全部原因。我已經修復了我的代碼,坦白地說,我已經犯了這樣一個菜鳥錯誤,感到有些尷尬:) – 2010-10-28 13:01:53

相關問題