使用原生 <h:dataTable>,您必须自己在托管 bean 中进行排序。您可以使用内置的现有 JSF 扩展库,例如:
- MyFaces 战斧 - docs
- ICEfaces - docs
- RichFaces - docs
- PrimeFaces - docs
- 等等,太多了,无法说明。
但是,如果您不想使用上述工具包,那么在您的托管 bean 中,您可以定义您的列表和排序顺序(asc 或 dec)。它可以是您想要的简单或复杂。
将Ordering 库更改为SortOrder 库,引用此库:import org.richfaces.component.SortOrder;
可以使用<rich:column> 属性以编程方式在变量中定义排序顺序比较器:
private SortOrder sorting = SortOrder.unsorted;
This is an example of using SortOrder programmatically using JSF 2.x/RichFaces 4.x。它使用三态排序方法:未排序(默认)、升序和降序,并通过设置 sortOrder 属性来实现。
或者可以在代码中覆盖比较器的默认行为,如下例所示:
@ManagedBean(name="somebean")
@SessionScoped
public class OrderBean implements Serializable {
private static final long serialVersionUID = ....;
private List<Item> items;
private boolean sortAscending;
...
}
在您看来,您定义了要排序的标题,因此添加一个 commandLink 以使每个标题都可点击。
<h:dataTable value="#{somebean.items}" var="i">
<h:column>
<f:facet name="header">
<h:commandLink action="#{somebean.sort}"> Sort Column</h:commandLink>
</f:facet>
#{i.name}
</h:column>
</h:dataTable>
现在您必须使用基本集合为您的 bean 实现排序,同样,它可以尽可能复杂:
private final Comparator NAME_SORT_ASC = new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.getName().compareTo(o2.getName());
}
}
};
private final Comparator NAME_SORT_DESC = new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o2.getName().compareTo(o1.getName());
}
}
};
public String sort() {
Collections.sort(items, sortAscending ? NAME_SORT_ASC : NAME_SORT_DESC );
}
你可以通过重复使用东西来让你的生活更轻松,而不是为每一列都这样做,我会让你弄清楚这一点。您可以使用更好的 Java 库来帮助您进行比较,例如使用来自 Google 的 Guava 或来自 Apache 的 Collection Commons。
与其做所有这些并重新发明轮子,不如使用一个为您抽象出所有这些的框架,它们让您的生活更轻松..