Java 使用JSTL在列表中循环

Java 使用JSTL在列表中循环,java,jsp,jstl,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&

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

动作类:

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;
}
<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>
私人名单学校名单;
私人名单;
私人名单;
私人名单;
私有列表genlist;
私有列表courseList=new ArrayList();
@凌驾
公共字符串execute(){
FacultyManager fm=新建FacultyManager();
schoolList=fm.getColumn(“学校描述”、“学校”);
genlist=fm.getCoursesBySchoolCode(“GEN”);
sobList=fm.getCoursesBySchoolCode(“SOB”);
socList=fm.getCoursesBySchoolCode(“SOC”);
sodList=fm.getCoursesBySchoolCode(“SOD”);
课程列表。添加(genlist);
课程列表。添加(sobList);
课程列表。添加(socList);
课程列表。添加(sodList);
回归成功;
}
JSP:

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

  • ${school}
    • ${course}
输出

如何使其输出为:

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

。。。依此类推。

如果您试图在列表中迭代列表,您可以通过

<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>
您可以使用
映射中获取值

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

相反,您应该迭代当前学校的具体课程列表,这很可能(但问题中没有说明)取决于外部
循环的当前迭代索引。这反过来会在学校列表迭代索引的导出
ctr
变量(基于零)的
index
属性中捕获

因此,根据当前学校的不同,您应该迭代查看
课程列表的特定列表。您可以通过调用
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>

  • ${school}
    • ${course}
也就是说,
List
听起来不是一个好的车型选择。例如,如果更改插入顺序,将在视图中获得错误的课程
Map
construct更适合您的域模型,因为它可以用于将学校名称明确地映射到课程名称列表

另一个要慎重考虑的选项是对象的使用(最后是OOP)。您应该远离普通字符串,进入对象域。首先,调查以下类层次结构:

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

public class School {
    //...
    private List<Course> courses;
    //...
}
公共课{
//...
私立学校;
//...
}
公立学校{
//...
私人名单课程;
//...
}

我用您的代码片段替换了我的代码,这就是发生的事情-。在服务器端填充列表的方法似乎有点笨拙,上面是迭代列表的语法。我建议你使用
Map
来处理你的案例。嗨,我以前没有使用过
Map
,你能告诉我动作类是什么样子吗?@SanKrish我不是投反对票的人,我也不打算投反对票,但我会解释投反对票的原因。您最初的回答没有考虑到
学校
很可能实际上是一个
字符串
,而不是
列表
,因此这部分应该是错误的。您的更新没有回答最初的问题,而是提出了一个全新的解决方案,因此它回答了一个不同的问题。或者只是。谢谢,
courseList.get(ctr.index)
worked。我想知道如何从
varStatus
获取
ctr
的值。接受。同意OOP建议
courseList.get(ctr.index)
正确回答手头的问题。如果我尝试OOP方法,我将发布另一个线程。:)