2

ace:dataTable に遅延読み込みを実装しようとしています。私の Web アプリケーションには非常に多くのテーブルがあるため、列のテンプレートを使用して冗長性を削減しようとしました。現在、私のテーブルは次のようになっています。

私のxhtmlページのデータテーブル

<ace:dataTable 
    id="produktdatenTabelle"
        value="#{produktdatenBean.lazyModel}"
        var="row"
        rows="20"
        paginator="true"
        paginatorPosition="bottom"
        paginatorAlwaysVisible="true"
        lazy="true">

    <ui:include src="/resources/aceDataTable/column.xhtml">
        <ui:param name="title" value="ID" />
        <ui:param name="value" value="#{row.id}" />
    </ui:include>

    <ui:include src="/resources/aceDataTable/column.xhtml">
        <ui:param name="title" value="Description" />
        <ui:param name="value" value="#{row.description}" />
    </ui:include>

</ace:dataTable>

column.xhtml

<ui:composition>
    <ace:column headerText="#{title}" sortBy="#{value}" filterBy="#{value}" filterMatchMode="contains">
        <c:choose>
            <!-- Editable -->
            <c:when test="${editable == 'true'}">
                <ace:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{value}"/>
                    </f:facet>
                    <f:facet name="input">
                        <h:inputText value="#{value}" />
                    </f:facet>
                </ace:cellEditor>
            </c:when>
            <!-- Not editable -->
            <c:otherwise>
                <h:outputText value="#{value}"/>
            </c:otherwise>
        </c:choose>
    </ace:column>
</ui:composition>

produktdatenBean.lazyModel のクラス

public class LazyDataModelImpl<D> extends LazyDataModel<D>
{

    @Override
    public List<D> load(int first, int pageSize, SortCriteria[] sortCriteria, Map<String, String> filters)
    {
        ...
    }

}

パラメータ「first」と「pageSize」が正しく渡され、データベースからオブジェクトをロードするために使用できます。だからすべてがそこで働いています。しかし今、私は並べ替えようとしています。

列 ID で並べ替えると、配列 'sortCriteria' で SortCriteria のオブジェクトが取得されます (予想どおり)。残念ながら、propertyNameが'id'ではなく'#{value'に設定されています。そのため、テンプレート内のパラメーターは、load() メソッドに渡されたときに解決されません。

テンプレートを削除してテーブルを

テンプレートを削除したデータテーブル

<ace:dataTable 
        id="produktdatenTabelle"
        value="#{produktdatenBean.lazyModel}"
        var="row"
        rows="20"
        paginator="true"
        paginatorPosition="bottom"
        paginatorAlwaysVisible="true"
        lazy="true">

    <ace:column headerText="ID" sortBy="#{row.id}" filterBy="#{row.id}" filterMatchMode="contains">
        <h:outputText value="#{row.id}"/>
    </ace:column>

    <ace:column headerText="Description" sortBy="#{row.description}" filterBy="#{row.description}" filterMatchMode="contains">
        <h:outputText value="#{row.description}"/>
    </ace:column>

</ace:dataTable>

すべてが期待どおりに機能します (SortCriteria は propertyName を'id'に設定しました)。

だから私の質問は: 遅延読み込み ace:dataTable でテンプレートを使用できますか、またはこれは機能しないはずですか? 可能であれば、パラメータを正しく渡すにはどうすればよいですか?

4

1 に答える 1

0

Faceletsインクルードファイルの代わりにFaceletsタグファイルが必要です。

インクルードファイルアプローチは、基本的に、ビューのビルド時にインクルードファイルを1回だけビルドし、結果のJSFコンポーネントツリーをその場所に挿入します。このツリーは、ビューのレンダリング時に処理されます。JSTLタグはビューのビルド時に実行されるため、これはすべてのJSTLタグがその時点ですでに処理されていることを意味します。ただし、JSFデータテーブルは、ビューのビルド時に処理されず、ビューのレンダリング時にのみ処理されるため、常にvar評価され、インクルードファイルに常に含まれます。null#{value}null

タグファイルアプローチは、ビューのレンダリング時にタグファイルを処理するため、基本的にJSTLジョブをビューのビルド時間からビューのレンダリング時間に移動するvarと、データテーブルのがELスコープで使用できるようになります。

column.xhtmlコードはそのままにしておくことができます(/WEB-INFエンドユーザーがスタンドアロンでコードを要求できないようにするためだけにコードを入れます)。ファイルを作成するだけで済み.taglib.xmlます。例/WEB-INF/custom.taglib.xml

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0"
>
    <namespace>http://example.com/custom</namespace>

    <tag>
        <tag-name>column</tag-name>
        <source>/WEB-INF/tags/column.xhtml</source>
    </tag>
</facelet-taglib>

これを次のように登録すると/WEB-INF/web.xml

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/custom.taglib.xml</param-value>
</context-param>

(param値は複数のtaglibを参照できます。セミコロンで区切る必要があります)

そうすれば、次のように使用できるようになります。

<html ... xmlns:my="http://example.com/custom">

...

<ace:dataTable 
    id="produktdatenTabelle"
        value="#{produktdatenBean.lazyModel}"
        var="row"
        rows="20"
        paginator="true"
        paginatorPosition="bottom"
        paginatorAlwaysVisible="true"
        lazy="true">

    <my:column title="ID" value="#{row.id}" />
    <my:column title="Description" value="#{row.description}" />
</ace:dataTable>

参照:

于 2012-04-05T13:46:16.693 に答える