servlet容器是否应为每个传入请求创建新的javax.servlet.http.HttpServlet实例?

时间:2010-10-28 12:31:06

标签: java servlets

我有一个班级public class GAE_SERVLETREQUESTServlet extends HttpServlet {

不确定有关回收HTTPServlet的规范:servlet容器是否应该在每个传入请求上创建此类的新实例,或者实现可以在请求之间重用类?

我正在调查一个有趣的问题,即在GAE_SERVLETREQUESTServlet实例上创建的Map似乎在请求之间保持状态。

2 个答案:

答案 0 :(得分:11)

对于一般情况 - 非分布式,多线程,保证只有一个servlet实例。从Servlet 3.0规范:

  

2.1请求处理方法

     

基本的Servlet接口定义了一个用于处理客户端请求的服务方法。   为servlet容器路由到实例的每个请求调用此方法   一个servlet。   处理对Web应用程序的并发请求通常需要   Web Developer设计servlet,可以处理在其中执行的多个线程   特定时间的服务方法。   通常,Web容器处理对同一个servlet的并发请求   在不同线程上并发执行服务方法。

     

2.2实例数

     

servlet声明,它通过第8章中描述的注释,   “注释和可插拔性”或Web的部署描述符的一部分   包含servlet的应用程序,如第14章“部署”中所述   Descriptor“,控制servlet容器如何提供servlet的实例。   对于未在分布式环境中托管的servlet(默认),servlet   容器每个servlet声明只能使用一个实例。但是,对于servlet   实现SingleThreadModel接口,servlet容器可以   实例化多个实例以处理繁重的请求加载和序列化请求   一个特定的例子。

     

在将servlet部署为标记为的应用程序的一部分的情况下   部署描述符为可分发的,容器每个只有一个实例   每个Java虚拟机(JVM™)的servlet声明1。但是,如果servlet在   distributable应用程序实现SingleThreadModel接口,即容器   可以在容器的每个JVM中实例化该servlet的多个实例。

答案 1 :(得分: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 ...
    }
}