2016-08-12 2 views
3

誰かが私を助けることができますか?Java - セッションまたはリクエストオブジェクトをサーブレットからJavaクラスに渡す方法

サーブレットから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) { 

......

}このクラスでは、セッションオブジェクトを使用する方法

ありがとうございます。 アンジュ

+0

あなたの 'ProductsCart'クラスのメソッドは、それを使うためにセッションにアクセスする必要があります。あなたの質問は何ですか? –

答えて

-1

このコード(ProductsCart)に到達するまであなたのサーブレットからの流れはどのようになっていますか?より良い提案を提供するのに役立つかもしれないことを知っているかもしれません。

コンテキストを共有する簡単な方法の1つは、リクエスト全体が単一のスレッドで処理されている場合(Uは非同期呼び出しをしていないか、間に新しいスレッドを生成していない)、スレッドローカルを使用できます。スレッドサーブレットクラスとProductsCartクラスの両方が可視性を持つ共通の場所にスレッドを宣言する必要があります。

SessionContext.setSession(session); 

をそしてProductsCartからuがそれにアクセスすることができます

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サーブレットクラスからuがそれを設定することができます。

スレッドごとに1つのローカル変数があり、前述のように、同じスレッドからフロー全体を実行している場合にのみ動作します。 uが新しいスレッドを生成している場合は、InheritableThreadLocalを試すことがあります。新しいスレッドは、親スレッドから値を継承します。しかし、もしあなたがスレッドプールまたはaynchrounous呼び出しを使用している場合、これは動作しません。その場合、それをクラスに渡す方が良いでしょう。

また、サーブレットから返ってきたときには、別のリクエストで無意識に使用されないようにnullに設定してください。

関連する問題