簡體   English   中英

如何在擴展HttpServlet的類中實例化Object?

[英]How to instantiate an Object in a class which extends HttpServlet?

我有一個擴展HttpServlet類的類。 我知道Java是多線程的,不同的線程(閱讀:HTTP請求)可以使用同一實例。 我想在第一個請求上實例化一個對象,並在會話結束之前使用它。

我應該如何進行?

例如:我想在第一個請求上打開一個文件,並在會話結束時將其關閉。

您可以自己在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.
    }

}

我想在第一個請求上實例化一個對象,並在會話結束之前使用它。

好吧,這建議您將其放在會話中,而不是在Servlet中。

有關使用Java servlet的會話的一些詳細信息,請參見本教程 請注意,如果要擴展到多個服務器,則需要仔細考慮這對芝麻素的影響。 (您可以將會話信息保留在數據庫中,或嘗試將負載均衡器配置為將同一會話的所有請求發送到同一台計算機等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM