2

Map アイテムのリスト、つまり HashMaps の ArrayList などを繰り返し処理しようとしていますが、これを primefaces データテーブルで実行しようとしています。これは基本的に私がやろうとしていることです:

<body>
    <h:form>
        <p:dataTable value="#{customerBean.list}" var="map">
            <c:forEach items="#{map}" var="entry">
                <p:column headerText="#{entry.key}">
                    #{entry.value}
                </p:column>
            </c:forEach>
        </p:dataTable>
    </h:form>
</body>

この場合、customerBean.listは でありList<Map<String, String>>、エントリはMap<String, String>です。

私がやりたいことは、Map<String, String>マップエントリのキーをヘッダー名として使用し、値を出力として使用して、エントリの量に基づいて動的な量の列を作成することです。ハードc:forEachコードされた を使用しているときは問題なく動作しているようですMap<String, String>が、p:dataTable. プログラムは、さまざまなサイズのマップをループする必要がないように予防策を講じていると思います。とにかく、どうすればこれを機能させることができますか?Map 内のエントリの量に基づいて任意の数の列を作成するにはどうすればよいですか? Map<String, String>私はすべてが私の中で同じサイズであることを100%確信していることに注意してくださいList<Map<String, String>>

編集:

これが私の豆のソースです。コードは正常に動作し、すべてが問題です。問題は、ループがマップを通過しようとしないことです。

@ManagedBean
@SessionScoped
public class CustomerBean {

    private List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    private Mapper mapper = new Mapper();

    public CustomerBean() {
        list = mapper.all(); //gets data from database
    }

    public List<Map<String, String>> getList() { 
        return list;
    }

    public void setList(List<Map<String, String>> list) { 
        this.list = list;
    } 
}
4

1 に答える 1

5

Mapこの問題は、このコンテキストでの使用法とは無関係です。問題は、ビューがレンダリングされているときにのみ#{map}使用できる変数を取得しようとしているが、ビューが構築されている瞬間にその値に依存していることです。後者は初期のライフサイクル フェーズで実行されるため、要求されたときに基本的に利用できません。

それでも、タグ ハンドラ、または のようなビュー ビルド タグは、コンポーネント ツリーの構築時に評価<c:forEach>されるように、可変数の列を設定する唯一の方法です。<p:column>

注目に値するもう 1 つのことは、<c:forEach>タグのプロパティ ( など) にバインドされたバッキング Bean はitems、ビュー スコープ以外のものでなければならないということです。そのプロパティにアクセスしようとすると、そこにあります。この問題を解決するセットアップ コンステレーションは他にもいくつかありますが、ここでは説明しません。

<p:dataTable value="#{customerBean.list}" var="map">
    <c:forEach items="#{forEachBean.columnsMap}" var="entry">
        <p:column headerText="#{entry.key}">
            #{map[entry.key]}
        </p:column>
    </c:forEach>
</p:dataTable>

<p:columns>また、ほぼ同じことを行うヘルパー コンポーネントがあることも注目に値します。

于 2013-05-22T11:44:01.997 に答える