struts2 - das Verständnis der Wert Stapel
-
05-07-2019 - |
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.
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