JSTL针对每个问题

时间:2009-08-10 11:33:50

标签: java jsp foreach jstl

我有一个for循环,当使用scriplet以下列方式填充items属性时,它可以正常工作:

<%
    List<LandingCategory> cats = beanFactory.getLandingCategories();
%>

<c:forEach var="cat" items="<%=cats%>">
    <c:out value="${cat.id}"/>          
</c:forEach>

但是,当尝试使用另一个jsp文件中指定的param填充项目列表时,for each将无效。

JSP1
<jsp:include page="/jsp/modules/index/index_categories.jsp">    
    <jsp:param name="categories" value="<%=cats%>"/>
</jsp:include>

JSP2
<c:forEach var="cat" items="${param.categories}">
    <c:out value="${cat.id}"/>          
</c:forEach>

抛出以下错误:

javax.servlet.jsp.el.ELException: Unable to find a value for "id" in object of class "java.lang.String" using operator "."

似乎它正在考虑项目列表的对象是字符串,但我不知道为什么会发生这种情况。

有没有人有任何想法?

由于

2 个答案:

答案 0 :(得分:5)

<jsp:param>标记提供了一种模拟从HTTP请求传入的参数类型的方法。因此,他们是字符串。那么JSP1正在做的是将你的“猫”集合转换为String(使用toString()),然后将该String作为参数传递给JSP2。然后foreach尝试迭代该字符串。 Cat数据结构在翻译中丢失了。

您需要做的是将cats对象存储为请求范围的属性,这将允许JSP2检索它:

<%
    List<LandingCategory> cats = beanFactory.getLandingCategories();
%>
<c:set var="cats" scope="request" value="<%=cats%>"/>
<jsp:include page="/jsp/modules/index/index_categories.jsp"/>

答案 1 :(得分:0)

我很确定

<jsp:param name="categories" value="<%=cats%>"/>

导致在猫上调用toString()。为此使用标记文件,效果更好:

<yourTags:fileName cats='${cats}' />

代替。