之前有过一篇关于分页的介绍,该篇在前篇基础上作了整理和扩展。主要改变在于:将代码分层,使逻辑更加清晰;增加了点击字段标题自动排序的功能;分页SQL改成了SQLSERVER2005专有的语句。
效果图如下:
![](/upload/picture/pic/6098/7fe34395-7008-44ed-aa63-d5a465c3a317.jpg%20)
如图,矩形部分可以认为是“form”标签的覆盖范围。每一次点击查询按钮、分页导航链接、标题栏或者“跳转”按钮的时候,都会引起三部分数据的提交(椭圆形勾勒处):
1. 各个查询参数。它们最终会被传递到DAO层用来拼凑分页SQL语句的where部分。
2. 当前页码信息。
3. 其他隐藏信息。包含了:
1)当前是否有“操作”列?这里用ID为“hasOperation”的hidden input来存放信息。设置这个参数用于决定:当点击第一列标题的时候,是否会引起页面的提交。
2)如果被点击了字段标题,是哪个字段按照何种方式排序?这里用ID为“orderParam”的hidden input来存放信息。格式为“要排序的列序号:排序方式”,比如按照第一列升序排列可以记为“1:asc” 。
表现层(JSP页面)的结构大致如下:
xml 代码
- <html>
- <head>
- …
- head>
- <body onload=”tableSort(‘list’)”> <!---->
- <html:form>
- <!---->
- <c:out value=”${requestScope.pageBar}”> <!---->
- <c:out value=”${requestScope.dataGrid}”><!---->
- html:form>
- body>
- html>
使用EL输出的pageBar和dataGrid都是html代码组成的字符窜,下面阐述它是怎么生成的。
首先在业务逻辑层定义分页逻辑的基本接口:
java 代码
- public interface PaginationService {
- public String getPageBar(); // 获取导航栏。
- public String getDataGrid();// 获取分页后的数据集,包含html标签,将直接//传输到JSP页面。
- public void execPagination(); //执行分页
- public void translateParameters(Map parameters); //传递相关参数
- }
表现层将调用该接口,传递参数,执行分页,并将返回的结果传递到相应的JSP页面。
表现层可以将分页逻辑以及参数的处理放在一个基类中,供具体的分页实例继承,这在先前一篇已作过介绍。
下面说明排序是如何实现的:
在页面中body标签的onload事件将执行tableSort(“list”),其中的“list”是信息列表的ID.
这个函数会为每个标题栏(除了操作栏)“赋予”保存信息提交页面的功能。
该js函数代码如下:
js 代码
- function tableSort(tableId){
- this.table=document.getElementById(tableId);
- this.thTags=this.table.getElementsByTagName("th");
- this.colLen=this.thTags.length;
- var i=0;
- var hasOperation=document.getElementById("hasOperation").value;
- if (hasOperation=="true")i=1;
- for(;i<this.colLen;i++){
- this.thTags[i].th=this.thTags;
- this.thTags[i].οnclick=function(){
- if (this.className=="desc")
- this.className="asc";
- else if (this.className=="asc")
- this.className="desc";
- else this.className="asc";
- var th=this.th;
- var len=th.length;
- for (var i=0;i
- if (th[i]!=this)
- th[i].className="none";
- else
- document.getElementById("orderParam").value=i+";"+this.className;
- }
- doQuery();
- }
- }
- }
这里面用到了前面所提及的几个隐藏参数。由于根据th的className来判断排序方式,所以需要对样式做设置。在CSS文件中,对html数据表格的th进行样式定义:
css 代码
- .rowTable th.desc{
- background:#FFFFCC url("../images/desc.gif") no-repeat left center;
- color:#333333;
- cursor:pointer;
- }
- .rowTable th.asc{
- background:#FFFFCC url("../images/asc.gif") no-repeat left center;
- color:#333333;
- cursor:pointer;
- }
这里面对应了升序排序的小三角的图片,用于点击后变换。由此,用户点击标题栏,提交,在action当中分解参数orderParam的值,获取要排序的情况并获得排序字段,最后统一拼凑sql分页语句。
拼凑后的sql形如:
sql 代码
- Select * FROM (select ROW_NUMBER() Over(order by SOME_COLUM desc) as rowId,* from V_SOME_VIEW where 1=1) as V_SOME_VIEW where rowId between 1 and 15
在接口
PaginationService
的实现类中,有专门函数
分析当前的排序指令,输出相应的隐藏参数,以及操作列,数据列等等。
目前,该分页设计单机测试20万数据左右运行良好,速度较快,后继会对代码再作改进。