【问题标题】:Sorting parameters not passed correctly to a lazy loading Icefaces ace:dataTable排序参数未正确传递给延迟加载 Icefaces ace:dataTable
【发布时间】:2012-04-19 00:39:02
【问题描述】:

我正在尝试在 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 的模板,还是这不应该工作?如果可以的话,我该怎么做才能正确传递参数?

【问题讨论】:

  • 能分享一下lazyModel类的实现吗?
  • 离题但 IceFaces 是 PrimeFaces 的一个分支,以防你不知道。 blog.primefaces.org/?p=1750

标签: jsf datatable lazy-loading facelets icefaces


【解决方案1】:

您需要一个 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>

另见:

【讨论】:

  • 感谢您的意见!不幸的是,它没有用。我做了以下事情: - 如所述在 WEB-INF/taglibs 中创建 datatable.taglib.xml - 将 column.xhtml 移动到 WEB-INF/taglibs/datatable/column.xhtml - 在我的页面中包含标签 该列被显示,所以标签正在工作。但是 load() 方法仍然会被 '#{value' 调用。我想知道为什么传递的参数上没有右括号。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 2018-05-20
相关资源
最近更新 更多