必须掌握分页案例
Ŀ¼
1.分页概述
分页是web应用程序非常重要的一个技术。数据库中的数据可能是成千上万的,不可能把这么多的数据一次显示在浏览器上面。一般根据每行数据在页面上所占的空间每页显示若干行,比如一般20行是一个比较理想的显示状态。
2.分页实现思路
分页的思路
对于海量的数据查询,需要多少就取多少,显然是最佳的解决方法,假如某个表中有200万条记录,第一页取前20条,第二页取21~40条记录。
select * from 表名 order by id limit 0,20 ;
select * from 表名 order by id limit 20,20;
select * from 表名 order by id limit 40,20;
3.分页步骤
步骤:
1.确定每页显示的数据数量
2.确定分页显示所需的总页数
3.编写SQL查询语句,实现数据查询
4.在JSP页面中进行分页显示设置
4.分页代码实现
4.1 创建工程,并导入相关jar包
利用MVC模式将项目分成web、service、dao、domain四部分代码,以及对数据库操作需要设计的工具类utils
相关jar包,jar包一定要放在web/WEB-INF/lib目录下(lib是自己创建的文件夹,放错导致项目出错,找不到资源)
4.2数据库配置文件druid.properties
因为该项目使用阿里的连接池,所以对应阿里的配置文件
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myschool?useSSL=true&characterEncoding=utf8
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000
4.3创建工具类和实体类
- 连接池工具类,用来连接数据库,对数据库进行相应操作,一般将公用代码封装成工具类,以便重用
DataSourceUtils 类
public class DataSourceUtils { private static DruidDataSource dataSource; static { try { //加载配置文件 Properties prop = new Properties(); InputStream is = DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties"); prop.load(is); is.close(); //创建连接池 dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(prop); } catch (Exception e) { e.printStackTrace(); } } //获取连接的静态方法 public static DataSource getDataSource(){ return dataSource; } }
IsEmptyUtils 类 判断是否为空 判断从客户端接收的参数
public class IsEmptyUtils { public static boolean isEmpty(String str){ if(str==null||str.trim().length()==0){ return true; } return false; } }
1.一般将数据库表格封装成对应的实体类,接收从数据库查询的数据,或者从表单接收的参数保存在实体类中,方便放入数据库
2.在程序处理过程中,用到的属性较多,并且将这些属性发送给jsp,封装成实体类简化操作
实体类 包含以下四部分:
1.属性与数据库列名对应
2.添加有参、无参构造方法
3.添加setter和getter方法
4.添加toString方法
本项目用到的实体类:
public class Student { private Integer id; private String name; private Integer age; private String address; private Double score; }
PageBean类
public class PageBean<T> { private int pageNum; private int pageSize; private long totalCount; private int pageCount; private List<T> data; }
注意:此处泛型类,能使其存放不同表格中的数据
4.4Dao层接口和实现类
Dao接口
接口中有三个功能,按照分页查找数据,获取数据库记录条数,添加数据
public interface StudentDao { List<Student> findByPage(int pageNum,int pageSize); long getCount(); void addStudent(Student stu); }
Dao实现类
public class StudentDaoImpl implements StudentDao { QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource()); @Override public List<Student> findByPage(int pageNum, int pageSize) { String sql = "select * from student order by id limit ?,?;"; try { return qr.query(sql,new BeanListHandler<Student>(Student.class),(pageNum-1)*pageSize,pageSize); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("分页查询失败",e); } } @Override public long getCount() { String sql = "select count(*) from student;"; try { return qr.query(sql,new ScalarHandler<>()); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("查询数据总数失败",e); } } @Override public void addStudent(Student stu) { String sql = "insert into student(name,age,address,score) values(?,?,?,?);"; Object[] params = {stu.getName(),stu.getAge(),stu.getAddress(),stu.getScore()}; try { qr.update(sql,params); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("添加失败!",e); } } }
4.5Service层接口和实现类
Service接口,按照分页返回数据
public interface StudentService { PageBean<Student> findByPage(int pageNum, int pageSize); void addStu(Student stu); }
Service实现类
public class StudentServiceImpl implements StudentService { StudentDao studentDao = new StudentDaoImpl(); @Override public PageBean<Student> findByPage(int pageNum, int pageSize) { List<Student> pagedata = studentDao.findByPage(pageNum, pageSize); long pageCount = studentDao.getCount(); PageBean<Student> pageBean = new PageBean<>(pageNum,pageSize,pageCount,pagedata); return pageBean; } @Override public void addStu(Student stu) { studentDao.addStudent(stu); } }
4.6web层代码
1.获取浏览器传来的参数
2.判断参数是否符合规定,不符合则使用默认值,符合使用传来的值
3.创建业务层对象,获取分页实体类
4.将分页实体类放入域中,发送给页面
@WebServlet(name = "FindPageServlet",value = "/findpage") public class FindPageServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset-8"); //获取浏览器传来的参数 String pageNum = request.getParameter("pageNum"); String pageSize = request.getParameter("pageSize"); //获取页码 String jsppagenum = request.getParameter("pagenum"); int pn=1; int ps=5; //利用工具类判断是否为空 if(!IsEmptyUtils.isEmpty(pageNum)){ pn=Integer.parseInt(pageNum); if(pn<1){ pn=1; } } //利用工具类判断是否为空 if(!IsEmptyUtils.isEmpty(pageSize)){ ps=Integer.parseInt(pageSize); if(ps<1){ ps=5; } } if(!IsEmptyUtils.isEmpty(jsppagenum)){ pn=Integer.parseInt(jsppagenum); if(pn<1){ response.getWriter().write("<h3>该页面不存在</h3>"); } } //创建业务层对象 StudentService studentService = new StudentServiceImpl(); PageBean<Student> pageBean = studentService.findByPage(pn, ps); request.setAttribute("pageBean",pageBean); request.getRequestDispatcher("/listpage.jsp").forward(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
4.7JSP代码
1.导入标签库<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.利用form表单将请求参数提交给服务器
3.获取服务器放在域中的数据,用EL表达式接收
4.实现首页,上一页,下一页,尾页,页码跳转,利用超链接再次向服务发送请求,并将参数放在请求地址的后边
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>分页学生列表</title> </head> <body> <H1 align="center">分页学生列表</H1> <form action="${pageContext.request.contextPath}/findpage?pageSize=${pageBean.pageSize}" method="post"> <table align="center" style="width: 800px;height: 500px; text-align: center"> <tr> <th>学号</th> <th>姓名</th> <th>年龄</th> <th>地址</th> <th>成绩</th> </tr> <c:forEach var="stu" items="${pageBean.data}"> <tr> <td>${stu.id}</td> <td>${stu.name}</td> <td>${stu.age}</td> <td>${stu.address}</td> <td>${stu.score}</td> </tr> </c:forEach> </table> <p align="center"> <a href="${pageContext.request.contextPath}/findpage?pageNum=1&pageSize=${pageBean.pageSize}">首页</a> <a href="${pageContext.request.contextPath}/findpage?pageNum=${pageBean.pageNum-1}&pageSize=${pageBean.pageSize}">上一页</a> <a href="${pageContext.request.contextPath}/findpage?pageNum=${pageBean.pageNum>=pageBean.pageCount?pageBean.pageCount:pageBean.pageNum+1}&pageSize=${pageBean.pageSize}">下一页</a> <a href="${pageContext.request.contextPath}/findpage?pageNum=${pageBean.pageCount}&pageSize=${pageBean.pageSize}">尾页</a> 页码:<input type="text" name="pagenum"/> <input type="submit" value="跳转"/> <input type="submit" name="page" value="2" style="width: 30px;height: 30px; background-color: gray;border: 1px saddlebrown solid;"> </p> </form> </body> </html>
来源:51CTO
作者:头发又少了
链接:https://blog.csdn.net/SjwFdb_1__1/article/details/100589748