<h:dataTable>
を使用してMap
を表示する必要があります。私のバッキング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");
}
}
次に、JSFページで、このMap
プロパティを<h:dataTable>
のvalue
属性にバインドしようとしています。
<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
が存在しないというエラーが発生しています。これは正しい方法ではないことを理解できます。 <h:dataTable>
を使用してMap
を提示するにはどうすればよいですか?
今後のJSF 2.3までは、_<h:dataTable>
_、_<p:dataTable>
_などのUIData
コンポーネントと_<ui:repeat>
_はMap
の反復をサポートしていますnot。これは_<c:forEach>
_でのみサポートされています。
1つの方法は、マップエントリを配列に変換することです(単独のentrySet()
は、UIData
がSet
をサポートしないため、次のJSF 2.3まで機能しません)。
_<h:dataTable value="#{bean.map.entrySet().toArray()}" var="entry">
<h:column>#{entry.key}</h:column>
<h:column>#{entry.value}</h:column>
</h:dataTable>
_
別の方法は、_<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>
_
この代替案も試すことができます。
<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>
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>
Myfaces 2.2.3は、自分で使用したばかりなので機能します。
注釈:私は前回の投稿にコメントしたほうがいいですが、私の評判は十分に高くないので、これは追加の回答です。