2008-09-25 65 views
2

我有一個Hashtable < Integer,Sport>叫做sportMap和sportIds列表(列表< Integer> sportIds)來自我的支持bean。 Sport對象有一個列表< String> equipmentList。我可以使用統一的EL來完成下列各項運動的設備清單嗎?我可以使用JSF 1.2和JSP 2.1在c:forEach標記的統一EL表達式中使用Hashtable嗎?

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <c:forEach items="#{bean.sportMap[_sportId].equipmentList}" var="_eqp"> 
    <h:outputText value="#{_eqp}"></h:outputText> 
    <br/> 
    </c:forEach> 
</h:dataTable> 

嘗試運行此JSP代碼時出現以下異常。

 15:57:59,438 ERROR [ExceptionFilter] exception root cause 
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 
     Don't know how to iterate over supplied "items" in &lt;forEach&gt;

這裏的打印出我的環境

 
Server: JBossWeb/2.0.1.GA 
Servlet Specification: 2.5 
JSP version: 2.1 
JSTL version: 1.2 
Java Version: 1.5.0_14 

注:使用JSF標籤下面做工作。它列出sportIds列表中指定的每項運動的設備列表。

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <h:outputText value="#{bean.sportMap[_sportId].equipmentList}"> 
    </h:outputText> 
</h:dataTable> 

我想使用c:forEach標記。有誰知道這是否可能?如果沒有,任何人都有建議?最後,我想要一個堆疊列表,而不是由equipmentList.toString()提供的逗號分隔列表。 (另外,不想覆蓋toString())。

回答

2

@keith30xi.myopenid.com

不是真的在JSF 1.2。根據java.net wiki faq,他們應該按預期一起工作。

這裏的每個常見問題的摘錄:

JSF 1.1常見問題
問:JavaServer Faces的標記與JSTL核心標籤互操作,的forEach,如果,選擇什麼時候?

答:由於JSTL和JavaServer Faces技術使用的策略不兼容,forEach標記不適用於JavaServer Faces技術版本1.0和1.1標記。相反,您可以使用渲染器(如dataTable標記使用的Table渲染器)執行自己的迭代。 if,choose和when標籤工作,但嵌套在這些標籤中的JavaServer Faces標籤必須有明確的標識符。

這個缺點已經在JSF 1.2中修復了。

JSF 1.2常見問題
問:JavaServer Faces的標記與互操作JSTL核心標籤,的forEach,如果,選擇什麼時候?答:是的。 JSP 2.1的一個新特性稱爲JSP Id Consumer,它允許這些標籤按預期工作。

有沒有人使用JSTL與核心標籤特別的forEach JSF標籤?

-1

兩個問題:

  1. 一個DataTable只能有以下兒童:頭小,尾小,列。其他任何東西都不會被正確評估。
  2. JSTL標籤不能與JSF組件交織。在創建組件樹時評估JSTL標籤。在頁面呈現時評估JSF組件。因此,c:forEach標籤只會被評估一次 - 當組件樹被創建時,可能在「#{bean.sportIds}」之前。

要麼使用一個JSF組件庫,提供了循環喜歡你的願望,建立一個沒有你想要的循環,或重構豆以便不用循環在sportIds,遍歷運動,每個列表體育有它的身份和裝備。

2

我曾經有同樣的問題,我找不到使用dataTable的解決方案。 問題是,var _sportId只能由dataTable組件讀取。

如果你需要做一個循環內的循環,你可以使用一個DataTable裏一個數據表:

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <h:dataTable value="#{bean.sportMap[_sportId].equipmentList}" var="_eqp"> 
    <h:outputText value="#{_eqp}"></h:outputText> 
    </h:dataTable> 
</h:dataTable> 

但是,在這種情況下,每個你的equipmentList打印表行內的物品。這不是一個很好的解決方案。

我選擇使用一個普通的HTML表格,而不是一個DataTable:

<table> 
    <c:forEach items="#{bean.sportIds}" var="_sportId"> 
     <tr> 
     <td> 
     <c:forEach items="#{bean.sportMap[_sportId].equipmentList" var="_eqp"> 
      <h:outputText value="#{_eqp} " /> 
     </c:forEach> 
     </td> 
     </tr> 
    </c:forEach> 
</table> 

它的工作原理。如果您需要某些特定的dataTable功能(如綁定和行映射),則可以使用f:setPropertyActionListener標記以簡單的方式獲得該功能。

相關問題