分页其实随处可见,例如说最常用的百度搜索后的结果显示,亦或者说论坛中的显示帖子列表。分页实现的方式有很多种,在这一章里主要讲的是用SQL语句结合Servlet来实现分页效果。
目录
分页
作用
分页的作用其实很简单,就是将数据分割成多个页面来进行显示。若数据量过于庞大,在一个页面内全部显示,第一会影响到用户的体验,第二会加重服务器的承载负担。
组成
每一个页面中需要包含哪一些才能实现分页的效果呢?在这里列出需要的数据:
'''
1.要显示的数据结果集:beanList,通过查询数据库得来。
2.当前页:currentPage,通过页面传递到后台,默认第一页
3.总页数:totalPage,通过后台计算得来
4.总记录数:totalRecord,通过查询数据库得来
5.每页记录数:pageSize,即每一页显示的记录条数
6.请求参数:url
'''
通过上面列举的发现,其实只有两个数据是从数据库中获取,其余的都是通过计算而来。那么需要计算的数据所用到的公式如下:
总页数:
totalPage = 总条数 % 每页记录数 == 0? 总条数/每页记录数 : 总条数/每页记录数+1
例子
配置
这里以学生信息为例,页面从简,只分了五个:index.jsp、welcome.jsp、top.jsp、list.jsp、query.jsp。
需要导入的包如下所示:
首先在MYSQL创建一个名为school的数据库,数据库内再新建一个学生表tb_student,SQL语句如下所示:
CREATE DATABASE IF NOT EXISTS school;
use school;
CREATE TABLE tb_student (
sid char(32) PRIMARY KEY,
sname varchar(30) NOT NULL,
gender varchar(6) NOT NULL,
age int(11) NOT NULL,
cellphone varchar(15) NOT NULL,
email varchar(40) NOT NULL
);
接着配置项目中各层的基本分工,如下所示:
其中,domain层表示相关的业务数据类,dao层表示对数据库的操作,service层则是业务逻辑层,servlet层则为处理请求的地方。
分别在domain、dao、service、servlet层创建相关的类文件,如下所示:
domain:
public class Student {
private String sid;
private String sname;
private String gender;
private int age;
private String cellphone;
private String email;
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCellphone() {
return cellphone;
}
public void setCellphone(String cellphone) {
this.cellphone = cellphone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
dao:
public class StudentDao {
private QueryRunner qr = new ExQueryRunner();
}
service:
public class StudentService {
private StudentDao studentDao = new StudentDao();
}
servlet:
在早期中一篇文章中曾经提及过一个BaseServlet,即能够处理多个请求方法的一个Servlet(链接:)。在这里就得令StudentServlet继承这个BaseServlet。因此,StudentServlet代码如下所示:
public class StudentServlet extends BaseServlet {
private StudentService studentService = new StudentService();
}
在这里要用到先前写到的几个小工具,分别如下所示:
CommonUtils:
public class CommonUtils {
public static String uuid() {
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
}
public static <T> T toBean(Map map, Class<T> clazz) {
try {
/*
* 1. 通过参数clazz创建实例
* 2. 使用BeanUtils.populate把map的数据封闭到bean中
*/
T bean = clazz.newInstance();
ConvertUtils.register(new DateConverter(), java.util.Date.class);
BeanUtils.populate(bean