4

私のアプリケーションでは<h:dataTable>、マネージド Bean のプロパティを表示したいと考えています。現在、このテーブルは から作成されていList<Folder>ます。Folderここで、をより動的なものに変更したいと考えています。Folderこれは、後で別のフィールドを追加することにした場合に、クラスを変更したくないためです。Map<String, Object>に新しいフィールドを導入する代わりに、別のエントリを に追加する必要がありFolderます。

それで、 aList<Map<String, Object>>をにバインドすることは可能<h:dataTable>ですか?

4

1 に答える 1

5

HashMaps のリストを jsf コンポーネント h:dataTable にバインドすることは可能ですか?

<h:column>これは、 JSTL などのビュー ビルド時間タグを使用して必要なタグを生成する場合にのみ可能です<c:forEach>

環境が EL 2.2 をサポートしていると仮定した場合の具体的なキックオフの例を次に示します。

<h:dataTable value="#{bean.listOfMaps}" var="map">
    <c:forEach items="#{bean.listOfMaps[0].keySet().toArray()}" var="key">
        <h:column>
            #{map[key]}
        </h:column> 
    </c:forEach>
</h:dataTable>

(お使いの環境が EL 2.2 をサポートしていない場合は、マップ キー セットを aString[]またはとして返す別のゲッターを提供する必要がありますList<String>。)HashMapLinkedHashMap

2.1.18 より古いバージョンの Mojarra を使用している場合、欠点は、#{bean}(ビュー スコープではなく) リクエスト スコープである必要があることです。または、少なくとも、<c:forEach items>リクエスト スコープの Bean を参照する必要があります。<c:forEach>そうしないと、ビュー スコープがまだ使用できない場合、ビュー スコープ Bean がビュー ビルド時に実行されるたびに、すべての HTTP 要求で再作成されます。のビュー スコープ Bean が絶対に必要な場合は<h:dataTable>、いつでも専用の別のリクエスト スコープ Bean を作成できます<c:forEach items>。解決策は、Mojarra 2.1.18 以降にアップグレードすることです。背景情報については、JSF2 Facelets の JSTLも参照してください。

PrimeFacesなどの JSF コンポーネント ライブラリは、 with<x:columns>など、これをより簡単にするタグを提供する場合があります。<p:dataTable><p:columns>

<p:dataTable value="#{bean.listOfMaps}" var="map">
    <p:columns value="#{bean.listOfMaps[0].keySet().toArray()}" var="key">
        #{map[key]}
    </p:columns>
</p:dataTable>
于 2012-11-01T12:40:30.517 に答える