新sales中的查询分页

      

        之前有过一篇关于分页的介绍,该篇在前篇基础上作了整理和扩展。主要改变在于:将代码分层,使逻辑更加清晰;增加了点击字段标题自动排序的功能;分页SQL改成了SQLSERVER2005专有的语句。
       效果图如下:
      
    
         如图,矩形部分可以认为是“form”标签的覆盖范围。每一次点击查询按钮、分页导航链接、标题栏或者“跳转”按钮的时候,都会引起三部分数据的提交(椭圆形勾勒处):
1.       各个查询参数。它们最终会被传递到DAO层用来拼凑分页SQL语句的where部分。
2.       当前页码信息。
3.       其他隐藏信息。包含了:
1)当前是否有“操作”列?这里用ID为“hasOperation”的hidden input来存放信息。设置这个参数用于决定:当点击第一列标题的时候,是否会引起页面的提交。
 2)如果被点击了字段标题,是哪个字段按照何种方式排序?这里用ID为“orderParam”的hidden input来存放信息。格式为“要排序的列序号:排序方式”,比如按照第一列升序排列可以记为“1:asc” 。
表现层(JSP页面)的结构大致如下:
xml 代码
  1. <html>  
  2.     <head>  
  3.      …   
  4.     head>  
  5.     <body   onload=”tableSort(‘list’)”> <!---->  
  6.         <html:form>  
  7.              <!---->  
  8.              <c:out value=”${requestScope.pageBar}”> <!---->  
  9.        <c:out value=”${requestScope.dataGrid}”><!---->  
  10.         html:form>         
  11.     body>  
  12. html>  
使用EL输出的pageBar和dataGrid都是html代码组成的字符窜,下面阐述它是怎么生成的。
  首先在业务逻辑层定义分页逻辑的基本接口:
java 代码
  1.   public interface PaginationService {   
  2.        
  3.     public String  getPageBar(); // 获取导航栏。   
  4.        
  5.     public String  getDataGrid();// 获取分页后的数据集,包含html标签,将直接//传输到JSP页面。   
  6.        
  7.     public void execPagination(); //执行分页   
  8.        
  9.     public void translateParameters(Map parameters); //传递相关参数   
  10.            
  11.        
  12. }   
      表现层将调用该接口,传递参数,执行分页,并将返回的结果传递到相应的JSP页面。
      表现层可以将分页逻辑以及参数的处理放在一个基类中,供具体的分页实例继承,这在先前一篇已作过介绍。
  下面说明排序是如何实现的:
 
  在页面中body标签的onload事件将执行tableSort(“list”),其中的“list”是信息列表的ID.
这个函数会为每个标题栏(除了操作栏)“赋予”保存信息提交页面的功能。
该js函数代码如下:
js 代码
  1. function tableSort(tableId){   
  2.     this.table=document.getElementById(tableId);   
  3.     this.thTags=this.table.getElementsByTagName("th");   
  4.     this.colLen=this.thTags.length;   
  5.     var i=0;   
  6.     var hasOperation=document.getElementById("hasOperation").value;   
  7.     if (hasOperation=="true")i=1;   
  8.     for(;i<this.colLen;i++){   
  9.         this.thTags[i].th=this.thTags;   
  10.         this.thTags[i].οnclick=function(){   
  11.             if (this.className=="desc")   
  12.                 this.className="asc";   
  13.             else if (this.className=="asc")      
  14.                 this.className="desc";   
  15.             else  this.className="asc";      
  16.             var th=this.th;   
  17.             var len=th.length;   
  18.             for (var i=0;i
  19.                 if (th[i]!=this)   
  20.                     th[i].className="none";   
  21.                 else  
  22.                     document.getElementById("orderParam").value=i+";"+this.className;   
  23.             }   
  24.             doQuery();   
  25.         }   
  26.     }   
  27.   
  28. }   

     

        这里面用到了前面所提及的几个隐藏参数。由于根据th的className来判断排序方式,所以需要对样式做设置。在CSS文件中,对html数据表格的th进行样式定义:
      
css 代码
  1. .rowTable th.desc{   
  2.     background:#FFFFCC url("../images/desc.gif"no-repeat left center;   
  3.     color:#333333;   
  4.     cursor:pointer;   
  5. }      
  6. .rowTable th.asc{   
  7.     background:#FFFFCC url("../images/asc.gif"no-repeat left center;   
  8.     color:#333333;   
  9.     cursor:pointer;   
  10. }      

 

        这里面对应了升序排序的小三角的图片,用于点击后变换。由此,用户点击标题栏,提交,在action当中分解参数orderParam的值,获取要排序的情况并获得排序字段,最后统一拼凑sql分页语句。
        拼凑后的sql形如:
sql 代码
  1. Select * FROM (select ROW_NUMBER() Over(order by SOME_COLUM descas rowId,* from V_SOME_VIEW where  1=1) as V_SOME_VIEW where rowId between 1 and 15  

    

    在接口 PaginationService 的实现类中,有专门函数 分析当前的排序指令,输出相应的隐藏参数,以及操作列,数据列等等。
 目前,该分页设计单机测试20万数据左右运行良好,速度较快,后继会对代码再作改进。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值