2

我有一个名为 sportMap 的 Hashtable<Integer, Sport> 和一个来自我的支持 bean 的 sportIds (List<Integer> sportIds) 列表。Sport 对象有一个 List<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 错误 [ExceptionFilter] 异常根本原因
javax.servlet.ServletException:javax.servlet.jsp.JspTagException:
      不知道如何在 <forEach> 中迭代提供的“项目”。

这是我的环境的打印

服务器:JBossWeb/2.0.1.GA
小服务程序规范:2.5
JSP版本:2.1
JSTL 版本:1.2
Java版本: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 标签。有谁知道这是否可能?如果没有,有人有建议吗?最后我想要一个堆叠列表而不是由设备列表提供的逗号分隔列表。toString(); (另外,不想覆盖 toString())。

4

3 回答 3

2

@ keith30xi.myopenid.com

在 JSF 1.2 中不是 TRUE。根据java.net wiki 常见问题解答,它们应该按预期一起工作。

以下是每个常见问题的摘录:

JSF 1.1 FAQ
问:JavaServer Faces 标记是否与 JSTL 核心标记、forEach、if、choose 以及何时互操作?

A. 由于 JSTL 使用的策略与 JavaServer Faces 技术不兼容,forEach 标记不适用于 JavaServer Faces 技术版本 1.0 和 1.1 标记。相反,您可以使用渲染器,例如 dataTable 标记使用的 Table 渲染器,它执行自己的迭代。if、choose 和 when 标记有效,但嵌套在这些标记中的 JavaServer Faces 标记必须具有显式标识符。

这个缺点已在 JSF 1.2 中得到修复。

JSF 1.2 FAQ
问:JavaServer Faces 标记是否与 JSTL 核心标记、forEach、if、choose 以及何时互操作?

答:是的。JSP 2.1 的一个新特性,称为 JSP Id Consumer 允许这些标记按预期工作。

有没有人专门为Each使用带有JSTL核心标签的JSF标签?

于 2008-09-26T16:37:01.923 回答
2

我曾经遇到过同样的问题,但我找不到使用 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>

但在这种情况下,您的每个设备列表项都打印在表格行中。这对我来说不是一个很好的解决方案。

我选择使用普通的 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标记以简单的方式获得它。

于 2008-11-13T14:12:52.490 回答
-1

两个问题:

  1. 一个 dataTable 只能有以下子元素:header facet、footer facet、column。其他任何事情都不会被正确评估。
  2. JSTL 标记不能与 JSF 组件交织。创建组件树时评估 JSTL 标记。JSF 组件在页面呈现时进行评估。因此,c:forEach 标签只被评估一次——在创建组件树时,这可能在“#{bean.sportIds}”可用之前。

要么使用提供你想要的循环的 JSF 组件库,构建一个执行你想要的循环的组件库,要么重构 bean,以便循环遍历每个运动都有其 id 和设备的运动列表,而不是循环运动 ID。 .

于 2008-09-26T00:57:36.030 回答