/**
* 1 request.name; 2 process.name 3 apptype.name
* 4 request.status 5 request.date 6 request.creater
* @return
*/
public List<CusRequest> sortList(List<CusRequest> crqList,int colIndex,String order){
Comparator cmp1 = new CusRequestCompare(colIndex,order);
Collections.sort(crqList, cmp1);
return crqList;
}
class CusRequestCompare implements Comparator {
int index=0;
String order = "desc";
CusRequestCompare(int i,String orderf ){
index = i;
order = orderf;
}
public int compare(Object o1, Object o2) {
CusRequest r1=(CusRequest)o1;
CusRequest r2=(CusRequest)o2;
String c1="";
String c2="";
long d1 = 0;
long d2 = 0;
switch(index){
case 1:
c1= r1.getName();
c2 = r2.getName();
break;
case 2:
c1 = r1.getProcess().getName();
c2 = r2.getProcess().getName();
break;
case 3:
c1 = r1.getAppType().getDescription();
c2 = r2.getAppType().getDescription();
break;
case 4:
c1 = UtilLocaleMessage.getLocaleMessage("rm.PROCESS");
if(r1.getFinalState()!=null){
c1 = r1.getFinalState().toString();
}
c2 = UtilLocaleMessage.getLocaleMessage("rm.PROCESS");
if(r2.getFinalState()!=null){
c2 = r2.getFinalState().toString();
}
break;
case 5:
d1 = r1.getApplyDate().getTime();
d2 = r2.getApplyDate().getTime();
break;
case 6:
c1 = r1.getApplicant().getEmpName();
c2 = r2.getApplicant().getEmpName();
break;
}
Collator myCollator = Collator.getInstance(java.util.Locale.CHINA);
if(c1.equals("")){
if ((d1-d2) < 0) {
if(order.equals("desc")){
return -1;
}else{
return 1;
}
}else if ((d1-d2) > 0){
if(order.equals("desc")){
return 1;
}else{
return -1;
}
}else{
return 0;
}
}else{
if (myCollator.compare(c1,c2) < 0) {
if(order.equals("desc")){
return -1;
}else{
return 1;
}
}else if (myCollator.compare(c1,c2) > 0){
if(order.equals("desc")){
return 1;
}else{
return -1;
}
}else{
return 0;
}
}
}//override compare
}//class CusRequestCompare
其中,list是要排序的对象;
这个list是现实在一个table中的,可以按照表头进行排序,我这里用了表头所在的列colIndex,进行标示对哪一列进行排序,ord是排序的顺序。
对应的页面jsp为
<thead>
<TR>
<TH id="1normal" οnclick="sort(this,1)"><bean:message key="cus.request.name"/><img id="1" style="display:none"/></TH>
<TH id="2normal" οnclick="sort(this,2)"><bean:message key="cus.request.process.name"/><img id="2" style="display:none"/></TH>
<TH id="3normal" οnclick="sort(this,3)"><bean:message key="cus.request.apptyp.name"/><img id="3" style="display:none"/></TH>
<TH id="4normal" οnclick="sort(this,4)"><bean:message key="cus.request.status"/><img id="4" style="display:none"/></TH>
<TH id="5normal" οnclick="sort(this,5)"><bean:message key="cus.request.create.date"/><img id="5" style="display:none"/></TH>
<TH id="6normal" οnclick="sort(this,6)"><bean:message key="cus.request.creater"/><img id="6" style="display:none"/></TH>
<TH><bean:message key="cus.request.history"/></TH>
</TR>
onclik 对应的js脚本为
function sort(obj,index){ document.getElementById("colIndex").value = index; var order = obj.id; if(order.indexOf("normal")>-1){ document.getElementById("order").value = "desc"; obj.id = index+"desc"; }else if(order.indexOf("desc")>-1){ document.getElementById("order").value="asc"; obj.id = index+"asc"; }else if(order.indexOf("asc")>-1){ document.getElementById("order").value="desc"; obj.id = index+"desc"; } setSubmitValues(); document.getElementById("sform").submit(); }
其中,colIndex和order是hidden变量,以方便每次form提交的时候,从jsp页面获取colIndex和order的值。
每次排序其实都请求了一次服务器端,进行了表单的一次提交。这样的效率的确很慢,非常不如用js脚本在客户端分页。但是在客户端分页却有一个致命的缺点:如果list中包含的数据非常庞大,比如十几万条,一下子把这些数据传到一个jsp页面是一件非常耗时的工作,而且恐怕也是不能实现的(这个我从来没有验证过,不知道这个传输的数据量有没有限制)
所以宁可每次都慢一点点,也不能让这种可怕的事情发生。
还有一个,就是我曾想过把list中的数据缓存在session中,但是这个想法也是不可行的:同样如果有几十万条记录,而且同时有很多用户访问这个表单查询页面的话,后果也是不可预料的。