我有一个班级public class GAE_SERVLETREQUESTServlet extends HttpServlet {
不确定有关回收HTTPServlet的规范:servlet容器是否应该在每个传入请求上创建此类的新实例,或者实现可以在请求之间重用类?
我正在调查一个有趣的问题,即在GAE_SERVLETREQUESTServlet实例上创建的Map似乎在请求之间保持状态。
答案 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 ...
}
}