2009-09-18 114 views
4

形势Java Servlets之间如何维护状态?

我有需要的要求,做好本职工作,作出回应,并做了几单责任的Servlet - 没有国家需要保持在这些情况下。

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

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

问题

我都保持与前JSP的对象的共享实例,但在此,壳体一个Servlet更有意义。所以,我的问题是如何恰当地管理维护状态的对象的生命周期,并且可以通过HTTP请求或其他机制在无状态Servlet之间共享它?换句话说,如果这是一个非web应用程序,那么无状态的Servlets将成为我将委托给任务的对象,而有状态的对象将维护结果。

我已经看过ServletContext,但我不完全理解这个的目的,以了解这是否是我需要的。

回答

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应该引导您如何将它用于更高级的东西。

+3

+1 HttpSession的确是在这个问题中描述的。 – 2009-09-18 16:29:06

+3

+1对于你认为是一个诡计问题的简单回答 – Zoidberg 2009-09-18 16:31:22

+3

+1:是的,它听起来像一个技巧性的问题,但会议是我在阅读这个问题时脑海里浮现的问题。 – Powerlord 2009-09-18 16:54:29

1

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

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

无论如何,您需要自己管理会话超时。

+0

大多数servlet容器应该支持节点间的会话复制 – 2009-09-18 16:46:28

+0

我不会推荐它。它很少工作(至少在Tomcat中)。在大多数情况下,我们添加更多的服务器,因为内存不足。现在你有两台服务器都用完了内存......甚至没有提到复制滞后...... memcached是更好的解决方案。 – 2009-09-18 16:54:03