首页 文章

PrimeFaces dataTable排序不起作用

提问于
浏览
2

我无法使PrimeFaces dataTable组件的排序行为按照记录的方式工作 . (我使用的是PrimFaces 4.0,JSF 2.1.12和Tomcat 7.0 . )据我所知,我看到的问题与PF dataTable相关的任何其他问题报告/讨论都不对应 . 为了探索这个问题,我基于使用已排序的dataTable的ShowCase示例创建了一个示例,复制了tableBean支持bean的ShowCase源代码(包括为示例生成本地汽车数据;不涉及外部数据库访问)和支持汽车类 . xhtml也是ShowCase示例的非常接近的副本:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
    <h:head>
    </h:head>
    <h:body>
           <h:form>

               <p:dataTable id="dataTable" var="car" value="#{tableBean.carsSmall}">
                   <f:facet name="header">
                       Ajax Sorting
                   </f:facet>

                   <p:column id="modelHeader" sortBy="#{car.model}">
                       <f:facet name="header">
                           <h:outputText value="Model" />
                       </f:facet>
                       <h:outputText value="#{car.model}" />
                   </p:column>

                   <p:column sortBy="#{car.year}">
                       <f:facet name="header">
                           <h:outputText value="Year" />
                       </f:facet>
                       <h:outputText value="#{car.year}" />
                   </p:column>

                   <p:column sortBy="#{car.manufacturer}">
                       <f:facet name="header">
                           <h:outputText value="Manufacturer" />
                       </f:facet>
                       <h:outputText value="#{car.manufacturer}" />
                   </p:column>

                   <p:column sortBy="#{car.color}">
                       <f:facet name="header">
                           <h:outputText value="Color" />
                       </f:facet>
                       <h:outputText value="#{car.color}" />
                   </p:column>
               </p:dataTable>

           </h:form>
    </h:body>
</html>

运行xhtml时,数据表会显示,但只显示一列可用于排序(即 Headers 中有向上/向下箭头图标) .

dataTable有两个问题:

  • 只有一列(Year)显示为可用于排序 . (Year是Car类中"int"类型的属性,而其他三列是String类型,因此问题的一个方面是String字段将忽略sortBy = "#"标记 . )

  • 实际上,Year列不可排序 . 单击Year Headers 的向上/向下箭头无效 . 单击Year标头时会发生服务器回调,但表未进行排序 . 我已经跟踪了在服务器回调期间发生的ELException,其中代码无法处理表达式"#" . 毫无疑问,_2596206应该是"year",失败的表达无疑是为什么没有进行排序 .

任何帮助都将被理解为什么这个非常简单的例子(几乎从ShowCase源中逐字复制)尝试使用PrimeFaces可排序的dataTable给我带来了悲伤 .

2 回答

  • 4

    像这样删除磅和花括号:

    由此:

    <p:column sortBy="#{car.manufacturer}">
    

    对此

    <p:column sortBy="manufacturer">
    

    我遇到了同样的问题而且仅仅是因为这个原因 .

  • 2

    你的第一个字符串是

    <p:dataTable id="dataTable" var="car" value="#{tableBean.cars}">
    

    所以tableBean有一个方法

    public List<Car> getCars()
    {
        return carEJB.findAll();
    }
    

    但是你的bean没有变量来排序后保存方法结果 .

    解:

    public class CarController
    {
    ...
        private List<Car> cars;
    ...
        privare void reset()
        {
            cars = carEJB.findAll();
        }
    ...
        public List<Car> getCars()
        {
            return cars;
        }
    }
    

相关问题