2016-08-12 65 views
3

有人能幫助我嗎?Java - 如何將會話或請求對象從servlet傳遞給java類?

如何將會話或請求對象從servlet傳遞給java類,無論是在某種方法中,還是在java類的構造函數中。

SERVLET:

HttpSession session = request.getSession(true); 

我想通過這個會話對象的Java類,有些人告訴我如何檢索和使用。

的Java類

公共類ProductsCart {

private Map<Integer, Integer> productsInCart=new HashMap<Integer,Integer>(); 

public Map<Integer, Integer> storeProductsInCart(int productId, int count) { 

......

}

如何使用會話對象在這個類?

在此先感謝。 Anju

+0

您的ProductsCart類中的方法需要訪問該會話才能使用它。你的問題是什麼? –

回答

-1

你的servlet到你達到這個代碼(ProductsCart)的流量是多少?可能知道這可能有助於提供更好的建議。一個簡單的共享上下文的方法是這樣的 - 如果你的整個請求是在單個線程中處理的(你沒有異步調用或者不會在中間產生新線程),你可以使用本地線程。您需要在線servlet類和ProductsCart類具有可見性的常見位置聲明本地線程。現在

public class SessionContext { 

    private static final ThreadLocal<HttpSession> activeSession = 
              new ThreadLocal<HttpSession>(); 

    public HttpSession getSession() { 
     return activeSession.get(); 
    } 

    public void setSession (HttpSession session) { 
     activeSession.set(session); 
    } 
} 

從u servlet類U可以將其設置:

SessionContext.setSession(session); 

而且從ProductsCart u能訪問它。

HttpSession session = SessionContext.getSession() 

將有每一個線程的線程局部變量的一個副本,如前所述,這隻會如果u正在執行從同一個線程的整個流程工作。如果你產生新的線程,你可以嘗試InheritableThreadLocal。新線程將繼承父線程的值。但是,如果你使用線程池或異步調用,這將不起作用。在這種情況下,最好把它傳遞給班級。

另外,當您從servlet返回時,請確保將其設置爲null,以便其他請求不會在不知情的情況下使用它。

相關問題