可以在JSP 2.1和JSP 2.1的c:forEach标记上的统一EL表达式中使用哈希表吗?
我有一个名为sportMap的Hashtable <Integer,Sport>和我的后备bean中的一个sportIds列表(List <Integer> sportIds)。 Sport对象具有一个List <String> 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 <forEach>
这是我的环境的打印件
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标记确实起作用。它打印出SportIds列表中指定的每种运动的设备列表。
<h:dataTable value="#{bean.sportIds}" var="_sportId" > <h:outputText value="#{bean.sportMap[_sportId].equipmentList}"> </h:outputText> </h:dataTable>
我想使用c:forEach标签。有人知道这是否可能吗?如果没有,有人有建议吗?最后,我想要一个堆叠列表,而不是equipmentList.toString();提供的逗号分隔列表; (此外,也不想覆盖toString())。
解决方案
两个问题:
- dataTable只能具有以下子级:头构面,页脚构面,列。其他任何事情都将无法正确评估。
- JSTL标记不能与JSF组件交织在一起。创建组件树时,将评估JSTL标记。呈现页面时,将评估JSF组件。因此,c:forEach标记仅被评估一次-创建组件树时(可能在"#{bean.sportIds}"可用之前)。
使用JSF组件库来提供我们想要的循环,构建可以执行我们想要的循环的组件,或者重构bean,以便而不是遍历sportIds,而是遍历一系列运动,其中每个运动都有其ID和设备。
@ keith30xi.myopenid.com
在JSF 1.2中不是TRUE。根据java.net Wiki常见问题解答,它们应该按预期方式协同工作。
以下是每个常见问题解答的摘录:
JSF 1.1 FAQ Q. Do JavaServer Faces tags interoperate with JSTL core tags, forEach, if, choose and when? A. The forEach tag does not work with JavaServer Faces technology, version 1.0 and 1.1 tags due to an incompatibility between the strategies used by JSTL and and JavaServer Faces technology. Instead, you could use a renderer, such as the Table renderer used by the dataTable tag, that performs its own iteration. The if, choose and when tags work, but the JavaServer Faces tags nested within these tags must have explicit identifiers. This shortcoming has been fixed in JSF 1.2. JSF 1.2 FAQ Q. Do JavaServer Faces tags interoperate with JSTL core tags, forEach, if, choose and when? A. Yes. A new feature of JSP 2.1, called JSP Id Consumer allows these tags to work as expected.
是否有人将JSF标签与专门用于每个的JSTL核心标签一起使用?
我曾经遇到过同样的问题,但是我无法使用dataTable找到解决方案。
问题是var _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表而不是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>
有用。如果需要某些特定的dataTable功能(例如绑定和行映射),则可以使用f:setPropertyActionListener标记以简单的方式获取它。