2015-02-10 43 views
0

我有一個取決於學校代碼的課程列表。該課程列表被添加到另一個列表中,使其成爲列表清單。使用JSTL循環列表清單

Action類:

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)。 – 2015-02-10 14:53:29

回答

2

獲取值你是遍地迭代在所有學校課程的整個列表再次重複相同的輸出,就好像您多次調用courseList.toString()方法一樣。

而應該超過迭代在當前學校,其中最有可能(但你的問題無處陳述)取決於外部<c:forEach>循環的當前迭代指數課程的具體名單。這反過來又導出ctr變量的index屬性來捕獲(即從零開始)的學校名單迭代指數。

因此,你應該遍歷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>>構建更適合您的領域模型,因爲它可以用來明確地將學校名稱映射到課程名稱列表。

要認真考慮的另一個選擇是對象的使用(最後你在做OOP)。您應該遠離純字符串並移入對象域。要開始,請調查以下班級:

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

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

謝謝,'courseList.get(ctr.index)'工作。我想知道如何從'varStatus'中獲得'ctr'的值。公認。 – silver 2015-02-10 15:22:35

+0

不客氣! – skuntsel 2015-02-10 15:27:38

+1

同意OOP推薦 – 2015-02-10 15:53:50

0

如果你想遍歷列表內的列表中,您可以通過

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

您需要遍歷從您將它傳遞給JSP列表中inner列表achive它。

更新

在這種情況下,如果你使用的是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> 

您可以使用keyvalueMap

+0

我用你的代碼替換了我的代碼,這就是發生 - [單擊](http://s18.postimg.org/c92ozi3jd/output2.png)。 – silver 2015-02-10 14:44:25

+0

在服務器端填充列表的方式似乎有點麻煩,以上是迭代列表列表的語法。我建議你使用'Map >'你的情況 – 2015-02-10 14:47:45

+1

嗨,我之前沒有使用'Map',你能不能好好地發佈Action Class的樣子? – silver 2015-02-10 14:54:44