【问题标题】:How to instantiate an Object in a class which extends HttpServlet?如何在扩展 HttpServlet 的类中实例化对象?
【发布时间】:2012-07-16 18:23:11
【问题描述】:

我有一个扩展 HttpServlet 类的类。我知道 Java 它是多线程的,不同的线程(阅读:HTTP 请求)可以使用同一个实例。我想在第一次请求时实例化一个对象并使用它直到会话结束。

我应该如何进行?

例如:我想在第一个请求时打开一个文件并在会话结束时关闭它。

【问题讨论】:

  • 当您说会话时,您是指访问您网站的用户的 http 会话还是对 servlet 的单个请求?
  • 当我说会话时,我的意思是用户的 http 会话访问我的网站。

标签: java http session servlets


【解决方案1】:

您可以自己在 servlet 的 doXxx() 方法之一中实例化它,具体取决于它在会话中的存在情况

SomeObject someObject = (SomeObject) request.getSession().getAttribute("someObject");

if (someObject == null) {
    someObject = new SomeObject();
    request.getSession().setAttribute("someObject", someObject);
}

// Use someObject.

或者您可以自己在 HttpSessionListener 中实例化它

@WebListener
public class SomeObjectInitializer implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        event.getSession().setAttribute("someObject", new SomeObject());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        // NOOP.
    }

}

无论哪种方式,SomeObject 本身都可以实现HttpSessionBindingListener,以便您可以在绑定和取消绑定到会话期间执行一些逻辑。

public class SomeObject implements HttpSessionBindingListener {

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        // Perform job during adding to the session.
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        // Perform job during removal from the session.
    }

}

【讨论】:

  • Balusc 我试图在我的 doGet() 方法中实例化它,但似乎即使我用 request.getSession().setAttribute("x",x) 方法保存对象,当我尝试明白了,对象总是NULL
  • 那么要么没有正确维护会话(使用 webbrowser 的开发人员工具集来跟踪 JSESSIONID cookie),要么您使用了错误的属性名称(区分大小写!),或者您实际上已经输入了 @987654331 @ 在里面。
  • 我检查了一下,似乎没有正确维护会话。你知道我怎样才能让会话保持活力吗?我试过“request.getSession().setMaxInactiveInterval(30*60)”,但没用
  • 您需要确保您的网络浏览器启用了 cookie,并且您没有在任何地方调用 session.invalidate()。 setMaxInactiveInterval() 应该不是必需的。它已经默认为 30 秒。
  • 我的浏览器启用了 cookie。我检查了源代码,我没有调用 invalidate() 方法。你有别的想法吗?
【解决方案2】:

我想在第一次请求时实例化一个对象并使用它直到会话结束。

嗯,这表明你应该把它放在会话中,而不是放在 servlet 中。

请参阅this tutorial 了解有关使用 Java servlet 会话的一些详细信息。请注意,如果您想扩展到多台服务器,则需要仔细考虑这会如何影响 sessoins。 (您可以将会话信息保存在数据库中,或者尝试将负载均衡器配置为将同一会话的所有请求发送到同一台机器等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2017-05-13
    相关资源
    最近更新 更多