2012-04-21 13 views
1

Webページに表示するデータテーブルのサーバー側の並べ替えとページングを実装する予定です。データテーブルは、外部CSSを使用したJavascriptで管理されたHTMLテーブルです。データはAjaxによってサーバー側から取得されます。私は、データ表を表すためにサーバー側でクラスを作成することを考えていますが、異なる列でソートを実装する方法は考えていません。並べ替えは、テーブルをバックアップするすべてのクラスに十分な一般的なものでなければなりません。データテーブルにサーバー側の並べ替えを実装する方法

編集:このようなバックアップクラス:

public class Inventory 
{ 
    private int itemsLeft = 0; 
    private float price = 0.0f; 
    private boolean status = false; 
    private int itemsSold = 0; 

    public int getItemsSold() 
    { 
     return itemsSold; 
    } 
    public void setItemsSold(int itemsSold) 
    { 
     this.itemsSold = itemsSold; 
    } 
    //... and other getters and setters 
} 

プライベートフィールドの各データテーブルとテーブル全体の列のいずれかになりますが、インベントリのArrayListのように表されます。バックアップクラスの各インスタンスは、1つのデータベーステーブル行から構成されます。

ソート可能な列のヘッダーをクリックすると、選択した列に従ってデータをソートするために、その列のインデックスまたは名前がサーバーに送信されます。

私は現在、どのようなバックアップクラスでも一般的なソート機能を作成する方法についていません。あなたの提案は非常に高く評価されます。

+0

いくつかのコードを提供できますか? – andersoj

+0

@andersoj:サンプルコードと詳細な説明が追加されました。 – dragon66

+0

データベース注文を利用できますか? –

答えて

1

おかげで、いくつかの仕事の後、私は最終的にこの思い付く:

import java.util.Comparator; 
import java.lang.reflect.Method; 

public class ObjectComparator<T> implements Comparator<T>{ 

    private String field; 
    private String order; 
    private Method method; 
    private Class<T> cls; 

    public ObjectComparator(String field, String order, Class<T> c){ 
     this.field = field; 
     this.order = order; 
     this.cls = c; 
     init(); 
    } 

    private void init(){ 
     String field_name = "get"+field.substring(0,1).toUpperCase()+field.substring(1); 
     try{ 
      method = cls.getDeclaredMethod(field_name,new Class[]{}); 
     } 
     catch(Exception ex){ 
      System.err.println("No Such Method Found!"); 
     }   
    } 
    @SuppressWarnings("unchecked") 
    public int compare(T o1, T o2) { 
     try{  
      Object o1_ = method.invoke(o1,new Object[]{}); 
      Object o2_ = method.invoke(o2,new Object[]{}); 
      //Move all objects with null field values 
      //to the end of the list regardless of sorting order. 
      if(o1_== null) return 1; 
      else if(o2_== null) return -1; 
      ////////////////////////////////// 
      if (order.equalsIgnoreCase("asc"))     
       return ((Comparable<Object>)o1_).compareTo(o2_);  
      else 
       return ((Comparable<Object>)o2_).compareTo(o1_); 
     } 
     catch (Exception ex) 
     { 
      System.err.println("error sorting"); 
      return 0; 
     }   
    } 
} 

これを使用することができる:へのフィールドの名前FIELD_NAMEです。ここ

List<Inventory> list = new ArrayList<Inventory>();//populate list  
Collections.sort(list, new ObjectComparator<Inventory>(field_name, order, Inventory.class)); 

ソートされる。テーブルのヘッダーがクリックされると、要求パラメーターとしてサーバーに送信されます。この方法には要件があります。ドメインオブジェクトのすべてのソート可能なフィールドは、Comparableインターフェイスを実装する必要があります。また、興味のあるフィールドのJavaBeanスタイルのゲッタとセッタメソッドが必要です。

1

ソートする列に異なるComparatorsを実装します。その後、Collections.sortなどを使用してサーバー上でソートすることができます。アミールとcuberootへ

+1

リフレクションによって動作するコンパレータを実装し、フィールドでオブジェクトをソートします。 –

関連する問題