一尘不染

如何获得一个值的价值

jsp

这是我的模特学生

public class Student {
    List<Subject1> class1SubjectList=new ArrayList<Subject>();
    List<Subject2> class2SubjectList=new ArrayList<Subject>();
    List<Subject3> class3SubjectList=new ArrayList<Subject>();
    List<Subject4> class4SubjectList=new ArrayList<Subject>();
    List<Subject5> class5SubjectList=new ArrayList<Subject>();
    List<Subject6> class6SubjectList=new ArrayList<Subject>();
    List<Subject7> class7SubjectList=new ArrayList<Subject>();
    List<Subject8> class8SubjectList=new ArrayList<Subject>();
    List<Subject9> class9SubjectList=new ArrayList<Subject>();


}

...................................................
.............................

最多有9个类(类数)。其范围可以从1到9。我想根据$ {noOfClasses}渲染每个类中的所有主题

<c:forEach begin="1" end="${noOfClasses}" varStatus="theCount">
  <select id="selectSunject${theCount.count}onClass">
   <c:forEach items="${class${theCount.count}SubjectList}" var="subject">

       <!-- Looking for class1SubjectList,class2SubjectList,class3SubjectList.. -->

      <option value="${subject.id }" >${subject.name}</option>
   </c:forEach>
  </select>
</c:forEach>

你好

我知道上面的代码将无法正常工作。我已经试过

<c:forEach begin="1" end="${noOfClasses}" varStatus="theCount">
 <select id="selectSunject${theCount.count}onClass">
 <c:set var="level" value="${theCount.count}"/>
       <c:forEach items="${class[level]SubjectList}" var="subject">

          <!-- Looking for class1SubjectList,class2SubjectList,class3SubjectList.. -->

          <option value="${subject.id }" >${subject.name}</option>
       </c:forEach>
      </select>
    </c:forEach>

它显示…

${class[level]SubjectList} 包含无效的表达式:javax.el.E​​LException:无法解析表达式
${class[level]SubjectList}

还是行不通。有什么解决办法吗?提前致谢。


阅读 324

收藏
2020-06-10

共1个答案

一尘不染

也许您可以设置一个列表列表。这是演示代码。

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
    <c:set var="class1SubjectList" value="${['a','b','c']}" />
    <c:set var="class2SubjectList" value="${['d','e','f']}" />
    <c:set var="class3SubjectList" value="${['g','h','i']}" />
    <c:set var="listOfLists" value="${[class1SubjectList,class2SubjectList,class3SubjectList]}" />
    <c:forEach var="currentList" items="${listOfLists}">
        <c:forEach var="currentItem" items="${currentList}">
            ${currentItem}
        </c:forEach>  
    </c:forEach>

那打印abcdefgh我。要了解语法,请访问http://docs.oracle.com/javaee/7/tutorial/jsf-
el004.htm。
编辑:如果在Student类中创建列表列表并在JSTL中使用它,则更好。但是,您可以使用反射来完成您想完成的任务。不好的部分是您必须使用scriptlet(实际上您可以将该代码移至自定义EL函数或标记文件中)。这是演示代码。

package test;
import java.util.*;
public class Student {
    public List<String> class1SubjectList = new ArrayList<String>();
    public List<String> class2SubjectList = new ArrayList<String>();
    public List<String> class3SubjectList = new ArrayList<String>();
    public Student(){
        class1SubjectList.add("a");
        class1SubjectList.add("b");
        class1SubjectList.add("c");
        class2SubjectList.add("d");
        class2SubjectList.add("e");
        class2SubjectList.add("f");
        class3SubjectList.add("g");
        class3SubjectList.add("h");
        class3SubjectList.add("i");
    }
}

和JSP

<%@ page import="test.Student, java.lang.reflect.Field, java.util.*" %>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%
    Student student = new Student();
    Field[] fields = student.getClass().getFields();
    List<List<String>> listOfLists = new ArrayList<List<String>>();
    for(Field field: fields){
        listOfLists.add((List)field.get(student));
    }
    pageContext.setAttribute("listOfLists", listOfLists);
%>
<c:forEach items="${listOfLists}" var="subjectList" varStatus="theCount">
    <select id="selectSubject${theCount.count}onClass">
        <c:forEach var="currentItem" items="${subjectList}">
            <option value="${currentItem}" >${currentItem}</option> 
        </c:forEach>
    </select>
</c:forEach>
2020-06-10