2012-04-12 20 views
6

He siguiente código:¿Cómo acceder a los objetos ValueStack dentro del iterador de 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> 

comentarios es de una lista de objetos de revisión que contengan datos de revisión, como la calificación y el nombre del usuario.

Mi problema es que no puedo acceder a ninguno de los objetos presentes en la ValueStack dentro del ciclo.

Fuera del bucle <s:property value="#request.restaurant.portalImage.url" /> funciona correctamente. Pero dentro del ciclo imprime nulo.

AFAIK un iterador empuja su colección en la ValueStack para que todas las expresiones OGNL se resuelvan en su contra. Pero he usado #, lo que significa que especifico explícitamente el objeto raíz para la resolución.

¿Por qué sigue sin funcionar?

Respuesta

1

se debe cambiar, como a continuación:

<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> 

Usando una variable de referencia iterador a buscar el objeto de índice único.

+0

¿Qué es varrequest? –

+0

Esa es la variable que contiene el objeto indexado actual para que usted pueda acceder. Consulte esta documentación para obtener más información. http://struts.apache.org/2.0.11/docs/iterator.html – Phani

+0

El objeto indexado actual será un objeto de revisión de la lista. Quiero acceder a algo fuera de la lista. Un objeto de restaurante que se almacena en el alcance de la solicitud. –

1

No estoy seguro de qué objeto está contenido en la colección que está utilizando en el iterador.Como itera la colección con la etiqueta del iterador S2, empujará el objeto en la parte superior de la pila de valores, lo que significa , supongamos que tiene colección de objetos de usuario en el que está iterando como

<s:iterator value="userCollection"> 

</s:iterator> 

así que cuando esta se repetirá, S2 iterador empujará el objeto user encima de la pila de valor y si queremos hacer referencia a la propiedad name de user objeto, todo lo que necesitamos hacer referencia a la propiedad del nombre

<s:property name="userName"/> 

desde OGNL intentará resolver userName en la pila de valor y ya tenemos objeto de usuario como un objeto de nivel superior en valor stack.I sugieren que pasar por la documentación etiqueta iterador y cómo empujar los valores

+0

objeto de nivel superior no importa. # se usa para especificar explícitamente el objeto a resolver, sin importar si está en la parte superior o no. –

0

creo que resuelve el 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> 

su requisito es poco confuso

2

Acabo de pasar toda la tarde luchando contra un problema similar. En mi caso, el problema era que mi variable de iterador (en su caso reviews) tenía un campo con el mismo nombre que la variable externa.

No importa cuánto intente salir de la pila local del iterador, no accedería a la variable externa.

Si sus opiniones iterador tiene un campo llamado restaurante que va a anular el restaurante la variable externa, no importa cuánto se esfuerce :(

La solución que encontré fue simplemente cambiar el nombre del exterior variable (por ejemplo: therestaurant)..

Una vez que le cambió el nombre, se ya no chocando con la variable interior, y que era capaz de acceder a él desde el interior del iterador

+1

¡Gracias, esto ayudó mucho! Otra solución es almacenar el "valor externo" en una variable local ANTES del iterador utilizando la etiqueta , y haciendo referencia a esta variable local en su lugar ( o $ {theRestaurant}). – mmuller

Cuestiones relacionadas