1

ボタンをクリックすると、フォルダー内のファイルのリストを取得しています。フォルダを取得する関数が機能し、テーブルがレンダリングされる前にそれをロードすると、値が適切に表示されます。ただし、値のリストを初期化する関数を呼び出すコマンドボタンを使用してテーブルを作成しようとすると、データテーブルは変更されません。これが私のコードです:

<h:form id="resultform"> 
    <p:dataTable id="resulttable" value="#{ViewBean.resultList}" var="result">
        <p:column>
            <f:facet name="header">
                <h:outputText value="GFEXP_NOM_BDOC" />
            </f:facet>
            <h:outputText value="#{result.name}" />
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="GFEXP_DATE_MODIF" />
            </f:facet>
            <h:outputText value="#{result.date}" />
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="GFEXP_PATH" />
            </f:facet>
            <h:outputText value="#{result.path}" />
        </p:column>
        <f:facet name="footer">
            <p:commandButton value="REFRESH exploitation" action="#{ViewBean.refresh}" update=":resultform:resulttable" ajax="true" />
        </f:facet>
    </p:dataTable>
</h:form>

バッキング Bean コードは次のとおりです。

@ManagedBean(name = "ViewBean")
@ViewScoped
public class ViewBean implements Serializable {

    private static final long serialVersionUID = 9079938138666904422L;

    @ManagedProperty(value = "#{LoginBean.database}")
    private String database;

    @ManagedProperty(value = "#{ConfigBean.envMap}")
    private Map<String, String> envMap;

    private List<Result> resultList;

    public void initialize() {
        setResultList(Database.executeSelect(database));

    }

    public void refresh() {
        List<File> fileList = readDirectory();
        List<Result> tmpList = new ArrayList<Result>();
        for (File f : fileList) {
            Result result = new Result(f.getName().substring(0,
                    f.getName().lastIndexOf(".")), String.valueOf(f
                    .lastModified()), f.getPath().substring(0,
                    f.getPath().lastIndexOf("\\") + 1));
            tmpList.add(result);
        }
        setResultList(tmpList);
    }
//GETTERS AND SETTERS
4

1 に答える 1

2

preRenderViewビュー スコープ Bean の状態を初期化するために悪用しているようです。ただし、その名前が示すように、ビューのレンダリングの直前に実行されます。代わりに、そのために@PostConstruct注釈を使用する必要があります。メソッドを配置すると、そのメソッドは、Bean の構築とすべての管理プロパティおよび依存関係の注入の後に呼び出されます。同じビューに対する後続のすべてのポストバック リクエストで呼び出されるわけではありません。

@PostConstruct
public void initialize() {
    resultList = Database.executeSelect(database);
}

<f:event>を完全に削除することを忘れないでください。

以下も参照してください。

于 2013-08-21T14:32:55.123 に答える