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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top