0

在 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>
4

1 回答 1

1

不,不可能使用 ui:repeat 在数据表中包含动态列。您可以尝试使用 Primefaces 或 Richfaces 等组件库,它可以让您轻松拥有动态列。在链接中,您可以看到 Primefaces 的动态列功能正在发挥作用。此外,您可以尝试在支持 bean 中动态创建表模型。此 BalusC 的教程解释了如何做到这一点。

于 2012-06-25T13:25:34.617 回答