Frage

Ich habe eine Frage bezüglich des struts2 Wertes Stack. Lassen Sie uns sagen, dass ich eine Action-Klasse namens RegisterAction haben, die ein Verfahren auszuführen hat, wie folgt:

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

Meine struts.xml sieht wie folgt aus:

<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>

So Kontrolle fließt in den success.jsp nach der Methode execute führt in dieser Klasse.

Meine Fragen sind:

1) wie bekomme ich den Wert, den ich auf dem Stapel in der success.jsp geschoben?

2) Lassen Sie sich in success.jsp sagen, ich habe eine <s:submit method="testMethod" />, die zu einer Action-Klasse genannt TestAction umleitet. Mit anderen Worten, aus dem Register Seite trägt die Benutzer klickt und in der Execute-Methode des RegisterAction wir drücken Sie den „Test-String“ auf dem Stapel. Dann gehen wir zum success.jsp. Die success.jsp hat einen Submit-Button, der uns leitet TestAction#testMethod. In TestAction#testMethod ist der Wert, den ich auf dem Stapel in RegisterAction#execute noch geschoben? Wie kann ich es bekommen? Ich trat durch den Eclipse-Debugger aber ich weiß nicht, den Wert sehen.

Danke.

War es hilfreich?

Lösung

Ok, ich dachte, dies.

1) Die Art, wie ich gefunden Objekte auf dem Wert-Stack bekommen, damit wir sie von einem jsp zugreifen können, ist wie folgt:

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

Mit anderen Worten, wir können einen HashMap auf den Wert Stapel gelegt, die Objekte enthalten, die wir brauchen. Dann wird in der jsp, können wir die aktuellen Werte wie folgt zugreifen:

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

Es wird der Wert Stapel schauen und diese Werte in der HashMap wir geschoben finden.

2) Eine Instanz der Action-Klasse mit nur einer Anforderung zugeordnet. Wenn wir also zu einer anderen Aktion gehen und dann an einem anderen jsp am Ende, schoben die Sachen, die wir auf dem Wert Stapel von der ersten Aktion wird nicht da sein, da die andere Aktion hat ein eigener Wert Stapel ist. Referenz: http://www.manning-sandbox.com/thread.jspa?messageID = 93045

Ihr Jungs können sich frei fühlen, mich zu korrigieren, wenn irgendetwas davon falsch ist oder wenn es intelligentere Wege, diese Dinge zu tun.)

Danke.

Andere Tipps

Struts 2 fügt die Aktion an die Spitze des Wertes Stapel wenn sie ausgeführt werden. Also die übliche Art und Weise Material auf dem Wert Stapel zu legen ist Getter / Setter für die Werte auf Ihre Action-Klasse hinzuzufügen. Sie verwenden immer noch die s: Eigenschaftstag die Werte für den Zugriff

.

Ein CRUD Tutorial: http: //struts.apache .org / 2.1.6 / docs / crud-Demo-i.html

definiert nur eine Eigenschaft wie

String string1 = "test string";

in Ihrer Aktion.

in jsp Sie direkt zugreifen können.

z

 <s:property value="string1"/>

wird auszudrucken

  

"test string"

Normalerweise wie Nate sagt, werden Sie ein Feld in Ihrer Aktion verwenden, da die Aktion immer auf der ValueStack ist. Allerdings funktioniert das nicht, wenn Sie Abfangjäger Code schreiben, da die Abfangjäger wird die Vorlage (JSP / Freemarker usw.) durch die Zeit verschwunden sein wird aufgerufen. Es müssen Sie auf dem ValueStack eine Art von Java Bean-ähnlichen Objekt setzen, so wie Sie oben tun.

Hallo nur für Informationen

Diese

ist ein Nachteil der Verwendung getValueStack().getContext() manchmal die Daten in .ftl nicht verfügbar war (Daten nicht in line2 zeigen, aber es kam in line1) ich nicht wirklich den Grund dafür wissen. Aber mit .getValueStack().set("resDTO",resDTO); das Problem gelöst wurde (Daten war immer für beide Funktionen bestückt).

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top