С нативным <h:dataTable>
вы должны выполнить сортировку в своем управляемом бине. Вы можете использовать существующие библиотеки расширений JSF, в которые они встроены, например:
Но если вы не хотите использовать вышеуказанные наборы инструментов, то в управляемом компоненте вы определяете свой список и порядок сортировки (asc или dec). Это может быть так просто или сложно, как вы хотите.
Измените библиотеку Ordering
на библиотеку SortOrder
, ссылаясь на эту библиотеку: import org.richfaces.component.SortOrder;
Компаратор порядка сортировки может быть определен в переменной программно с помощью атрибута <rich:column>
:
private SortOrder sorting = SortOrder.unsorted;
Это пример программного использования SortOrder с использованием 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>
Теперь вам нужно реализовать сортировку для вашего компонента с помощью базовых коллекций, опять же, она может быть настолько сложной, насколько вы можете:
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, чтобы помочь вам сделать компаратор, например, с Guava от Google или Collection Commons от Apache.
Вместо того, чтобы делать все это и заново изобретать колесо, используйте рамки, которые абстрагируют вас от всего этого, они облегчают вашу жизнь ..