【问题标题】:How to use nested foreach tag in JSP如何在 JSP 中使用嵌套的 foreach 标签
【发布时间】:2015-10-03 06:24:15
【问题描述】:

我使用带有 JSP 的 Struts2 框架。我想在 JSP 中嵌套 foreach 标记,但在内部 foreach 标记处出现错误。

迭代嵌套对象时出错。

<c:forEach var="emp" items="${dept.emplyees}"> 

例外:

Caused by: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt;
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:274) ~[jstl-1.2.jar:1.2]
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:238) ~[jstl-1.2.jar:1.2]
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:155) ~[jstl-1.2.jar:1.2]
    at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:291) ~[javax.servlet.jsp.jstl-api-1.2.1.jar:1.2.1]
    at org.apache.jsp.views.Home.home_jsp._jspx_meth_c_005fforEach_005f1(home_jsp.java:364) ~[na:na]
    at org.apache.jsp.views.Home.home_jsp._jspService(home_jsp.java:159) ~[na:na]

下面是我使用 POJO 和 Struts Action feilds 的示例代码。

JSP 代码:

<c:forEach var="dept" items="${deptList}"> 
  <c:out value="${dept.deptname}"/> 
  <c:forEach var="emp" items="${dept.emplyees}"> 
    <c:out value="${emp.name}"/> 
  </c:forEach>
</c:forEach>

动作类:testAction:

class TestAction{
List<Department> deptList

public List<Department> getDeptList() {
        return deptList;
    }

    public void setDeptList(List<Department> deptList) {
        this.deptList = deptList;
    }
}

DeprtmentPOJO:

class Department{

private String deptname

List<Employee> emplyees;

    public List<Employee> getDeptList() {
        return emplyees;
    }

    public void setDeptList(List<Employee> emplyees) {
        this.emplyees = emplyees;
    }
}

EmployeePOJO:

class Employee{
    private String name;
}

【问题讨论】:

  • 你在 Deprtment Pojo 中有错误的 getter 和 setter。也许在这里发布它们只是一个复制错误,但就是这样。另外我强烈建议您避免随意丢弃字母,这只会给您带来麻烦。为了您自己的安全,将员工变成员工。最后,有什么理由不使用 s:iterator 而不是 forEach ?

标签: java jsp struts2 jstl jsp-tags


【解决方案1】:

要遍历对象的属性,它不应该是 null 并且有一个 getter 方法。

private List<Employee> emplyees = new ArrayList<>();
public List<Employee> getEmplyees() { return emplyees; }  

在页面上显示此属性之前,最好有一些值。您可以在操作中执行此操作,或者在prepare() 中更好地执行此操作并让您的操作实现Preparable interface

通常用于填充表单控件的数据是动态生成的,可能来自数据库。当用户提交表单时,Struts 2 验证拦截器尝试验证用户的表单输入。如果验证失败,Struts 2 框架将返回值"input",但不会重新执行"input" 操作。而是将与"input" 结果关联的视图呈现给用户。通常这个视图是显示原始表单的页面。

如果显示的一个或多个表单字段或某些其他数据依赖于在Action 类的输入法中完成的动态查找,则此工作流可能会导致问题。由于验证失败时不会重新执行Action 类的输入法,因此视图页面可能无法再访问正确的信息来创建表单或其他显示信息。

【讨论】:

  • 非常感谢。它成功了。没错,嵌套对象应该在 Action 中初始化。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多