Exemple de tri JSF 2 dataTable - DataModel

Exemple de tri JSF 2 dataTable - DataModel

Dans lesJSF 2 dataTable sorting exampleprécédents, montrait le moyen le plus simple, un comparateur personnalisé pour trier une liste et l'afficher dans dataTable.

DataModel Decorator

Dans cet exemple, il montre une autre façon de trier la liste dans dataTable, qui est mentionnée dans les «Core JavaServer Faces (3rd Edition)», appelée DataModel Decorator.

1. Modèle de données

Créez une classe de décorateur pour étendre la classejavax.faces.model.DataModel et ajoutez un comportement de tri supplémentaire. Eh bien, un peu compliqué à expliquer, veuillez vous référer au livre pour plus de détails :)

package com.example;

import java.util.Arrays;
import java.util.Comparator;
import javax.faces.model.DataModel;

public class SortableDataModel extends 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. Bean géré

Un bean géré pour fournir une liste fictive pour les tests, et montre l'utilisation decustom DataModel to sort the dataTable list.

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. Balise dataTable

Sur une page JSF, placez une balise commandLink dans l'en-tête de colonne "Order No", si vous cliquez sur, triez la liste dataTable.



    
        
    
    

        

JSF 2 dataTable sorting example

Order No #{o.orderNo} Product Name #{o.productName} Price #{o.price} Quantity #{o.qty}

3. Demo

De haut en bas, affiche une liste dataTable triée par ordre croissant et décroissant.

jsf2-dataTable-Sorting-Example-1

jsf2-dataTable-Sorting-Example-2

jsf2-dataTable-Sorting-Example-3

Télécharger le code source