2

私は、sportMap と呼ばれる Hashtable<Integer, Sport> と、バッキング Bean からの sportIds (List<Integer> sportIds) のリストを持っています。Sport オブジェクトには List<String> equipmentList があります。各スポーツの用具のリストを取得するために、統合 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] 例外の根本原因
javax.servlet.ServletException: javax.servlet.jsp.JspTagException:
      <forEach> で提供された「アイテム」を反復処理する方法がわかりません。

ここに私の環境のプリントアウトがあります

サーバー: JBossWeb/2.0.1.GA
サーブレット仕様: 2.5
JSP バージョン: 2.1
JSTL バージョン: 1.2
Java バージョン: 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() をオーバーライドしたくない)。

4

3 に答える 3

2

@ keith30xi.myopenid.com

JSF 1.2 では TRUE ではありませんjava.net wiki faqによると、それらは期待どおりに連携するはずです。

以下は、各 FAQ からの抜粋です。

JSF 1.1 FAQ
Q. JavaServer Faces タグは、JSTL コア タグの forEach、if、choose、when と相互運用できますか?

A. forEach タグは、JSTL と JavaServer Faces テクノロジで使用される戦略の間に互換性がないため、JavaServer Faces テクノロジ、バージョン 1.0 および 1.1 タグでは機能しません。代わりに、dataTable タグで使用される Table レンダラーなど、独自の反復を実行するレンダラーを使用できます。if、choose、when タグは機能しますが、これらのタグ内にネストされた JavaServer Faces タグには明示的な識別子が必要です。

この欠点は、JSF 1.2 で修正されました。

JSF 1.2 FAQ
Q. JavaServer Faces タグは、JSTL コア タグの forEach、if、choose、when と相互運用できますか?

A.はい。JSP Id Consumer と呼ばれる JSP 2.1 の新機能により、これらのタグは期待どおりに機能します。

特にforEachのJSTLコアタグでJSFタグを使用した人はいますか?

于 2008-09-26T16:37:01.923 に答える
2

私はかつて同じ問題を抱えていましたが、dataTable を使用して解決策を見つけることができませんでした。問題は、var _sportIdが dataTable コンポーネントによってのみ読み取られることです。

ループ内でループを実行する必要がある場合は、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 項目がテーブル行内に出力されます。それは私にとって素晴らしい解決策ではありませんでした。

dataTable の代わりに通常の html テーブルを使用することにしました。

<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タグを使用して簡単に取得できます。

于 2008-11-13T14:12:52.490 に答える
-1

2 つの問題:

  1. dataTable は、ヘッダー ファセット、フッター ファセット、列の子のみを持つことができます。それ以外は正しく評価されません。
  2. JSTL タグは、JSF コンポーネントと織り交ぜることはできません。JSTL タグは、コンポーネント ツリーの作成時に評価されます。JSF コンポーネントは、ページがレンダリングされるときに評価されます。したがって、c:forEach タグは 1 回だけ評価されます。つまり、コンポーネント ツリーが作成されるときです。これは、"#{bean.sportIds}" が使用可能になる前である可能性があります。

必要なループを提供する JSF コンポーネント ライブラリを使用するか、必要なループを実行するものを構築するか、または Bean をリファクタリングして、sportIds をループする代わりに、各スポーツが ID と機器を持つスポーツのリストをループするようにします。 .

于 2008-09-26T00:57:36.030 に答える