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
}

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

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

私は今、バックアップクラスの一般的なソート関数を作成する方法に固執しています。あなたの提案は大歓迎です。

4

2 に答える 2

1

並べ替える列に異なるコンパレータを実装します。その後、Collections.sortなどを使用してサーバーで並べ替えることができます。

于 2012-04-21T20:56:20.720 に答える
1

Amirとcuberootのおかげで、いくつかの作業の後、私はついにこれを思いつきました:

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;
       }        
   }
}

これは次のように使用できます。

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

ここで、field_nameは、ソートされるフィールドの名前です。テーブルのヘッダーがクリックされると、リクエストパラメータとしてサーバーに送信されます。このアプローチには要件があります。ドメインオブジェクトのすべての並べ替え可能なフィールドは、Comparableインターフェイスを実装する必要があります。また、対象のフィールドにはJavaBeanスタイルのgetterメソッドとsetterメソッドが必要です。

于 2012-04-23T23:27:47.010 に答える