2012-07-17 91 views
0

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

我該如何繼續?

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

+0

當你說session時,是指用戶的http會話訪問你的站點,還是你的意思是對servlet的單個請求? – 2012-07-17 19:06:23

+0

當我說會話時,我的意思是用戶的http會話訪問我的網站。 – user1521526 2012-07-17 19:47:04

回答

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本身可能imple因此您可以在綁定和解除綁定到會話期間執行一些邏輯。

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

} 
+0

Balusc我試圖實例化它在我的doGet()方法,但似乎連我保存對象與request.getSession()。的setAttribute(「X」,X)的方法,當我設法得到它的對象始終是NULL – user1521526 2012-07-17 19:40:55

+0

那麼無論是會話不好好保養(使用Web瀏覽器的開發者工具集來跟蹤'JSESSIONID'餅乾),或者你使用了錯誤的屬性名稱(區分大小寫!),或者你實際上已經把'null'它。 – BalusC 2012-07-17 19:46:09

+0

我查了一下,似乎會話沒有正確維護。你知道我該如何保持會議活着嗎?我嘗試了「request.getSession()。setMaxInactiveInterval(30 * 60)」,但它不起作用 – user1521526 2012-07-17 20:10:38

2

我想實例化一個對象的第一個請求,並使用它,直到會話結束。

那麼,這表明你應該把它放在會話中,而不是在servlet中。

this tutorial周邊使用會話從Java servlet的一些細節。請注意,如果您想擴展到多個服務器,您需要仔細考慮如何影響sessoins。 (你可以堅持在一個數據庫中的會話信息,或者嘗試配置您的負載平衡器發送所有請求相同的會話在同一臺機器等)