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方法,我将发布另一个线程。:)