[英]Can I use a Hashtable in a unified EL expression on a c:forEach tag using JSF 1.2 with JSP 2.1?
我有一個名為 sportMap 的 Hashtable<Integer, Sport> 和來自我的支持 bean 的 sportIds (List<Integer> sportIds) 列表。 Sport 對象有一個 List<String> 設備列表。 我可以使用統一的 EL 執行以下操作以獲取每項運動的設備列表嗎?
<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 <forEach>
這是我的環境的打印件
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())。
在 JSF 1.2 中不正確。 根據java.net wiki 常見問題解答,它們應該按預期協同工作。
以下是每個常見問題解答的摘錄:
JSF 1.1 常見問題
問:JavaServer Faces 標簽是否與 JSTL 核心標簽 forEach、if、choose 和 when 互操作?A. 由於 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、if、choose 和 when 互操作?答:是的。 JSP 2.1 的一個新特性,稱為 JSP Id Consumer 允許這些標簽按預期工作。
有沒有人專門為Each 使用帶有JSTL 核心標簽的JSF 標簽?
我曾經遇到過同樣的問題,我無法使用 dataTable 找到解決方案。 問題是 var _sportId只能由 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>
但在這種情況下,您的每個設備列表項目都打印在表格行中。 這對我來說不是一個很好的解決方案。
我選擇使用普通的 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標記以簡單的方式獲得它。
兩個問題:
要么使用一個 JSF 組件庫來提供您想要的循環,構建一個執行您想要的循環的組件庫,要么重構 bean 以便不是循環運動 ID,而是循環運動列表,其中每個運動都有其 ID 和設備.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.