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 of Inventory。备份类的每个实例由一个数据库表行组成。

当点击任意可排序列的表头时,该列的索引或名称将被发送到服务器,以根据选择的列对数据进行排序。

我现在被困在如何为任何备份类制作通用排序功能。您的建议将不胜感激。

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 回答