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.jsp
にTestAction
というアクションクラスにリダイレクトする<s:submit method="testMethod" />
があるとしましょう。つまり、[登録]ページで、ユーザーが[送信]をクリックし、RegisterAction
のexecuteメソッドで「テスト文字列」をスタックにプッシュします。次に、success.jsp
に移動します。 success.jsp
には、TestAction#testMethod
に誘導する送信ボタンがあります。 TestAction#testMethod
で、RegisterAction#execute
のスタックにプッシュした値はまだありますか?どうすれば入手できますか? Eclipseデバッガーをステップスルーしましたが、値が表示されません。
ありがとう。
わかりました、私はこれを理解しました。
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
これが間違っている場合、またはこれらのことを行うためのよりスマートな方法がある場合は、自由に修正してください:)。
ありがとう。
次のようなプロパティを定義するだけです
String string1 = "test string";
あなたの行動で。
jspでは、直接アクセスできます。
例えば
<s:property value="string1"/>
印刷されます
「テスト文字列」
Struts 2は、実行時にアクションを値スタックの一番上に追加します。したがって、値スタックにデータを配置する通常の方法は、値のゲッター/セッターをActionクラスに追加することです。引き続きs:propertyタグを使用して値にアクセスします。
CRUDチュートリアル: http://struts.Apache.org/2.1.6/docs/crud-demo-i.html
通常、ネイトが言うように、アクションは常にValueStackにあるため、アクションでフィールドを使用します。ただし、インターセプターコードを記述している場合、テンプレート(JSP/freemarkerなど)が呼び出されるまでにインターセプターがなくなるため、これは機能しません。上記と同じように、ValueStackにある種のJava Beanのようなオブジェクトを配置する必要があります。
こんにちは情報のためだけに
これらはgetValueStack().getContext()
を使用することの欠点です。データが.ftlで利用できない場合があります(データは2行目に表示されていませんでしたが、1行目に表示されていました)。この理由は本当にわかりません。しかし、.getValueStack().set("resDTO",resDTO);
を使用すると、問題は解決されました(両方の関数のデータが入力されていました)。
${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2