使用JSTL循环遍历列表

时间:2015-02-10 14:30:15

标签: java jsp jstl

根据学校代码,我有一系列课程。此课程列表将添加到另一个列表中,使其成为列表列表。

行动类:

private List<String> schoolList;
private List<String> socList;
private List<String> sobList;
private List<String> sodList;
private List<String> genlist;
private List<List<String>> courseList = new ArrayList<List<String>>();

@Override
public String execute() {
    FacultyManager fm = new FacultyManager();
    schoolList = fm.getColumn("school_description", "school");

    genlist = fm.getCoursesBySchoolCode("GEN");
    sobList = fm.getCoursesBySchoolCode("SOB");
    socList = fm.getCoursesBySchoolCode("SOC");
    sodList = fm.getCoursesBySchoolCode("SOD");     

    courseList.add(genlist);
    courseList.add(sobList);
    courseList.add(socList);        
    courseList.add(sodList);        

    return SUCCESS;
}

JSP:

<c:forEach var="school" items="${schoolList}" varStatus="ctr">
    <ul>
        <li>${school}
            <ul>
                <c:forEach var="course" items="${courseList}">
                    <li>${course}</li>
                </c:forEach>
            </ul>
        </li>
    </ul>
</c:forEach>

输出 enter image description here

如何制作输出:

  • 普通教育
    • 普通教育部门
  • 商学院
    • BSBA - 财务管理
    • BSBA - 营销和广告

......等等。

2 个答案:

答案 0 :(得分:2)

您正在一遍又一遍地迭代所有学校的整个课程列表,从而重复相同的输出,就像多次调用courseList.toString()方法一样。

您应该迭代当前学校的具体课程列表,这很可能(但在您的问题中没有说明)取决于外部<c:forEach>的当前迭代索引环。这又在学校列表迭代索引的导出index变量(从零开始)的ctr属性中捕获。

因此,您应该迭代courseList列表的特定列表,具体取决于当前的学校。您可以通过调用courseList.get(ctr.index)来执行此操作,假设您使用的是EL2.2 +。

这一切都是:

<c:forEach var="school" items="${schoolList}" varStatus="ctr">
    <ul>
        <li>${school}
            <ul>
                <c:forEach var="course" items="${courseList.get(ctr.index)}">
                    <li>${course}</li>
                </c:forEach>
            </ul>
        </li>
    </ul>
</c:forEach>

那就是说,List<List<String>>听起来不是一个好的模特选择。例如,如果您更改广告订单,则会在视图中显示错误的课程。 Map<String, List<String>>构造更适合您的域模型,因为它可以用于将学校名称明确地映射到课程名称列表。

要认真考虑的另一个选择是对象的使用(最后你在做OOP)。您应该远离普通字符串并移动到对象域。首先,研究以下类层次结构:

public class Course {
    //...
    private School school;
    //...
}

public class School {
    //...
    private List<Course> courses;
    //...
}

答案 1 :(得分:0)

如果您尝试迭代列表中的列表,则可以通过

实现
<c:forEach var="school" items="${schoolList}" varStatus="ctr">
    <ul>
        <li>${school}
            <ul>
                <c:forEach var="course" items="${school}">
                    <li>${course}</li>
                </c:forEach>
            </ul>
        </li>
    </ul>
</c:forEach>

您需要从传递给jsp的列表中迭代inner列表。

更新

如果您使用的是Map<String, List<String>>,则可以将其作为

进行迭代
 <c:forEach var="school" items="${schoolList}" varStatus="ctr">
        <ul>
            <li>${school.key}
                <ul>
                    <c:forEach var="course" items="${school.value}">
                        <li>${course}</li>
                    </c:forEach>
                </ul>
            </li>
        </ul>
    </c:forEach>

您可以使用keyvalue来获取Map

中的值