簡體   English   中英

我可以使用 JSF 1.2 和 JSP 2.1 在 ac:forEach 標記上的統一 EL 表達式中使用哈希表嗎?

[英]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 &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())。

@ keith30xi.myopenid.com

在 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標記以簡單的方式獲得它。

兩個問題:

  1. 數據表只能有以下子項:頁眉方面、頁腳方面、列。 其他任何東西都不會被正確評估。
  2. JSTL 標簽不能與 JSF 組件交織在一起。 在創建組件樹時評估 JSTL 標記。 在呈現頁面時評估 JSF 組件。 因此,c:forEach 標記僅被評估一次 - 在創建組件樹時,這可能是在“#{bean.sportIds}”可用之前。

要么使用一個 JSF 組件庫來提供您想要的循環,構建一個執行您想要的循環的組件庫,要么重構 bean 以便不是循環運動 ID,而是循環運動列表,其中每個運動都有其 ID 和設備.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM