struts2 - comprensione della pila di valori
-
05-07-2019 - |
Domanda
Ho una domanda riguardo allo stack di valori struts2. Diciamo che ho una classe Action chiamata RegisterAction
che ha un metodo di esecuzione come segue:
public String execute() {
ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new String("test string"));
return SUCCESS;
}
Il mio struts.xml è simile al seguente:
<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>
Quindi il controllo fluirà su success.jsp dopo che il metodo execute viene eseguito in quella classe.
Le mie domande sono:
1) come posso ottenere quel valore che ho inserito nello stack nel success.jsp
?
2) Diciamo in <s:submit method="testMethod" />
ho un TestAction
che reindirizza a una classe di azioni chiamata TestAction#testMethod
. In altre parole, dalla pagina Register, l'utente fa clic su submit, e nel metodo execute di RegisterAction#execute
spingiamo & Quot; test string & Quot; sullo stack. Quindi andiamo a <=>. Il <=> ha un pulsante di invio che ci indirizza a <=>. In <=>, il valore che ho inserito nello stack in <=> è ancora lì? Come posso averlo? Ho esaminato il debugger di eclissi ma non vedo il valore.
Grazie.
Soluzione
Ok, l'ho capito.
1) Il modo in cui ho scoperto di ottenere oggetti nello stack di valori in modo che possiamo accedervi da un jsp è così:
Map<String, Object> context = new HashMap<String, Object>();
context.put("key", "some object");
context.put("key2", "another object");
ActionContext.getContext().getValueStack().push(context);
In altre parole, possiamo mettere una HashMap nello stack di valori contenente gli oggetti di cui abbiamo bisogno. Quindi, nel jsp, possiamo accedere ai valori reali in questo modo:
<s:property value="key" />
<s:property value="key2" />
Guarderà attraverso lo stack di valori e troverà quei valori nella HashMap che abbiamo inserito.
2) Un'istanza della classe di azioni è associata a una sola richiesta. Quindi quando andiamo a un'altra azione e poi finiamo in un'altra jsp, le cose che abbiamo spinto nello stack di valori dalla prima azione non saranno lì poiché l'altra azione ha il suo stack di valori. riferimento: http://www.manning-sandbox.com/thread.jspa?messageID = 93.045
Siete liberi di correggermi se qualcuno di questi è sbagliato o se ci sono modi più intelligenti per fare queste cose :).
Grazie.
Altri suggerimenti
Struts 2 aggiunge la tua azione in cima allo stack di valori quando eseguita. Quindi, il solito modo di mettere roba nello Stack Valore è quello di aggiungere getter / setter per i valori alla tua classe Action. Usa ancora il tag s: property per accedere ai valori.
Un tutorial CRUD: http: //struts.apache .org / 2.1.6 / docs / CRUD-demo-i.html
basta definire una proprietà come
String string1 = "test string";
nella tua azione.
in jsp è possibile accedere direttamente.
es
<s:property value="string1"/>
stamperà
" stringa di test "
Normalmente, come dice Nate, userete un campo nella vostra azione, poiché l'azione è sempre sul ValueStack. Tuttavia, questo non funziona se stai scrivendo il codice dell'intercettore poiché l'interceptor sarà scomparso quando viene invocato il modello (JSP / freemarker ecc.). Lì devi mettere una sorta di oggetto simile a un java bean sul ValueStack, proprio come fai sopra.
Ciao, solo per informazione
Questo è un aspetto negativo dell'utilizzo di getValueStack().getContext()
a volte i dati non erano disponibili in .ftl (i dati non venivano visualizzati nella riga 2, ma venivano nella riga 1) non ne conosco davvero il motivo. Ma usando .getValueStack().set("resDTO",resDTO);
il problema è stato risolto (i dati venivano popolati per entrambe le funzioni).
${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2