Monday, June 18, 2012

Paging and Natural Sorting with Displaytag

Source: 
To determine the request parameter name for column sorting you can do:
   new ParamEncoder(tableId).encodeParameterName(TableTagParameters.PARAMETER_SORT))
To get the order (ASC/DESC):
   new ParamEncoder(tableId).encodeParameterName(TableTagParameters.PARAMETER_ORDER))
Descending is 2, Ascending is 1.



<%@ page import="beans.Employee,data.DAO,java.util.List,org.displaytag.tags.TableTagParameters,org.displaytag.util.ParamEncoder"%>

<logic:notEqual name="empList" value="null">
<jsp:scriptlet>
 if (session.getAttribute("empList") != null) {
   String sortBy = request.getParameter((new ParamEncoder("empTable")).encodeParameterName(TableTagParameters.PARAMETER_SORT));
   DAO.sort((List) session.getAttribute("empList"), sortBy);
 }
</jsp:scriptlet>

<display:table name="sessionScope.empList" pagesize="4" id="empTable" sort="external" defaultsort="1" defaultorder="ascending">
 <display:column property="empId" title="ID" sortable="true" sortName="empId" headerClass="sortable" />
 <display:column property="empName" title="Name" sortName="empName" sortable="true" headerClass="sortable" />
 <display:column property="empJob" title="Job" sortable="true" sortName="empJob" headerClass="sortable" />
 <display:column property="empSal" title="Salary" sortable="true" headerClass="sortable" sortName="empSal" />
</display:table>
</logic:notEqual>

public class DAO {
public static List getData(long minSal) {
 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
 Session session = sessionFactory.getCurrentSession();
 List result = null;
 try {
   session.beginTransaction();
   result = session.createQuery("from Employee as emp where emp.empSal >=?").setLong(0, minSal).list();
   System.out.println("Result size : " + result.size());
   session.getTransaction().commit();
 } catch (Exception e) {
   e.printStackTrace();
 }
 return result;
}

public static List sort(List<Employee> list, String sortBy) {
 Comparator comp = getComparator(sortBy);
 Collections.sort(list, comp);
 return list;
}

private static Comparator getComparator(String sortBy) {
 System.out.println("Sort by : " + sortBy);
 if (sortBy ==null) {
   return new NameComparator();
 }
 if (sortBy.equals("empName"))
   return new NameComparator();
 if (sortBy.equals("empId"))
   return new IdComparator();
 if (sortBy.equals("empSal"))
   return new SalComparator();
 if (sortBy.equals("empJob"))
   return new JobComparator();

 return null;

}

private static class NameComparator implements Comparator {
 public int compare(Object emp1, Object emp2) {
   Employee employee1 = (Employee) emp1;
   Employee employee2 = (Employee) emp2;
   return employee1.getEmpName().compareTo(employee2.getEmpName());
 }
}

private static class IdComparator implements Comparator {
 public int compare(Object emp1, Object emp2) {
   Employee employee1 = (Employee) emp1;
   Employee employee2 = (Employee) emp2;
   return new Long(employee1.getEmpId()).compareTo(new Long(employee2.getEmpId()));
 }
}

private static class SalComparator implements Comparator {
 public int compare(Object emp1, Object emp2) {
   Employee employee1 = (Employee) emp1;
   Employee employee2 = (Employee) emp2;
   return new Long(employee1.getEmpSal()).compareTo(new Long(employee2.getEmpSal()));
 }
}

private static class JobComparator implements Comparator {
 public int compare(Object emp1, Object emp2) {
   Employee employee1 = (Employee) emp1;
   Employee employee2 = (Employee) emp2;
   return employee1.getEmpJob().compareTo(employee2.getEmpJob());
 }
}

}