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>

列.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 设置为'#{value'而不是'id'。因此,模板内的参数在传递给 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 包含文件。

包含文件方法基本上只在视图构建期间构建一次包含文件,并将生成的 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>

(参数值可以引用多个标签库,你只需要用分号分隔它们)

然后你就可以按如下方式使用它,

<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 回答