我在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>
答案 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;
}
应该的。