2010-12-11 2 views
0

私はSessionAwareを実装している私のアプリケーションを(このポータルの一部のユーザーに感謝します)作成します。Struts2 - セッションのトラブル

これは私の実際のコードです:

public class UserManager extends ActionSupport implements SessionAware { 
    private Map<String, Object> session; 

    @Override 
    public String execute() throws Exception { 
     return SUCCESS; 
    } 

    public void setSession(Map<String, Object> map) { 
     this.session=map; 
    } 

    public String checkLogin() {   
     session.put("loggedOn", true); 
     return SUCCESS; 
    } 

    public String checkLogout() { 
     session.clear(); 
     return SUCCESS; 
    } 
} 

と私は私の.jspファイルにこれらの変数をチェック:コードの

<s:if test="#session['loggedOn']!=true"> 
    DIV LOGIN 
</s:if> 
<s:else> 
    DIV LOGOUT 
</s:else> 

簡単に作品を。

何私が知りたいことはこれです:

1 - Beanは、要求がスコープ(デフォルトとして)です。リクエストが終了すると、それは破壊されます。しかし、私はマップに変数を置くと、それがサーバー上にまだ生きているのを見ます。どのように可能ですか?私の豆の変数です。

2 - 誰がsetSessionメソッドを呼び出しますか?私はサーブレットは、そのインターフェイスを実装しているという事実のために思う?

3 - セッションオブジェクトにオブジェクト/ Beanを保存することについて切り離したいと思います。私はどのような種類のMVCフレームワークもスコープされたBeanセッションを使用したいと思います。 struts2でどうすればいいですか?

は、あなたがこれらの質問を明確にすることを願って:)乾杯

答えて

3

1))の要求よりも制限の範囲である(スコープなど、それはアクションであるとしてあなたのBeanはStruts2のアクションです。あなたはアクションを別のアクションに転送することができます。その場合、前のアクションが範囲外になり、スコープされたオブジェクトをリクエストすると、要求が処理されるまでスコープ内に残ります。 SessionAwareを実装すると、SessionObjectへの参照が提供されます。セッションオブジェクトにオブジェクトを配置すると、その寿命はあなたの動作よりもはるかに長くなります。ブラウザのキャッシュをクリアするとセッションの値が削除されます... SessionAwareを実装してマップから値を削除することで、コードを削除することもできます。

2 - セッションは既に存在します。セッションを取得してキーを追加することはできますが、何も入れていなくても使用することができます。

3 - あなたはすでにこのトピックの質問があります。

+0

1&2 - これでOKです。セッションマップ参照は、アクションビーン 'public void setSession(Map map){this.session = map;}にセットされます。 } '。しかしWHOはこの方法を呼びますか?私はアクション(私はそのBeanと呼ぶ)をするとき、私はこの関数が呼ばれていることを知っている...どのように可能ですか?サーブレットですか? – markzzz

+1

いいえ、それを行うインターセプターはありません! struts.xmlには、パッケージ宣言に 'extends = "struts-default"'という文字が含まれているので、これはどういう意味ですか?あなたの行動はそれに設定されたフォームからどのように値を取得しますか?あなたのセッションは自動的にどのように呼び出されますか?値はあなたのアクションからJSPにどのように得られますか? ...それはすべてインターセプタによって行われます...重要なことを見てみる必要があります:Struts2-core-xxxjar(xxxは現在のバージョン)を開き、デフォルトのパッケージを見て、struts-default.xmlを開きます'package name = "struts-default"'、 – Quaternion

+0

'interceptor-stack name = "defaultStack"'これはインターセプタのリストで、アクションに達するまで順番に呼び出され、それらのすべてが戻ってくる要求が処理されるまでスタックを起動します。そこから他のスタックを選択することはできませんが、一番下の 'default-interceptor-ref name = "defaultStack"'に表示されるので、このパッケージ内のこのスタックが使用されている理由です=)今度はスタックリストインターセプタは名前でも上位にあれば、定義されたすべてのインターセプタとクラス(xwork jarファイル)を見ることができますので、すぐにこれをスキップして、それぞれのクラスを – Quaternion