Как получить доступ к объектам 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>

Ваше требование немного сбивает с толку

Другие вопросы по тегам