【发布时间】:2012-01-18 00:10:46
【问题描述】:
我正在使用 JSF 2,并且出于某些目的需要 c:foreach。但无论我的列表有多大,c:foreach 只会循环一次,返回空值。我尝试了一切,我什至在单独的 .xhtml 中隔离了 c:foreach,但它仍然给出了相同的结果。如果您需要一些代码,请询问,但我想让 c:foreach 至少在单独的 .xhtml 中工作,而且我认为它也可以在我的代码中工作。
【问题讨论】:
我正在使用 JSF 2,并且出于某些目的需要 c:foreach。但无论我的列表有多大,c:foreach 只会循环一次,返回空值。我尝试了一切,我什至在单独的 .xhtml 中隔离了 c:foreach,但它仍然给出了相同的结果。如果您需要一些代码,请询问,但我想让 c:foreach 至少在单独的 .xhtml 中工作,而且我认为它也可以在我的代码中工作。
【问题讨论】:
在网络浏览器中打开页面,右键单击并查看源代码。你看到那里有<c:forEach> 标签plain vanilla,对吧?它根本没有被解析和执行吗?这个不对。您需要确保已在 XML 名称空间中声明了 JSTL 核心标记库,以便让 Facelets 解析和执行它。正确的 XML 命名空间声明如下:
xmlns:c="http://java.sun.com/jsp/jstl/core"
如果你已经这样做了,那么它只能意味着你在没有预装 JSTL 的服务器上运行 webapp。 Glassfish 和 JBoss AS 等成熟的 Java EE 应用服务器已经捆绑了 JSTL,但是像 Tomcat 和 Jetty 这样的简单 servlet 容器没有。您需要下载 JSTL 库并将其放入 webapp 的 /WEB-INF/lib 甚至服务器自己的 /lib 文件夹中。
与具体问题无关,您是否清楚<c:forEach> 是视图构建时间标记,而不是视图渲染时间标记?如果您实际上是在寻找后者,那么您应该使用 Facelets 自己的 <ui:repeat> 标签。另见JSTL in JSF2 Facelets... makes sense?
【讨论】:
<c:forEach> 标记名称区分大小写。