Servlet简单分页管理技术

在实际开发一定避免不了使用分页,现在我们就来讲一个比较简单的分页处理。

首先我们定义四个分页变量:

pageNow     表示当前第几页,该变量是由用户来决定的。

pageSize     每页显示几条记录,由程序指定,也可以由用户定制。

pageCount     表示一共有多少页,该变量是通过计算出来的。

rowCount       一共有多少条记录,该变量是查询数据库得到的。

首先,我们得确定pageCount的大小:

1
2
3
4
5
if(rowCount%pageSize==0){
  pageCount = rowCount/pageSize;
}else{
  pageCount = rowCount/pageSize+1;
}

 

上面的算法等价于

1
pageCount=rowCount% pageSize==0 ?rowCount/pageSize: rowCount/pageSize+1;

(三目运算)

更简单的算法是:

1
pageCount=(rowCount-1)/pageSize+1;

 

如下是分页的主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Connection ct = null;
ResultSet rs = null;
PreparedStatement ps = null;

//定义分页需要的变量

int pageNow = 1;//当前页

String sPageNow = request.getParameter("pageNow");     //接受用户传递过来的pageNow
if(sPageNow != null){
  pageNow = Integer.parseInt(sPageNow);        
}

int pageSize = 3;//指定每页显示3条记录
int pageCount = 1;//该值是计算出来的
int rowCount = 1;//共有多少记录,数据库查询得到的

try{
   //1加载驱动
   Class.forName("oracle.jdbc.driver.OracleDriver");
   //2.得到连接
   ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCLLPQ","scott","tiger");
   //3.查询rowCount
   ps = ct.prepareStatement("select count(*) from users");
   rs = ps.executeQuery();
   rs.next();
   rowCount = rs.getInt(1);
   pageCount=rowCount% pageSize==0 ?rowCount/pageSize: rowCount/pageSize+1;
   //4.创建PreparedSatement
   ps = ct.prepareStatement("select top "+pageSize+"  * from users where userId not in " +
        "(select top "+ pageSize*(pageNow-1)+" userId from users)");
   rs = ps.executeQuery();
   //5.显示数据
   ........
   //6.显示页码
   //上一页
    if(pageNow !=1)
    out.println("<a href=welcom?pageNow="+(pageNow-1)+" >上一页</a>");
   
    //显示超链接
    for(int j = pageNow;j<=pageNow+pageSize-1; j ++)
    {
      out.println("<a href=welcom?pageNow="+j+" > <"+j+"> </a>");
    }
   
    //下一页
    if(pageNow != pageCount)
    out.println("<a href=welcom?pageNow="+(pageNow+1)+" >下一页</a><br><br>");
}

 

上面只写了主要的代码,数据展示代码,还有关闭数据库连接的代码都没写,大家在实际编写中注意加上!

当然,我们实际开发中的分页查询和展示代码不会写在一起,我们通常把查询总页面和某一页具体数据的代码封装到相应的Dao里面,不要把业务逻辑和界面的代码混在一起。

不同的数据库,在做分页查询的时候sql是不一样的。
MySql数据库:
【SELECT 字段名列表 FROM 表名 LIMIT pageSize*(pageNow-1),pageSize】
SQLServer数据库:
【select top pageSize * from users where id not in
(select top pageSize*(pageNow-1) id from 表名)】

如果测试时,出现显示不正确的情况,可以把pageNow,sql 语句相关的信息打印出来就能发现问题了。

除非注明,Coder文章均为原创,转载请以链接形式标明本文地址

本文地址:http://www.alonemonkey.com/servlet-by-page.html

本文链接:http://www.alonemonkey.com/servlet-by-page.html