在 ah:dataTable 中有一个 JSF ui:repeater 用于动态定义列是否有效?方法 getFieldNames(...) 永远不会被调用,即使它是从 html 中引用的。方法 getEntities 被调用。有任何想法吗?
@Named(value = "data")
@RequestScoped
public class MyBean {
List<Map<String, String>> data = new ArrayList<Map<String, String>>();
public CustomBean() {
final AtomicInteger i = new AtomicInteger(0);
for (final String fieldName : new String[]
{"ColumnOne", "ColumnTwo", "ColumnThree"}) {
data.add(new HashMap<String, String>() {
{
put(fieldName, fieldName + "_" + i.getAndDecrement());
}
});
}
}
public List<String> getFieldNames() {
// THIS METHOD DOES NOT GET CALLED
return new ArrayList<String>(data.get(0).keySet());
}
public List<Map<String, String>> getEntities() {
return data;
}
}
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Title</title>
</h:head>
<h:body>
<h:dataTable value="#{data.entities}" var="entity">
<ui:repeat var="fieldName" value="#{data.fieldNames}">
<h:column>
<f:facet name="header">#{fieldName}</f:facet>
#{entity.get(fieldName)}
</h:column>
</ui:repeat>
</h:dataTable>
</h:body>
</html>