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