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

如何在Java servlet之间维护状态?,java,web-applications,servlets,Java,Web Applications,Servlets,形势 我有几个单独负责的servlet,它们接受请求、完成任务、响应并完成任务——在这些情况下不需要维护任何状态 然而,我有一个“普通的旧Java对象”,它根据用户在客户机上发起的操作维护状态信息,我希望在我的servlet请求时提供这些操作。我希望此对象的单个实例可用,并且不需要/不希望维护多个共享实例 旁注:这些数据是暂时的(可能需要保存10分钟),并不是我想要保存在数据库中的东西 问题 我以前用JSP维护过一个对象的共享实例,但在这种情况下,Servlet更有意义。所以,我的问题是如何适当

形势

我有几个单独负责的servlet,它们接受请求、完成任务、响应并完成任务——在这些情况下不需要维护任何状态

然而,我有一个“普通的旧Java对象”,它根据用户在客户机上发起的操作维护状态信息,我希望在我的servlet请求时提供这些操作。我希望此对象的单个实例可用,并且不需要/不希望维护多个共享实例

旁注:这些数据是暂时的(可能需要保存10分钟),并不是我想要保存在数据库中的东西

问题

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

换句话说,如果这是一个非web应用程序,无状态servlet将是我将任务委托给的对象,有状态对象将维护结果


我已经研究了ServletContext,但我不完全理解其目的,不知道这是否是我所需要的。

也许我理解您的问题是错误的,但您是否考虑过该课程

[编辑] 所以你真的需要这个课程

例如,您可以通过以下方式使用会话:

public class TestServlet extends HttpServlet {
....
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
    request.getSession().setAttribute("test", new Date());
  }
....
}
存储在那里的对象应该是可序列化的IIRC


如果您使用eclipse或netbeans,则code insight功能和javadoc将引导您如何将其用于更高级的内容。

如果您可以将所有servlet保持在同一webapp(上下文)下,则可以将会话存储到ServletContext或HttpSession中

如果需要多个实例,ServletContext/HttpSession将无法工作。我建议将会话存储在memcached中


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

+1 HttpSession确实就是这个问题中所描述的。+1对于您认为是一个诡计问题的简单答案+1:是的,听起来像是一个诡计问题,但在阅读问题时,我也想到了会话。毫无疑问,我问的问题是一个Servlet初学者问题……您能详细说明如何使用会话吗?顺便说一下,我需要这个对象的一个实例来共享(在上面编辑)。谢谢谢谢,我刚刚得出了这个结论,现在这更有意义了。最后是逻辑和视图之间的一些分离。感谢您的帮助。大多数servlet容器都应该支持节点间的会话复制,我不建议这样做。它很少起作用(至少在Tomcat中是这样)。在大多数情况下,由于内存不足,我们会添加更多服务器。现在有两台服务器内存都用完了。。。甚至不提复制滞后。。。memcached是更好的解决方案。