Beispiel für das Sortieren von JSF 2-Datentabellen - DataModel
In den vorherigenJSF 2 dataTable sorting example wurde am einfachsten ein benutzerdefinierter Komparator gezeigt, um eine Liste zu sortieren und in dataTable anzuzeigen.
DataModel Decorator
In diesem Beispiel wird eine andere Möglichkeit zum Sortieren der Liste in dataTable gezeigt, die in „Core JavaServer Faces (3rd Edition)“ (DataModel Decorator) erwähnt wird.
1. Datenmodell
Erstellen Sie eine Decorator-Klasse, um diejavax.faces.model.DataModel-Klasse zu erweitern, und fügen Sie ein zusätzliches Sortierverhalten hinzu. Nun, ein bisschen kompliziert zu erklären, lesen Sie bitte das Buch für Details :)
package com.example; import java.util.Arrays; import java.util.Comparator; import javax.faces.model.DataModel; public class SortableDataModelextends DataModel { DataModel model; private Integer[] rows; SortableDataModel(DataModel model){ this.model = model; initRows(); } public void initRows(){ int rowCount = model.getRowCount(); if(rowCount != -1){ this.rows = new Integer[rowCount]; for(int i = 0; i < rowCount; ++i){ rows[i] = i; } } } public void sortBy(final Comparator comparator){ Comparator rowComp = new Comparator () { public int compare(Integer i1, Integer i2){ E o1 = getData(i1); E o2 = getData(i2); return comparator.compare(o1, o2); } }; Arrays.sort(rows, rowComp); } private E getData(int row){ int originalRowIndex = model.getRowIndex(); model.setRowIndex(row); E newRowData = model.getRowData(); model.setRowIndex(originalRowIndex); return newRowData; } @Override public void setRowIndex(int rowIndex) { if(0 <= rowIndex && rowIndex < rows.length){ model.setRowIndex(rows[rowIndex]); }else{ model.setRowIndex(rowIndex); } } @Override public boolean isRowAvailable() { return model.isRowAvailable(); } @Override public int getRowCount() { return model.getRowCount(); } @Override public E getRowData() { return model.getRowData(); } @Override public int getRowIndex() { return model.getRowIndex(); } @Override public Object getWrappedData() { return model.getWrappedData(); } @Override public void setWrappedData(Object data) { model.setWrappedData(data); initRows(); } }
2. Managed Bean
Eine verwaltete Bean, die eine Dummy-Liste zum Testen bereitstellt und die Verwendung voncustom DataModel to sort the dataTable list zeigt.
package com.example;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Comparator;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.ArrayDataModel;
import javax.faces.model.DataModel;
@ManagedBean(name="order")
@SessionScoped
public class OrderBean implements Serializable{
private static final long serialVersionUID = 1L;
private SortableDataModel sotableDataModel;
private boolean sortAscending = true;
private static final Order[] orderList = {
new Order("A0002", "Harddisk 100TB",
new BigDecimal("500.00"), 3),
new Order("A0001", "Intel CPU",
new BigDecimal("4200.00"), 6),
new Order("A0004", "Samsung LCD",
new BigDecimal("5200.00"), 10),
new Order("A0003", "Dell Laptop",
new BigDecimal("11600.00"), 9),
new Order("A0005", "A4Tech Mouse",
new BigDecimal("200.00"), 20)
};
public OrderBean(){
sotableDataModel = new SortableDataModel(
new ArrayDataModel(orderList));
}
public DataModel getOrderList() {
return sotableDataModel;
}
//sort by order no
public String sortByOrderNo() {
if(sortAscending){
sotableDataModel.sortBy(new Comparator() {
@Override
public int compare(Order o1, Order o2) {
return o1.getOrderNo().compareTo(o2.getOrderNo());
}
});
sortAscending = false;
}else{
//descending order
sotableDataModel.sortBy(new Comparator() {
@Override
public int compare(Order o1, Order o2) {
return o2.getOrderNo().compareTo(o1.getOrderNo());
}
});
sortAscending = true;
}
return null;
}
public static class Order{
String orderNo;
String productName;
BigDecimal price;
int qty;
public Order(String orderNo, String productName,
BigDecimal price, int qty) {
this.orderNo = orderNo;
this.productName = productName;
this.price = price;
this.qty = qty;
}
//getter and setter methods
}
}
2. dataTable-Tag
Fügen Sie auf einer JSF-Seite ein commandLink-Tag in die Spaltenüberschrift "Order No" ein, und sortieren Sie die dataTable-Liste, wenn Sie darauf klicken.
JSF 2 dataTable sorting example
Order No
#{o.orderNo}
Product Name
#{o.productName}
Price
#{o.price}
Quantity
#{o.qty}
3. Demo
Zeigt von oben nach unten eine dataTable-Liste an, die in aufsteigender und absteigender Reihenfolge sortiert ist.



Quellcode herunterladen
Laden Sie es herunter -JSF-2-DataTable-Sorting-DataModel-Example.zip (11 KB)