【问题标题】:How to implement server-side sorting on a data table如何在数据表上实现服务器端排序
【发布时间】:2012-05-06 15:51:17
【问题描述】:

我计划为要在网页上显示的数据表实现服务器端排序和分页。数据表是一个带有外部 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。备份类的每个实例由一个数据库表行组成。

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

我现在陷入了如何为任何备份类制作通用排序功能的问题上。您的建议将不胜感激。

【问题讨论】:

  • 你能提供一些代码吗?
  • @andersoj:添加了一些示例代码和更多解释。
  • 你可以使用数据库排序吗?
  • @AmirPashazadeh:这样,每列点击都会触发一个新的数据库查询。它不会有效率。

标签: java sorting server-side


【解决方案1】:

为要排序的列实现不同的Comparators。然后,您可以使用 Collections.sort 或类似方法在服务器上进行排序。

【讨论】:

  • 所以实现一个比较器,它通过反射工作,并按对象的字段对对象进行排序。
【解决方案2】:

感谢 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 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2019-12-28
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2018-02-12
    相关资源
    最近更新 更多