Ist der ValueStack-Lebenszyklus anwendungsübergreifend in struts2?
-
15-11-2019 - |
Frage
Ich kann eine Eigenschaft festlegen ValueStack
In vielen Wegen.
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("resultDTO",resultDTO); //1. creates a different branch
//parallel to root
stack.set("resultDTO", resultDTO); //2. pushes on root as a Map?
stack.push(resultDTO); //3. pushes on root
myActionClass.setProperty(); //4. normal action accessor
Ich muss in der Lage sein, alle diese Werte in JSP, Freemarker und Java wiederherzustellen
stack.findValue() or stack.findString().
Ich möchte mehr über den Lebenszyklus jeder dieser vier Einstellungsmethoden erfahren.Ist es anwendungsübergreifend?Ist der ValueStack Jede Anfrage erstellt und die Anwendungs- und Sitzungswerte für jede Anfrage darin festgelegt?
Ich weiß, dass die vierte Methode der gebräuchlichste Ansatz ist, aber ich verwende sie möglicherweise nicht überall dort, wo die Aktionsklasse nicht leicht zugänglich ist.
Ich habe weitere Zweifel bezüglich des Zugriffs in JSP
<s:push value="resultDTO" ><s:property value="data.form1[0]" /></s:push>
<!--5.works for context.put() & stack.set() both-->
<s:property value="#resultDTO.data.form1[0].countryofissue" /> <!--6.context.put()-->
<s:property value="resultDTO.data.form1[0].countryofissue" /> <!--7.stack.set()-->
<s:property value="data.form1[0].countryofissue" /> <!--8.stack.push()-->
Ich möchte auch wissen, wie der 5. Punkt in beiden Fällen funktioniert stack.getContex().put()
Und stack.set()
?Ich verstehe das im 6 resultDTO Ich greife darauf zu, es ist ein anderer Root und im 7. ist es das untergeordnete Element des Standard-Roots, nämlich ValueStack.Im 8. beginnt die Suche im Standard-Root.
Ich ging durch http://struts.apache.org/2.0.11.1/docs/ognl.html, http://struts.apache.org/2.1.2/struts2-core/apidocs/com/opensymphony/xwork2/util/ValueStack.html und dieser Link ist ziemlich verwirrend http://www.opensymphony.com/ognl/html/DeveloperGuide/introduction.html#embeddingOGNL
Trotz alledem bin ich wenig geneigt, sie zu verwenden stack.getContext().put()
Methode, da ich die Werte deutlich sehen kann, indem ich die URL als festlege ?debug=Browser.Sagen Sie mir Bescheid, wenn ich falsch liege.
Lösung
Der ValueStack
ist pro Anfrage.Wenn Sie Werte auf dem Stapel platzieren, sind sie später in der Anfrage (d. h. in der Ansichtsschicht) zugänglich, würden aber eine Umleitung nicht überleben, was eine neue HTTP-Anfrage wäre und eine eigene hätte ValueStack
.
Unter normalen Bedingungen würden Parameter in der URL oder in einem Formularbeitrag mithilfe der Setter-Methoden der Aktion für die Aktion festgelegt.In einem Interceptor können Sie Werte direkt zum Stapel hinzufügen.Zum Beispiel die ExceptionMappingInterceptor
nutzt die stack.push(Object)
Methode zum Veröffentlichen von Ausnahmen zur Verwendung auf Fehlerseiten.
stack.getContext().put(String, Object)
– Platziert den Schlüssel/Wert in einer Karte, die sich auf dem Stapel befindet.Die Karte stellt den Kontext des Stapels dar.stack.set(String, Object)
– Platziert den Schlüssel/Wert in einer Karte, die sich auf dem Stapel befindet.Ich bin mir nicht sicher, was das mit der vorherigen Methode zu tun hat, außer dass es sich um eine andere Karte handelt.stack.push(Object)
– Dadurch wird das Objekt im Stammverzeichnis des Stapels platziert.
Sie sollten aus der Ansichtsebene heraus nichts auf dem Stapel platzieren müssen, daher bin ich gespannt, was Sie tun möchten, was dies erfordert.