页面分页好像挺烦的,涉及到分页模型的抽取,在此做个记录,简单的分页实现
页面分页就是在前端分页显示数据库的数据,基本思路就是将分页需要显示的几个要素放到分页模型里面,然后在前端显示
步骤如下:
- 分页取数据的SQL语句
//从2开始,选五个数据,即3,4,5,6,7
select * from student limit 2 , 5
//偏离2,选五个数据,也是3,4,5,6,7
select * from student limit 5 offset 2
- 分页模型的抽取 pageBean
因为上面的sql语句只能在数据库里面获取到固定的信息(比如学生信息,商品信息),我们还需要得到,当前页面、总页面、每页显示条数、总条数,如下所示,简单一点共五项,所以要抽取一个页面模型存放这些数据(然后传到前端去)
pageBean的抽取如下:
package cn.nupt.domain;
import java.util.List;
public class PageBean<T> {
private int currentPage; //当前页
private int totalPage; //总页数
private int pageSize; //每页的记录数
private int totalSize; //总条数
private List<T> list;//当前页的学生集合
}
Servlet实现:
package cn.nupt.pageServlet;
import java.io.IOException;
import java.sql.SQLException;
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 cn.nupt.domain.PageBean;
import cn.nupt.domain.Service;
import cn.nupt.domain.ServiceImpl;
import cn.nupt.domain.Student;
/**
* Servlet implementation class PageServlet
*/
@WebServlet("/PageServlet")
public class PageServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int currentPage = Integer.parseInt(request.getParameter("currentPage"));
Service serviceImpl = new ServiceImpl();
// 调用业务层的功能获取页面模型pageBean
PageBean<Student> pageBean;
try {
pageBean = serviceImpl.findByCurrentPage(currentPage);
// 讲这个页面模型存到request里面传到前端
request.setAttribute("pageBean", pageBean);
request.getRequestDispatcher("/page_list.jsp");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
业务层的实现serviceImpl
package cn.nupt.domain;
import java.sql.SQLException;
import java.util.List;
public class ServiceImpl implements Service {
@Override
public PageBean<Student> findByCurrentPage(int currentPage) throws SQLException {
PageBean<Student> pageBean = new PageBean<Student>();
Dao daoImpl = new DaoImpl();
// 已知当前页,获取这个页面的信息集合
List<Student> list = daoImpl.getStudentList(currentPage);
// 获取总条数:totalSize;
int totalSize = daoImpl.getTotalSize();
int page_size = Dao.PAGE_SIZE;
// 一共多少页
int count = totalSize % page_size;
int totalPage = ((count == 0) ? count : count + 1);
pageBean.setList(list);
pageBean.setTotalSize(totalSize);
// 每页的记录数就直接在Dao接口里面设置了
pageBean.setPageSize(page_size);
// 第几页,也直接输入
pageBean.setCurrentPage(currentPage);
pageBean.setTotalPage(totalPage);
return pageBean;
}
}
Dao层的实现(主要是的到每页信息和总条数):
package cn.nupt.domain;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DaoImpl implements Dao {
@Override
public List<Student> getStudentList(int currentPage) throws SQLException {
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
String sql = "select * from student limit ? ,? ";
// 第一个问号是当前页(前端传过来的),第二个问号是,每页显示条数(自己设置的)
List<Student> list = queryRunner.query(sql, new BeanListHandler<Student>(Student.class), (currentPage-1)*Dao.PAGE_SIZE,
Dao.PAGE_SIZE);
return list;
}
@Override
public int getTotalSize() throws SQLException {
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
String sql = "select count(*) from student";
Long TotaSize = (Long) queryRunner.query(sql, new ScalarHandler());
int TotalSize = TotaSize.intValue();
return TotalSize;
}
}
最后的页面端显示就可以定制了,拿到request里面的信息用JSTL表达式在jsp里面显示就行了,如前面的图所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'page_list.jsp' starting page</title>
</head>
<body>
第 ${pageBean.currentPage}/ ${pageBean. totalPage}
每页显示${pageBean.pageSize}
总记录数${ pageBean.totalSize}
<c:if test="${pageBean. currentPage != 1}">
<a href="PageServlet?currentPage=1">首页</a> | <a href="PageServlet?currentPage=${pageBean.currentPage -1}">上一页</a>
</c:if>
<c:forEach begin="1" end="${pageBean.totalPage}" var="i">
<!-- 如果是当前页面,直接输出,不加超链接 -->
<c:if test="${pageBean.currentPage == i}">
${i}
</c:if>
<!-- 如果不是当前页面,加超链接 -->
<c:if test="${pageBean.currentPage!= i}">
<a href="PageServlet?currentPage=${i}"> ${i} </a>
</c:if>
</c:forEach>
<c:if test="${pageBean. currentPage != pageBean.totalPage }">
<a href="PageServlet?currentPage=${pageBean.currentPage+1}">下一页</a> | <a href="PageServlet?currentPage=${pageBean. totalPage}">尾页</a>
</c:if>
</body>
</html>