排序参数未正确传递给延迟加载Icefaces ace:dataTable

时间:2012-04-05 09:11:19

标签: jsf datatable lazy-loading facelets icefaces

我正在尝试在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设置为'#{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还是不应该工作?如果可能的话,我该怎么做才能正确传递参数?

1 个答案:

答案 0 :(得分:0)

您需要Facelets标记文件而不是Facelets包含文件。

包含文件方法在视图构建期间基本上只构建一次包含文件,并在结果中插入生成的JSF组件树,然后在视图渲染时间内处理。由于JSTL标记在视图构建期间执行,这意味着此时已经处理了所有JSTL标记。但是,JSF数据表在视图构建期间不会被处理,但仅在视图渲染时间内处理,因此其var将始终评估为null,因此#{value}始终为{{1}在包含文件中。

标记文件方法将在视图渲染时处理标记文件,因此您基本上将JSTL作业从视图构建时移动到查看渲染时间,然后数据表的null将在EL范围。

您可以保持var代码不受影响(我只会将其放在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

(param值可以引用多个taglib,你只需要用分号分隔它们)

然后您将能够按如下方式使用它,

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

另见: