h:dataTable嵌套排序问题

时间:2018-10-17 16:22:23

标签: sorting jsf

我在JSF h:dataTable中遇到排序问题。

我必须构建一个表,其中初始总体排序标准是第一列中的分数。

如果有多个具有相同分数的条目,则这些条目应在具有名称的第二列中进行排序,名称应按字母顺序显示。

如果在第一和第二列中再次存在多个具有相同值的条目,则这些条目应在第三列(即位置名称)的功能中进行排序,并应按字母顺序再次列出。 / p>

如果在第一,第二和第三列中应该再次存在多个具有相同值的条目,则这些条目应根据第四列进行排序,该第四列是年龄数字,并应按升序显示

我知道我可以使用“ sortBy”属性和sortingOrder = ascending获得初始排序分数。但是我在前面提到的其他排序要求上遇到了麻烦,这是我在寻求帮助的地方...是否有一种无需使用自定义排序功能的方式?

这是dataTable的xhtml代码。

            <h:dataTable value = "#{userData.employees}" 
              var = "employee"
              styleClass = "employeeTable"
              headerClass = "employeeTableHeader"
              rowClasses = "employeeTableOddRow,employeeTableEvenRow"
              sortBy=“#{employee.score}“ sortOrder=“ascending“>
             <h:column>
              <f:facet id = "header">score</f:facet>
                #{employee.score}
             </h:column>

             <h:column>                 
              <f:facet name = "header">Name</f:facet>                   
               #{employee.name}
             </h:column>

             <h:column>
              <f:facet name = "header">Location</f:facet>
              #{employee.location }
             </h:column>

             <h:column>
              <f:facet name = "header">Age</f:facet>
              #{employee.age}
             </h:column>
           </h:dataTable>

1 个答案:

答案 0 :(得分:0)

TL; DR:您可以通过实际使用带有sortMode="multiple"sortBy="#{userData.employeeSortingMeta}"的素数表来返回org.primefaces.model.SortMeta实例的列表来实现此目的。

首先,您必须将纯HTML JSF dataTable转换为Primefaces Datatable,将ID属性添加到dataTable和列,再将sortBy属性添加到每列:

<!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:p="http://primefaces.org/ui">

<h:form id="frmEmployees">
<p:dataTable id="tblEmployees" value = "#{userData.employees}" 
  var = "employee"
  styleClass = "employeeTable"
  headerClass = "employeeTableHeader"
  rowClasses = "employeeTableOddRow,employeeTableEvenRow"
  sortBy=“#{userData.employeeSortingMeta}“ sortMode=“multiple“>
 <p:column id="score" sortBy="#{employee.score}">
  <f:facet id = "header">score</f:facet>
    #{employee.score}
 </p:column>

 <p:column id="name" sortBy="#{employee.name}">                 
  <f:facet name = "header">Name</f:facet>                   
   #{employee.name}
 </p:column>

 <p:column id="location" sortBy="#{employee.location}">
  <f:facet name = "header">Location</f:facet>
  #{employee.location }
 </p:column>

 <p:column id="age" sortBy="#{employee.age}">
  <f:facet name = "header">Age</f:facet>
  #{employee.age}
 </p:column>
</p:dataTable>

在您的bean中,创建用于构建排序元数据的方法:

private List<SortMeta> employeeSortingMeta;

public List<SortMeta> getEmployeeSortingMeta() {
    return this.employeeSortingMeta;
}

@PostConstruct
public void initialize() {
    employeeSortingMeta = new ArrayList<>(4);
    employeeSortingMeta.add(createSortMeta("score", SortOrder.DESCENDING));
    employeeSortingMeta.add(createSortMeta("name", SortOrder.ASCENDING));
    employeeSortingMeta.add(createSortMeta("location", SortOrder.ASCENDING));
    employeeSortingMeta.add(createSortMeta("age", SortOrder.ASCENDING));
}

private SortMeta createSortMeta(final String sortProperty, final SortOrder order) {
    // find the sort column component
    final UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
    final String columnIdPrefix = "frmEmployees:tblEmployees:";
    final UIColumn column = (UIColumn) viewRoot.findComponent(columnIdPrefix + sortProperty);
    assert null != column : "wtf?";

    // create sort meta
    final SortMeta sortMeta = new SortMeta();
    sortMeta.setSortBy(column);
    sortMeta.setSortField(sortProperty);
    sortMeta.setSortOrder(order);
    return sortMeta;
}

应该的。