17

Mapを使用して表示する必要があります<h:dataTable>。私のバッキングBeanには次のようなMapプロパティがあります。

public class Bean {

    private Map<Integer,String> map; // +getter

    @PostConstruct
    public void init() {
        map = new TreeMap<Integer,String>();
        map.put(1,"Sasi");
        map.put(2,"Pushparaju");
        map.put(3,"Venkat Raman");
        map.put(3,"Prabhakaran");
    }

}

Map次に、JSFページで、このプロパティをのvalue属性にバインドしようとしています<h:dataTable>

 <h:dataTable border="1" value="#{bean.map}" var="map">
    <h:column id="column1">
        <f:facet name="header">
            <h:outputText value="UserId"></h:outputText>
        </f:facet>
        <h:outputText value="#{map.getKey}"></h:outputText>
    </h:column>
    <h:column id="column2">
        <f:facet name="header">
            <h:outputText value="Email Id"></h:outputText>
        </f:facet>
        <h:outputText value="#{map.getValue}"></h:outputText>
    </h:column>
</h:dataTable>

getKeyとが存在しないというエラーが発生してgetValueいます。これは正しい方法ではないことを理解できます。Map使用法を提示するにはどうすればよい<h:dataTable>ですか?

4

3 に答える 3

29

今後のJSF2.3までは、、などのコンポーネントは、UIDataの反復をサポートしていませ。これはでのみサポートされています。<h:dataTable><p:dataTable><ui:repeat>Map<c:forEach>

1つの方法は、マップエントリを配列に変換することです(今後のJSF 2.3まではサポートされないため、単独では機能しませんentrySet()) 。UIDataSet

<h:dataTable value="#{bean.map.entrySet().toArray()}" var="entry">
    <h:column>#{entry.key}</h:column>
    <h:column>#{entry.value}</h:column>
</h:dataTable>

もう1つの方法は、マップのエントリセットを、<h:dataTable>反復可能なコレクション(。など)でラップすることArrayListです。

public class Bean {

    private Map<Integer, String> map;
    private List<Entry<Integer, String>> entries; // +getter (no setter necessary)

    @PostConstruct
    public void init() {
        map = new TreeMap<>();
        map.put(1, "Sasi");
        map.put(2, "Pushparaju");
        map.put(3, "Venkat Raman");
        map.put(4, "Prabhakaran");
        entries = new ArrayList<>(map.entrySet());
    }

    // ...
}
<h:dataTable value="#{bean.entries}" var="entry">
    <h:column>#{entry.key}</h:column>
    <h:column>#{entry.value}</h:column>
</h:dataTable>

ただし、よりクリーンで自己文書化され、再利用可能なのは、List<User>代わりに、Userクラスが必要なプロパティidとを持っている場合に使用することnameです。

public class Bean {

    private List<User> users; // +getter (no setter necessary)

    @PostConstruct
    public void init() {
        users = new ArrayList<>();
        users.add(new User(1, "Sasi"));
        users.add(new User(2, "Pushparaju"));
        users.add(new User(3, "Venkat Raman"));
        users.add(new User(4, "Prabhakaran"));
    }

    // ...
}
<h:dataTable value="#{bean.users}" var="user">
    <h:column>#{user.id}</h:column>
    <h:column>#{user.name}</h:column>
</h:dataTable>
于 2013-01-15T18:03:06.100 に答える
4

この代替手段も試すことができます。

<h:dataTable border="1" value="#{myBean.map.keySet().toArray()}" var="myVar">
    <h:column id="column1">
        <f:facet name="header">
            <h:outputText value="UserId"></h:outputText>
        </f:facet>
            <h:outputText value="#{myVar}"></h:outputText>
    </h:column>
    <h:column id="column2">
        <f:facet name="header">
            <h:outputText value="Email Id"></h:outputText>
        </f:facet>
            <h:outputText value="#{myBean.map.get(myVar)}"></h:outputText>
    </h:column>
</h:dataTable>
于 2013-01-16T11:56:04.400 に答える
3

prageethからの最後の回答に関しては、keySetの代わりにentrySetを使用できます。次に、myBean.map.getを削除できます。この例を参照してください。

<h:dataTable border="1" value="#{myBean.map.entrySet().toArray()}" var="map">
<h:column id="column1">
    <f:facet name="header">
        <h:outputText value="UserId"></h:outputText>
    </f:facet>
        <h:outputText value="#{map.key}"></h:outputText>
</h:column>
<h:column id="column2">
    <f:facet name="header">
        <h:outputText value="Email Id"></h:outputText>
    </f:facet>
        <h:outputText value="#{map.value}"></h:outputText>
</h:column>
</h:dataTable>

これはmyfaces2.2.3で機能します。これは、私が自分で使用したばかりだからです。

注釈:最後の投稿にコメントしたほうがいいのですが、私の評判は十分に高くないので、これは追加の回答です。

于 2014-06-17T16:13:53.380 に答える