在实际项目中,经常要用到很多分页技术,特别是数据量比较大的时候,为了直观便捷的展示出数据,而不是在一个页面上把所有数据全部展现出来(会显得很冗余,页面繁重,并且不好看),所以用分页技术比较好。
我们可以利用mysql数据库里面的limit来限制显示的数据,从而达到分页。同样也可以用oracle里面的rownum来限制,也可以用到mybatis中自带的RowBounds分页技术
本文的页面是使用jsp页面(没有过多考虑页面,注重分页的实现),没有使用框架,使用了Java开发中的三层架构(web,service,dao),并且使用JDBC技术来处理数据库,从而达到分页的效果
首先需要的是两个bean类 一个Student类 用来封装Student对象 一个page类 里面包含了页面中的一些属性(比如 当前页码 每页的大小等等)
Student.java
package page.bean;
import java.io.Serializable;
/**
* 普通的学生bean类
* @author liujd
*
*/
public class Student implements Serializable{
private static final long serialVersionUID = 6724577147867445725L;
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
Page.java
package page.bean;
import java.io.Serializable;
/**
* 首先定义一个分页的bean类
* 用来存储和分页有关的属性
* @author liujd
*
*/
public class Page implements Serializable{
private static final long serialVersionUID = 2024980639990498085L;
//当前页 就是当前是在第多少页
private Integer pageNow;
//需要分页的数据总数
private Integer total;
//每页多少条数据
private Integer pageSize;
//一共有多少页
private Integer pageTotal;
//每页数据开始条数
private Integer pageBegin;
//每页数据结束条数
private Integer pageEnd;
public Integer getPageNow() {
return pageNow;
}
public void setPageNow(Integer pageNow,Integer total, Integer pageSize) {
this.total = total;
this.pageSize = pageSize;
this.pageNow = pageNow;
this.pageTotal = total % pageSize == 0 ? total/pageSize : total/pageSize +1;
this.pageBegin = (pageNow-1) * pageSize;
this.pageEnd = pageNow * pageSize;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageTotal() {
return pageTotal;
}
public void setPageTotal(Integer pageTotal) {
this.pageTotal = pageTotal;
}
public Integer getPageBegin() {
return pageBegin;
}
public void setPageBegin(Integer pageBegin) {
this.pageBegin = pageBegin;
}
public Integer getPageEnd() {
return pageEnd;
}
public void setPageEnd(Integer pageEnd) {
this.pageEnd = pageEnd;
}
}
然后是一个Servlet 用来接收前台页面中的关于页面的信息 并且返回查询到的学生列表以及处理后的有关Page的信息
StudentServlet.java
package page.web;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import page.bean.Page;
import page.bean.Student;
import page.service.StudentService;
@WebServlet("/listStudent")
public class StudentServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
StudentService service = new StudentService();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String pageNowString = request.getParameter("pageNow");
String pageSizeString = request.getParameter("pageSize");
int pageNow = Integer.parseInt(pageNowString);
int total = service.getStudentCount();
int pageSize = Integer.parseInt(pageSizeString);
Page page = new Page();
page.setPageNow(pageNow, total, pageSize);
List<Student> list = service.getStudentList(page);
request.setAttribute("list", list);
request.setAttribute("pageNow", page.getPageNow());
request.setAttribute("total", total);
request.getRequestDispatcher("studentList.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
service层用来调用dao层的方法
package page.service;
import java.util.List;
import page.bean.Page;
import page.bean.Student;
import page.dao.StudentDao;
/**
* service层方法
* @author liujd
*
*/
public class StudentService {
//获取Dao层对象
StudentDao dao = new StudentDao();
/**
* 获取学生列表
* @param page
* @return
*/
public List<Student> getStudentList(Page page) {
return dao.getStudentList(page);
}
/**
* 获取学生总数
* @return
*/
public int getStudentCount() {
return dao.getStudentCount();
}
}
最后是与数据库进行交互的dao层 使用的是JDBC技术
特别要注意的是里头limit的用法
limit m,n 其中m表示偏移量 就是从哪条信息开始查 n表示从偏移量开始要查多少条
有关limit的使用详情请见http://blog.youkuaiyun.com/liujiding/article/details/74939944
StudentDao.java
package page.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import page.bean.Page;
import page.bean.Student;
/**
* dao层方法
* @author liujd
*
*/
public class StudentDao {
/**
* 从数据库里面来获取学生列表
* @param page
* @return
*/
public List<Student> getStudentList(Page page) {
PreparedStatement statement = null;
Connection connection = null;
List<Student> list = null;
try {
connection = getConnection();
//获取preparedStatement对象
statement =
connection.prepareStatement("select * from student limit ?,?");
//设置值
statement.setInt(1, page.getPageBegin());
//这里第二个参数设置为pageSize的原因:
//mysql中limit的用法 第一个参数是偏移量 也就是从哪个位置开始查询 第二个参数不是结束位置 而是从偏移量开始要查询的长度
statement.setInt(2, page.getPageSize());
//得到结果集
ResultSet result =
statement.executeQuery();
//声明一个Student对象 以及 一个List集合 用来封装结果
list = new ArrayList<Student>();
//遍历结果集 并且封装成Student对象 添加到List集合中
while(result.next()){
Student student = new Student();
student.setId(result.getInt(1));
student.setName(result.getString(2));
student.setAge(result.getInt(3));
list.add(student);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
return null;
}finally{
//记得关流!!!
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取学生总数
* @return
*/
public int getStudentCount(){
Connection connection = getConnection();
try {
PreparedStatement statement = connection.prepareStatement("select count(1) from student");
ResultSet resultSet = statement.executeQuery();
int result = 0;
while(resultSet.next()) {
result = resultSet.getInt(1);
}
return result;
} catch (SQLException e) {
e.printStackTrace();
return 0;
}
}
/**
* 建立数据库连接并且获取数据
* @return
*/
private Connection getConnection() {
//1.加载驱动 这里用的mysql
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "liujd", "1234");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
return null;
}
}
}
studentList.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>student——list</title>
<script type="text/javascript">
/* window.onload = function(){
var pageSize = document.getElementById("pageSize").value;
location.href="listStudent?pageNow=1&pageSize="+pageSize;
} */
function changePage(){
var change = document.getElementById("changePage").value;
var pageSize = document.getElementById("pageSize").value;
if(change <1){
change = 1;
alert("不能调到小于1页");
}
var total = document.getElementById("total").innerHTML;
var pageSize = document.getElementById("pageSize").value;
var total = Number(total);
var pageSize = Number(pageSize);
var result = total%pageSize == 0 ? (total/pageSize) : (Math.floor(total/pageSize)+1);
if(change > result) {
change = result;
alert("不能调到大于最后一页");
}
location="listStudent?pageNow="+change+"&pageSize="+pageSize;
}
function getForword() {
var pageNow = document.getElementById("pageNow").innerHTML;
var pageForword = Number(pageNow)-1;
if(pageForword <1){
pageForword = 1;
alert("当前页是最前页");
}
console.log(pageForword);
var pageSize = document.getElementById("pageSize").value;
location="listStudent?pageNow="+pageForword+"&pageSize="+pageSize;
}
function getNext() {
var pageNow = document.getElementById("pageNow").innerHTML;
var total = document.getElementById("total").innerHTML;
var pageSize = document.getElementById("pageSize").value;
var pageNext = Number(pageNow)+1;
var total = Number(total);
var pageSize = Number(pageSize);
console.log(total);
console.log(pageSize);
var result = total%pageSize == 0 ? (total/pageSize) : (Math.floor(total/pageSize)+1);
if(pageNext > result) {
pageNext = result;
alert("当前页是最后一页");
}
location="listStudent?pageNow="+pageNext+"&pageSize="+pageSize;
}
</script>
</head>
<body>
<center>
<h3>学生列表</h3>
<table align="center" bgcolor="gray" border="1" bordercolor="#666699" cellspacing="0">
<tr height="30" align="center">
<td width="100" >id</td>
<td width="100" >姓名</td>
<td width="100" >年龄</td>
</tr>
<c:forEach items="${list}" var="stu">
<tr height="30" align="center">
<td width="100" background="red">${stu.id}</td>
<td width="100" >${stu.name}</td>
<td width="100" >${stu.age}</td>
</tr>
</c:forEach>
</table>
<span><input type="text" value="1" style="width: 15px" id="changePage" />页
<button onclick="changePage()">跳转</button>
</span>
<button onclick="getForword()"><<</button>
第<span id="pageNow">${pageNow}</span>页
<button onclick="getNext()" >>></button>
共<span id="total">${total}</span>条
<span>
<select id="pageSize">
<option selected="selected" value="5">5</option>
<option value="10">10</option>
<option value="15">15</option>
</select>
条/页</span>
</center>
</body>
</html>
运行效果如下