2015-02-10 3 views
0

У меня есть список курсов в зависимости от школьного кода. Этот список курсов добавляется в другой список, что делает его списком списков.Цитирование по списку списков с использованием 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 - МАРКЕТИНГ И РЕКЛАМА

... и прочее.

+0

Или просто [использовать объекты] (http://stackoverflow.com/a/15009137/1654265). –

ответ

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>> лучше подходит для вашей модели домена, так как она может использоваться для сопоставления названия школы с перечнем названий курсов однозначно.

Другим вариантом серьезного рассмотрения является использование объектов (вы делаете ООП в конце). Вы должны отвернуться от простых строк и перейти в предметную область. Чтобы начать, исследуйте следующую иерархию классов:

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

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

Спасибо, 'courseList.get (ctr.index)' работал. Мне было интересно, как получить значение 'ctr' из' varStatus'. Принято. – silver

+0

Добро пожаловать! – skuntsel

+1

Согласитесь с рекомендацией ООП –

0

Если вы пытаетесь просматривать список внутри списка, вы можете achive его

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

Вы должны итерируем inner список из списка вы передаете его в СПЯ.

Update

В случае, если вы используете 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> 

Вы можете использовать key и value, чтобы получить значения из Map

+0

Я заменил свой код на ваш фрагмент, и это то, что произошло - [click] (http://s18.postimg.org/c92ozi3jd/output2.png). – silver

+0

способ заполнения списка на стороне сервера, кажется, немного clumpsy, выше - синтаксис для итерации «списка списков». я советую вам использовать 'Map >' для вашего случая –

+1

Привет, я раньше не использовал «Карту», ​​не могли бы вы рассказать, как будет выглядеть класс Action? – silver

Смежные вопросы