2012-04-12 11 views
6

Ho seguente codice:Come accedere agli oggetti ValueStack all'interno di iteratore Struts?

<s:iterator value="reviews"> 

    <img src="<s:property value="#request.restaurant.portalImage.url" />" /> 

    <s:property value="user.firstName" /> 
    <s:property value="user.lastName" /> 
    <s:property value="rating" /> 
    <s:property value="review" /> 

</s:iterator> 

opinioni è un elenco di oggetti recensione che contengono i dettagli di una recensione, come il rating e il nome dell'utente.

Il mio problema è che non sono in grado di accedere a nessuno degli oggetti presenti su ValueStack all'interno del ciclo.

Fuori dal ciclo <s:property value="#request.restaurant.portalImage.url" /> funziona correttamente. Ma all'interno del ciclo stampa nulla.

AFAIK un iteratore spinge la sua raccolta su ValueStack in modo che tutte le espressioni OGNL si risolvano contro di essa. Ma ho usato # che significa che sto specificando esplicitamente l'oggetto radice per la risoluzione.

Perché non funziona ancora?

risposta

1

Si dovrebbe cambiare come di seguito:

<s:iterator value="reviews" var="varrequest"> 

    <img src="<s:property value="#varrequest.restaurant.portalImage.url" />" /> 

    <s:property value="#varrequest.user.firstName" /> 
    <s:property value="#varrequest.user.lastName" /> 
    <s:property value="#varrequest.rating" /> 
    <s:property value="#varrequest.review" /> 

</s:iterator> 

Utilizzando una variabile di riferimento iteratore per andare a prendere l'oggetto indice univoco.

+0

Che cos'è varrequest? –

+0

Quella è la variabile che contiene l'oggetto indicizzato corrente a cui puoi accedere. Consulta questa documentazione per maggiori informazioni. http://struts.apache.org/2.0.11/docs/iterator.html – Phani

+0

L'oggetto indicizzato corrente sarà un oggetto di revisione dall'elenco. Voglio accedere a qualcosa al di fuori della lista. Un oggetto ristorante archiviato nello scope della richiesta. –

1

Non sono sicuro di quale oggetto è contenuto nella raccolta che si sta utilizzando in Iterator. Come per l'iteratore quando si itera la raccolta utilizzando il tag iteratore S2, si sposterà l'oggetto in cima allo stack di valori, il che significa , dire che avete collezione di oggetto utente su cui si sta iterazione come

<s:iterator value="userCollection"> 

</s:iterator> 

in modo che quando questo sarà un'iterazione, S2 iteratore spingerà l'oggetto user in cima alla pila di valore e se vogliamo fare riferimento alla name proprietà di user oggetto, tutto ciò che abbiamo bisogno di fare riferimento alla proprietà nome

<s:property name="userName"/> 

dal OGNL cercherà di risolvere userName nello stack di valore e abbiamo già oggetto utente come oggetto di livello superiore in valore stack.I consiglia di passare attraverso la documentazione tag Iterator e come spingere valori

+0

l'oggetto di livello superiore non ha importanza. # è usato per specificare esplicitamente l'oggetto da risolvere, indipendentemente dal fatto che sia in primo piano o meno. –

0

penso che risolve il problema

s:iterator value="reviews" status="position"> 
    <img src="<s:property value="#request.restaurant.portalImage.url"/>"/> 
    <s:property value="#position.user.firstName"/> 
    <s:property value="#position.user.lastName"/> 
    <s:property value="#position.rating"/> 
    <s:property value="#position.review"/> 
</s:iterator> 

il vostro requisito è poco confuso

2

Ho appena passato il mio intero pomeriggio a combattere un problema simile. Nel mio caso, il problema era che la mia variabile iteratore (Nel tuo caso reviews) aveva un campo con lo stesso nome della variabile esterna.

Non importa quanto sia stato difficile tentare di uscire dallo stack locale dell'iteratore, non avrebbe accesso alla variabile esterna.

Se i recensioni iteratore ha un campo chiamato ristorante la sua intenzione di ignorare il ristorante variabile esterna, non importa quanto duramente si tenta :(

La soluzione che ho trovato è stato di rinominare semplicemente l'esterno variabile (es: therestaurant)..

Una volta rinominato, non era più scontra con la variabile interna, e ho potuto accedervi dall'interno iteratore

+1

Grazie, questo ha aiutato molto! Un'altra soluzione consiste nel memorizzare il "valore esterno" in una variabile locale PRIMA dell'iteratore utilizzando il tag , e facendo riferimento a questa variabile locale invece ( o $ {theRestaurant}). – mmuller

Problemi correlati