MVC模式实现分页案例(java)

匿名 (未验证) 提交于 2019-12-02 21:52:03

必须掌握分页案例

Ŀ¼

必须掌握分页案例

1.分页概述

2.分页实现思路

3.分页步骤

4.分页代码实现

4.1 创建工程,并导入相关jar包

4.2数据库配置文件druid.properties

4.3创建工具类和实体类

4.4Dao层接口和实现类

4.5Service层接口和实现类

4.6web层代码

4.7JSP代码


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>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!