Могу ли я использовать Hashtable в унифицированном выражении EL для тега c: forEach, используя JSF 1.2 с JSP 2.1? - PullRequest
2 голосов
/ 26 сентября 2008

У меня есть Hashtable с именем sportMap и список спортивных идентификаторов (List sportIds) из моего бина. У объекта Sport есть список equipmentList. Могу ли я сделать следующее, используя унифицированную EL, чтобы получить список снаряжения для каждого вида спорта?

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
  <c:forEach items="#{bean.sportMap[_sportId].equipmentList}" var="_eqp">
    <h:outputText value="#{_eqp}"></h:outputText>
    <br/>
  </c:forEach>
</h:dataTable>

Я получаю следующее исключение при попытке запустить этот код JSP.

 15:57:59,438 ERROR [ExceptionFilter] exception root cause
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 
      Don't know how to iterate over supplied "items" in &lt;forEach&gt;

Вот распечатка из моего окружения

Server: JBossWeb/2.0.1.GA
Servlet Specification: 2.5
JSP version: 2.1
JSTL version: 1.2
Java Version: 1.5.0_14

Примечание: следующее работает с использованием тега JSF. Он распечатывает список оборудования для каждого вида спорта, указанного в списке спортивных идентификаторов.

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <h:outputText value="#{bean.sportMap[_sportId].equipmentList}">
    </h:outputText>
</h:dataTable>

Я хотел бы использовать тег c: forEach. Кто-нибудь знает возможно ли это? Если нет, у кого-нибудь есть предложения? В конце я хочу составленный список вместо разделенного запятыми списка, предоставленного equipmentList.toString (); (Кроме того, не нужно переопределять toString ()).

Ответы [ 3 ]

2 голосов
/ 26 сентября 2008

@keith30xi.myopenid.com

Неверно в JSF 1.2 . Согласно java.net wiki faq они должны работать вместе, как и ожидалось.

Вот выдержка из каждого часто задаваемого вопроса:

Часто задаваемые вопросы JSF 1.1
В. Взаимодействуют ли теги JavaServer Faces с основными тегами JSTL, forEach, если, выберите и когда?

A. Тег forEach не работает с технологией JavaServer Faces, тегами версии 1.0 и 1.1 из-за несовместимости стратегий, используемых JSTL и JavaServer. Лица технологии. Вместо этого вы можете использовать средство визуализации, такое как средство визуализации таблиц, используемое тегом dataTable, которое выполняет свою собственную итерацию. Теги if, select и when работают, но теги JavaServer Faces, вложенные в эти теги, должны иметь явные идентификаторы.

Этот недостаток был исправлен в JSF 1.2.

JSF 1.2 FAQ
В. Взаимодействуют ли теги JavaServer Faces с основными тегами JSTL, forEach, если, выберите и когда?

A. Да. Новая функция JSP 2.1, называемая JSP Id Consumer, позволяет этим тегам работать должным образом.

Кто-нибудь использовал теги JSF с основными тегами JSTL специально для каждого?

2 голосов
/ 13 ноября 2008

Однажды у меня была такая же проблема, и я не смог найти решение, используя dataTable. Проблема в том, что переменная _sportId может быть прочитана только компонентом dataTable.

Если вам нужно сделать цикл внутри цикла, вы можете использовать dataTable внутри dataTable:

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
  <h:dataTable value="#{bean.sportMap[_sportId].equipmentList}" var="_eqp">
    <h:outputText value="#{_eqp}"></h:outputText>
  </h:dataTable>
</h:dataTable>

Но в этом случае каждый ваш элемент equipmentList печатается внутри строки таблицы. Это не было хорошим решением для меня.

Я решил использовать обычную HTML-таблицу вместо таблицы данных:

<table>
    <c:forEach items="#{bean.sportIds}" var="_sportId">
      <tr>
        <td>
        <c:forEach items="#{bean.sportMap[_sportId].equipmentList" var="_eqp">
            <h:outputText value="#{_eqp} " />
        </c:forEach>
        </td>
      </tr>
    </c:forEach>
</table>

Это работает. Если вам нужны определенные функции dataTable, такие как привязка и сопоставление строк, вы можете получить их простым способом, используя тег f: setPropertyActionListener .

0 голосов
/ 26 сентября 2008

Два выпуска:

  1. Таблица данных может иметь только следующие дочерние элементы: фасет заголовка, фасет нижнего колонтитула, столбец. Все остальное не будет оцениваться правильно.
  2. Теги JSTL нельзя переплетать с компонентами JSF. Теги JSTL оцениваются при создании дерева компонентов. Компоненты JSF оцениваются при визуализации страницы. Таким образом, тег c: forEach оценивается только один раз - когда создается дерево компонентов, что, вероятно, до того, как станет доступен "# {bean.sportIds}".

Либо используйте библиотеку компонентов JSF, которая предоставляет циклы по вашему желанию, либо создайте библиотеку, которая выполняет циклы по вашему желанию, или реорганизуйте компоненты так, чтобы вместо циклов по sportIds, циклически отображался список видов спорта, в которых каждый вид спорта идентификатор и оборудование.

...