【问题标题】:How can state be maintained between Java Servlets?Java Servlet 之间如何维护状态?
【发布时间】:2010-11-29 13:21:57
【问题描述】:

情况

我有几个单一职责的 Servlet,它们接受请求、完成工作、响应并完成——在这些情况下不需要维护状态。

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

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

问题

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

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

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

【问题讨论】:

    标签: java web-applications servlets


    【解决方案1】:

    也许我理解你的问题是错误的,但你有没有想过会议?

    [编辑] 所以你真的需要这个会话。

    您可以通过这种方式使用会话:

    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 HttpSession 确实是这个问题中描述的内容。
    • +1 简单回答您认为是一个技巧性的问题
    • +1:是的,这听起来像是一个技巧问题,但我在阅读问题时也想到了会话。
    • 我毫不怀疑我要问的问题是一个 Servlet 初学者问题...您能否详细说明如何使用会话?顺便说一句,我需要共享此对象的单个实例(上面已编辑)。谢谢!
    • 谢谢我刚刚得出这个结论,现在这更有意义了。最后是逻辑和视图之间的一些分离。感谢您的帮助。
    【解决方案2】:

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

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

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

    【讨论】:

    • 大多数 servlet 容器应该支持节点间的会话复制
    • 我不会推荐它。它很少起作用(至少在 Tomcat 中)。在大多数情况下,我们会添加更多服务器,因为内存快用完了。现在你有 2 台服务器的内存都用完了……更不用说复制滞后了……memcached 是更好的解决方案。
    猜你喜欢
    • 2017-01-10
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多