Как получить доступ к объектам ValueStack в итераторе 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>
рецензии - это список объектов рецензии, которые содержат детали рецензии, такие как рейтинг и имя пользователя.
Моя проблема в том, что я не могу получить доступ ни к одному из объектов, присутствующих в ValueStack внутри цикла.
Вне петли <s:property value="#request.restaurant.portalImage.url" />
работает правильно. Но внутри цикла он печатает ноль.
AFAIK итератор помещает свою коллекцию в ValueStack, чтобы все выражения OGNL сопоставлялись с ним. Но я использовал #, что означает, что я явно указываю корневой объект для разрешения.
Почему это все еще не работает?
4 ответа
Я провел весь день, борясь с подобной проблемой. В моем случае проблема заключалась в том, что моя переменная итератора (в вашем случае reviews
) имеет поле с тем же именем, что и внешняя переменная.
Как бы я ни старался вырваться из локального стека итератора, он не получал доступа к внешней переменной.
Если у вашего итератора отзывов есть поле с названием restaurant, оно будет переопределять внешнюю переменную restaurant, независимо от того, как сильно вы пытаетесь:(
Решение, которое я нашел, состояло в том, чтобы просто переименовать внешнюю переменную. (например: Ресторан)
Как только я переименовал его, он больше не конфликтовал с внутренней переменной, и я смог получить к нему доступ внутри итератора.
Вы должны изменить это, как показано ниже:
<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>
Использование ссылочной переменной итератора для извлечения уникального индексного объекта.
Я не уверен, какой объект содержится в коллекции, которую вы используете в Итераторе. Что касается итератора, когда вы выполняете итерацию коллекции с помощью тега итератора S2, он помещает объект на вершину стека значений, что означает, скажем, у вас есть Коллекция пользовательского объекта, на котором вы итерируете, как
<s:iterator value="userCollection">
</s:iterator>
поэтому, когда это будет повторяться, S2 итератор будет выдвигать user
объект на вершине стека значений и если мы хотим сослаться на name
собственностью user
объект, все, что нам нужно, чтобы ссылаться на имя свойства
<s:property name="userName"/>
так как OGNL попытается решить userName
в стеке значений, и у нас уже есть объект пользователя в качестве объекта верхнего уровня в стеке значений. Я предлагаю ознакомиться с документацией тега Iterator и узнать, как он передает значения
Я думаю, что это решает вашу проблему
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>
Ваше требование немного сбивает с толку