web-dev-qa-db-ja.com

struts2-値スタックを理解する

Struts2の値スタックについて質問があります。次のようなexecuteメソッドを持つRegisterActionというActionクラスがあるとしましょう。

public String execute() {
    ValueStack stack = ActionContext.getContext().getValueStack();
    stack.Push(new String("test string"));
    return SUCCESS;
}

私のstruts.xmlは次のようになります。

<struts>
    <package name="default" extends="struts-default">
        <action name="*Register" method="{1}" class="vaannila.RegisterAction">
            <result name="populate">/register.jsp</result>
            <result name="input">/register.jsp</result>
            <result name="success">/success.jsp</result>
        </action>        
        <action name="*Test" method="{1}" class="vaannila.TestAction">
            <result name="test">/test.jsp</result>
            <result name="success">/success2.jsp</result>
        </action>        
    </package>
</struts>

したがって、executeメソッドがそのクラスで実行された後、制御はsuccess.jspに流れます。

私の質問は次のとおりです。

1)success.jspのスタックにプッシュした値を取得するにはどうすればよいですか?

2)success.jspTestActionというアクションクラスにリダイレクトする<s:submit method="testMethod" />があるとしましょう。つまり、[登録]ページで、ユーザーが[送信]をクリックし、RegisterActionのexecuteメソッドで「テスト文字列」をスタックにプッシュします。次に、success.jspに移動します。 success.jspには、TestAction#testMethodに誘導する送信ボタンがあります。 TestAction#testMethodで、RegisterAction#executeのスタックにプッシュした値はまだありますか?どうすれば入手できますか? Eclipseデバッガーをステップスルーしましたが、値が表示されません。

ありがとう。

17
dcp

わかりました、私はこれを理解しました。

1)jspからオブジェクトにアクセスできるように、値スタック上のオブジェクトを取得する方法は次のとおりです。

Map<String, Object> context = new HashMap<String, Object>();
context.put("key", "some object");
context.put("key2", "another object");
ActionContext.getContext().getValueStack().Push(context);

つまり、必要なオブジェクトを含む値スタックにHashMapを配置できます。次に、jspで、次のように実際の値にアクセスできます。

<s:property value="key" />
<s:property value="key2" />

値スタックを調べて、プッシュしたHashMapでそれらの値を見つけます。

2)アクションクラスのインスタンスは、1つのリクエストにのみ関連付けられています。したがって、別のアクションに移動して別のjspに到達すると、他のアクションには独自の値スタックがあるため、最初のアクションから値スタックにプッシュしたものは存在しません。参照: http://www.manning-sandbox.com/thread.jspa?messageID=93045

これが間違っている場合、またはこれらのことを行うためのよりスマートな方法がある場合は、自由に修正してください:)。

ありがとう。

16
dcp

次のようなプロパティを定義するだけです

String string1 = "test string";

あなたの行動で。

jspでは、直接アクセスできます。

例えば

 <s:property value="string1"/>

印刷されます

「テスト文字列」

2
Anil Punia

Struts 2は、実行時にアクションを値スタックの一番上に追加します。したがって、値スタックにデータを配置する通常の方法は、値のゲッター/セッターをActionクラスに追加することです。引き続きs:propertyタグを使用して値にアクセスします。

CRUDチュートリアル: http://struts.Apache.org/2.1.6/docs/crud-demo-i.html

2
Nate

通常、ネイトが言うように、アクションは常にValueStackにあるため、アクションでフィールドを使用します。ただし、インターセプターコードを記述している場合、テンプレート(JSP/freemarkerなど)が呼び出されるまでにインターセプターがなくなるため、これは機能しません。上記と同じように、ValueStackにある種のJava Beanのようなオブジェクトを配置する必要があります。

0
fool4jesus

こんにちは情報のためだけに

これらはgetValueStack().getContext()を使用することの欠点です。データが.ftlで利用できない場合があります(データは2行目に表示されていませんでしたが、1行目に表示されていました)。この理由は本当にわかりません。しかし、.getValueStack().set("resDTO",resDTO);を使用すると、問題は解決されました(両方の関数のデータが入力されていました)。

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
0