2010-10-28 118 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

相关问题