Могу ли я использовать хэш-таблицу в унифицированном выражении EL в теге c: forEach, используя JSF 1.2 с JSP 2.1?

StackOverflow https://stackoverflow.com/questions/136696

  •  02-07-2019
  •  | 
  •  

Вопрос

У меня есть хэш-таблица<Integer, Sport=""> под названием sportMap и список идентификаторов спорта (List<Integer> sportIds) из моего резервного компонента.У спортивного объекта есть список<String> Список оборудования.Могу ли я сделать следующее, используя унифицированный 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()).

Это было полезно?

Решение

@keith30xi.myopenid.com

Неверно в JSF 1.2.В соответствии с java.net часто задаваемые вопросы вики они должны работать вместе, как и ожидалось.

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

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

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

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

Часто задаваемые вопросы По JSF 1.2
Q.Взаимодействуют ли теги JavaServer Faces с тегами ядра JSTL, forEach, if, choose и когда?

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

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

Другие советы

Однажды у меня была такая же проблема, и я не смог найти решение, используя DataTable.Проблема в том, что var _спортивный может быть прочитан только компонентом 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>

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

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

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

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

Две проблемы:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top