必须掌握分页案例
Ŀ¼
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
#
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 { private int pageNum; private int pageSize; private long totalCount; private int pageCount; private List data; }
注意:此处泛型类,能使其存放不同表格中的数据
4.4Dao层接口和实现类
Dao接口
接口中有三个功能,按照分页查找数据,获取数据库记录条数,添加数据 public interface StudentDao { List 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 findByPage(int pageNum, int pageSize) { String sql = "select * from student order by id limit ?,?;"; try { return qr.query(sql,new BeanListHandler(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 findByPage(int pageNum, int pageSize); void addStu(Student stu); }
Service实现类 public class StudentServiceImpl implements StudentService { StudentDao studentDao = new StudentDaoImpl(); @Override public PageBean findByPage(int pageNum, int pageSize) { List pagedata = studentDao.findByPage(pageNum, pageSize); long pageCount = studentDao.getCount(); PageBean 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("
该页面不存在
"); } } //创建业务层对象 StudentService studentService = new StudentServiceImpl(); PageBean 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.导入标签库
2.利用form表单将请求参数提交给服务器
3.获取服务器放在域中的数据,用EL表达式接收
4.实现首页,上一页,下一页,尾页,页码跳转,利用超链接再次向服务发送请求,并将参数放在请求地址的后边
分页学生列表分页学生列表
学号 | 姓名 | 年龄 | 地址 | 成绩 |
---|---|---|---|---|
${stu.id} | ${stu.name} | ${stu.age} | ${stu.address} | ${stu.score} |