HttpServletクラスを拡張するクラスがあります。Javaはマルチスレッドであり、異なるスレッド(読み取り:HTTPリクエスト)が同じインスタンスを利用できることを私は知っています。最初のリクエストでオブジェクトをインスタンス化し、セッションが終了するまで使用したいと思います。
どうすればいいですか?
例:最初のリクエストでファイルを開き、セッションの最後にファイルを閉じたい。
doXxx()
セッションでの存在に応じて、サーブレットのメソッドの1つで自分でインスタンス化することもできます。
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.
}
}
最初のリクエストでオブジェクトをインスタンス化し、セッションが終了するまで使用したいと思います。
それは、サーブレットではなく、セッションに配置する必要があることを示しています。
Javaサーブレットからのセッションの使用に関する詳細については、このチュートリアルを参照してください。複数のサーバーにスケールアウトする場合は、それがセソインにどのように影響するかを慎重に検討する必要があることに注意してください。(セッション情報をデータベースに保持したり、同じセッションのすべての要求を同じマシンに送信するようにロードバランサーを構成したりすることができます。)