2012-04-21 2 views
1

데이터 테이블이 웹 페이지에 표시되도록 서버 측 정렬 및 페이징을 구현할 계획입니다. 데이터 테이블은 외부 CSS가있는 자바 스크립트로 관리되는 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

+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 스타일 getter 및 setter 메소드가 있어야합니다.

1

정렬하려는 열에 대해 다른 Comparators을 구현하십시오. 그런 다음 Collections.sort 또는 유사하게 서버에서 정렬 할 수 있습니다. 아미르와 cuberoot에

+1

리플렉션에 의해 작동하는 콤퍼레이터를 구현하고 필드별로 객체를 정렬하십시오. –

관련 문제