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