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 に答える