我有一个扩展HttpServlet类的类。我知道Java是多线程的,不同的线程(读取:HTTP请求)可以使用相同的实例。我想在第一个请求上实例化一个Object并使用它直到会话结束。
我该怎么办?
例如:我想在第一个请求上打开一个文件,并在会话结束时关闭它。
答案 0 :(得分:3)
你可以自己在一个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.
}
}
答案 1 :(得分:2)
我想在第一个请求上实例化一个Object并使用它直到会话结束。
嗯,这表明你应该把它放在会话中,而不是在servlet中。
有关使用Java servlet中的会话的详细信息,请参阅this tutorial。请注意,如果要扩展到多个服务器,则需要仔细考虑这对sessoins的影响。 (您可以将会话信息保留在数据库中,或尝试将负载均衡器配置为将同一会话的所有请求发送到同一台计算机等。)