如何在jsp中使用嵌套的foreach

时间:2015-07-14 14:32:14

标签: java jsp struts2 jstl jsp-tags

我在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;
    }
}

Deprtment Pojo

class Department{

private String deptname

List<Employee> emplyees;

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

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

员工Pojo

class Employee{
    private String name;
}

1 个答案:

答案 0 :(得分:1)

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

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

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

  

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

     

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