【问题标题】:JSTL for each problem每个问题的 JSTL
【发布时间】:2009-08-10 11:33:49
【问题描述】:

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

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

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

但是,当尝试使用另一个 jsp 文件中指定的参数填充项目列表时,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 "."

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

有人知道吗?

谢谢

【问题讨论】:

  • 评论而不是回答,因为这只是一个猜测,但是:由于 &lt;jsp:param&gt; 是一个名称-值对并且该值应该是一个字符串,我认为您的问题可能是您' 将您的整个列表强制为单个字符串。有没有办法让您将该字符串解析回列表,或者直接将其作为列表而不是作为参数的值拉入?
  • 非常感谢大家!我终于找到了 skaffman 的答案,效果很好。谢谢!

标签: java jsp foreach jstl


【解决方案1】:

&lt;jsp:param&gt; 标签提供了一种模拟从 HTTP 请求传入的参数类型的方法。因此,它们是字符串。所以JSP1 正在做的是获取您的“猫”集合,将其转换为String(使用toString()),然后将该字符串作为参数传递给JSP2。然后foreach 尝试迭代那个字符串。 Cat 数据结构在转换中丢失。

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

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

【讨论】:

    【解决方案2】:

    我很确定

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

    导致在猫上调用 toString()。改用标签文件,效果更好:

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

    改为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      相关资源
      最近更新 更多