0

HttpServletクラスを拡張するクラスがあります。Javaはマルチスレッドであり、異なるスレッド(読み取り:HTTPリクエスト)が同じインスタンスを利用できることを私は知っています。最初のリクエストでオブジェクトをインスタンス化し、セッションが終了するまで使用したいと思います。

どうすればいいですか?

例:最初のリクエストでファイルを開き、セッションの最後にファイルを閉じたい。

4

2 に答える 2

3

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.
    }

}
于 2012-07-17T19:07:47.050 に答える
2

最初のリクエストでオブジェクトをインスタンス化し、セッションが終了するまで使用したいと思います。

それは、サーブレットではなく、セッションに配置する必要があることを示しています。

Javaサーブレットからのセッションの使用に関する詳細については、このチュートリアルを参照してください。複数のサーバーにスケールアウトする場合は、それがセソインにどのように影響するかを慎重に検討する必要があることに注意してください。(セッション情報をデータベースに保持したり、同じセッションのすべての要求を同じマシンに送信するようにロードバランサーを構成したりすることができます。)

于 2012-07-17T19:06:02.840 に答える