17

struts2の値スタックについて質問があります。RegisterAction次のようにexecuteメソッドを持つ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ます。つまり、[登録]ページで、ユーザーが[送信]をクリックし、の実行メソッドで「テスト文字列」をスタックにプッシュします。次に、に移動します。には、に移動するための送信ボタンがあります。で、スタックにプッシュした値はまだそこにありますか?どうすれば入手できますか?Eclipseデバッガーをステップ実行しましたが、値が表示されません。<s:submit method="testMethod" />TestActionRegisterActionsuccess.jspsuccess.jspTestAction#testMethodTestAction#testMethodRegisterAction#execute

ありがとう。

4

5 に答える 5

17

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

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

これが間違っている場合、またはこれらのことを行うためのより賢い方法がある場合は、私を自由に修正できます:)。

ありがとう。

于 2009-11-27T01:27:31.257 に答える
2

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

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

于 2009-11-28T11:35:35.340 に答える
2

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

String string1 = "test string";

あなたの行動で。

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

例えば

 <s:property value="string1"/>

印刷されます

「テスト文字列」

于 2012-06-06T16:43:28.613 に答える
0

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

于 2010-03-09T14:36:31.027 に答える
0

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

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

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
于 2011-02-16T04:08:08.633 に答える