Subin Chalil
Subin Chalil

Reputation: 3660

How to get the value of a value in <c:forEach>

This is my model Student

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>();


}

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

There will maximum 9 classes(No of classes).It can differ from 1 to 9.I want to render all subject in each class according to ${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>

Hi,

I know the above code wont work. I have tried this

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

It is showing...

${class[level]SubjectList} contains invalid expression(s): javax.el.ELException: Failed to parse the expression ${class[level]SubjectList}

Still not working. any solution for this? Thanks in advance.

Upvotes: 0

Views: 2567

Answers (1)

rickz
rickz

Reputation: 4474

Maybe you could set a list of your lists. Here is demonstration code.

<%@ 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>

That prints a b c d e f g h i. To understand syntax look at http://docs.oracle.com/javaee/7/tutorial/jsf-el004.htm
Edit: It would better if you created a list of lists in your Student class and use that in your JSTL. But, you can use reflection to do what you want to accomplish. The bad part is that you must use a scriptlet(actually you could move that code into a custom EL function or a tag file). Here is demonstration code.

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

and the 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> 

Upvotes: 1

Related Questions