如何在Java Servlets之间维护状态?

时间:2009-09-18 16:23:14

标签: java web-applications servlets

场合

我有一些单一责任的Servlet接受请求,完成工作,做出响应并完成 - 在这些情况下不需要维护状态。

但是,我有“普通的旧Java对象”,它根据用户在客户端上启动的操作来维护状态信息,我希望根据请求提供给我的Servlet。我想使这个对象的单个实例可用,并且不需要/想要维护多个共享实例。

附注:这些数据是暂时的(可能需要保留10分钟),而不是我想保留在数据库中的。

问题

我之前使用JSP维护了一个对象的共享实例,但在这种情况下,Servlet更有意义。所以,我的问题是如何适当地管理这个维护状态的对象的生命周期,并且可以通过HTTP请求或其他一些机制在无状态Servlet之间共享它?

换句话说,如果这是一个非Web应用程序,无状态Servlet将是我将任务委托给的对象,有状态对象将保持结果。

我已经研究过ServletContext,但我并不完全明白这个目的是为了知道这是否是我需要的。

2 个答案:

答案 0 :(得分: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应该引导你如何使用它来获得更高级的东西。

答案 1 :(得分:1)

如果可以将所有servlet保存在同一个webapp(context)下,则可以将会话存储到ServletContext或HttpSession中。

如果您需要多个实例,ServletContext / HttpSession将不起作用。我建议将会话存储在memcached中。

在任何情况下,您都需要自己管理会话超时。