2012-04-21 50 views
1

我打算實現服務器端排序和分頁,以便在網頁上顯示數據表。數據表是一個帶有外部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爲數據表和整個表的列中的一個。備份類的每個實例都由一個數據庫表格行組成。

當單擊任何可排序列的標題時,列的索引或名稱將被髮送到服務器,以根據所選列對數據進行排序。

我現在被困在如何爲任何備份類做一個通用的排序功能。您的建議將非常感謝。

+0

你能提供一些代碼嗎? – andersoj 2012-04-21 21:00:36

+0

@andersoj:增加了一些示例代碼和更多解釋。 – dragon66 2012-04-21 21:37:05

+0

您可以使用數據庫順序嗎? – 2012-04-21 21:40:23

回答

1

由於阿米爾和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方法。

1

針對要排序的列實施不同的Comparators。然後,您可以使用Collections.sort或類似的服務器進行排序。

+1

因此實現一個比較器,它通過反射來工作,並按照它們的字段對對象進行排序。 – 2012-04-21 21:41:03

相關問題