分页技术实现分析

摘要:
分页关键点:分页SQL语句;后台处理:dao/service/servlet/JSP实现步骤:环境准备a)引入jar文件及引入配置文件i.数据库驱动包ii.C3P0连接池jar文件及配置文件iii.DbUtis组件:QueryRunnerqr=newQueryRuner;qr.update;b)公用类:JdbcUtils.java先设计:PageBean.javaDao接口设计/实现:2个方法Service/servletJSP示例核心代码:packagecom.loaderman.demo.entity;/***1.实体类设计**/publicclassEmployee{privateintempId;//员工idprivateStringempName;//员工名称privateintdept_id;//部门idpublicintgetEmpId(){returnempId;}publicvoidsetEmpId{this.empId=empId;}publicStringgetEmpName(){returnempName;}publicvoidsetEmpName{this.empName=empName;}publicintgetDept_id(){returndept_id;}publicvoidsetDept_id{dept_id=deptId;}}packagecom.loaderman.demo.dao.impl;importjava.util.List;importcom.loaderman.demo.dao.IEmployeeDao;importcom.loaderman.demo.entity.Employee;importcom.loaderman.demo.utils.JdbcUtils;importcom.loaderman.demo.utils.PageBean;importorg.apache.commons.dbutils.QueryRunner;importorg.apache.commons.dbutils.handlers.BeanListHandler;importorg.apache.commons.dbutils.handlers.ScalarHandler;/***2.数据访问层实现*@authorJie.Yuan**/publicclassEmployeeDaoimplementsIEmployeeDao{@OverridepublicvoidgetAll{//2.查询总记录数;设置到pb对象中inttotalCount=this.getTotalCount();pb.setTotalCount;/**问题:jsp页面,如果当前页为首页,再点击上一页报错!

分页技术:

JSP页面,用来显示数据! 如果数据有1000条,分页显示,每页显示10条,共100页; 好处: 利于页面布局,且显示的效率高!


分页关键点:

  1. 分页SQL语句;
  2. 后台处理: dao/service/servlet/JSP

实现步骤:

  1. 环境准备

a) 引入jar文件及引入配置文件

i. 数据库驱动包

ii. C3P0连接池jar文件 及 配置文件

iii. DbUtis组件: QueryRunner qr = new QueryRuner(dataSouce); qr.update(sql);

b)公用类: JdbcUtils.java

  1. 先设计:PageBean.java
  2. Dao接口设计/实现: 2个方法
  3. Service/servlet
  4. JSP

示例核心代码:

package com.loaderman.demo.entity;
/**
 * 1. 实体类设计 (因为用了DbUtils组件,属性要与数据库中字段一致)
 *
 */
public class Employee {
    private int empId;            //员工id
    private String empName;        //员工名称
    private int dept_id;        //部门id

    public intgetEmpId() {
        returnempId;
    }
    public void setEmpId(intempId) {
        this.empId =empId;
    }
    public String getEmpName() {
        returnempName;
    }
    public voidsetEmpName(String empName) {
        this.empName =empName;
    }
    public intgetDept_id() {
        returndept_id;
    }
    public void setDept_id(intdeptId) {
        dept_id =deptId;
    }
}
package com.loaderman.demo.dao.impl;
import java.util.List;
import com.loaderman.demo.dao.IEmployeeDao;
import com.loaderman.demo.entity.Employee;
import com.loaderman.demo.utils.JdbcUtils;
import com.loaderman.demo.utils.PageBean;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
/**
 * 2. 数据访问层实现
 * @author Jie.Yuan
 *
 */
public class EmployeeDao implements IEmployeeDao {
    @Override
    public void getAll(PageBean<Employee>pb) {
        //2. 查询总记录数;  设置到pb对象中
        int totalCount = this.getTotalCount();
        pb.setTotalCount(totalCount);
        /*
         * 问题: jsp页面,如果当前页为首页,再点击上一页报错!
         *              如果当前页为末页,再点下一页显示有问题!
         * 解决:
         *        1. 如果当前页 <= 0;       当前页设置当前页为1;
         *        2. 如果当前页 > 最大页数;  当前页设置为最大页数
         */
        //判断
        if (pb.getCurrentPage() <=0) {
            pb.setCurrentPage(1);                        //把当前页设置为1
        } else if (pb.getCurrentPage() >pb.getTotalPage()){
            pb.setCurrentPage(pb.getTotalPage());        //把当前页设置为最大页数
}
        //1. 获取当前页: 计算查询的起始行、返回的行数
        int currentPage =pb.getCurrentPage();
        int index = (currentPage -1 ) * pb.getPageCount();        //查询的起始行
        int count = pb.getPageCount();                            //查询返回的行数
        //3. 分页查询数据;  把查询到的数据设置到pb对象中
        String sql = "select * from employee limit ?,?";
        try{
            //得到Queryrunner对象
            QueryRunner qr =JdbcUtils.getQueryRuner();
            //根据当前页,查询当前页数据(一页数据)
            List<Employee> pageData = qr.query(sql, new BeanListHandler<Employee>(Employee.class), index, count);
            //设置到pb对象中
pb.setPageData(pageData);
        } catch(Exception e) {
            throw newRuntimeException(e);
        }
    }
    @Override
    public intgetTotalCount() {
        String sql = "select count(*) from employee";
        try{
            //创建QueryRunner对象
            QueryRunner qr =JdbcUtils.getQueryRuner();
            //执行查询, 返回结果的第一行的第一列
            Long count = qr.query(sql, new ScalarHandler<Long>());
            returncount.intValue();
        } catch(Exception e) {
            throw newRuntimeException(e);
        }
    }
}
package com.loaderman.demo.service.impl;
import com.loaderman.demo.dao.IEmployeeDao;
import com.loaderman.demo.dao.impl.EmployeeDao;
import com.loaderman.demo.entity.Employee;
import com.loaderman.demo.service.IEmployeeService;
import com.loaderman.demo.utils.PageBean;
/**
 * 3. 业务逻辑层,实现
 * @author Jie.Yuan
 *
 */
public class EmployeeService implements IEmployeeService {
    //创建Dao实例
    private IEmployeeDao employeeDao = newEmployeeDao();
    @Override
    public void getAll(PageBean<Employee>pb) {
        try{
            employeeDao.getAll(pb);
        } catch(Exception e) {
            throw newRuntimeException(e);
        }
    }
}
packagecom.loaderman.demo.servlet;
importcom.loaderman.demo.entity.Employee;
importcom.loaderman.demo.service.IEmployeeService;
importcom.loaderman.demo.service.impl.EmployeeService;
importcom.loaderman.demo.utils.PageBean;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
 * 4. 控制层开发
 * @authorJie.Yuan
 *
 */
public class IndexServlet extendsHttpServlet {
    //创建Service实例
    private IEmployeeService employeeService = newEmployeeService();
    //跳转资源
    privateString uri;
    public voiddoGet(HttpServletRequest request, HttpServletResponse response)
            throwsServletException, IOException {
        try{
            //1. 获取“当前页”参数;  (第一次访问当前页为null)
            String currPage = request.getParameter("currentPage");
            //判断
            if (currPage == null || "".equals(currPage.trim())){
                currPage = "1";      //第一次访问,设置当前页为1;
}
            //转换
            int currentPage =Integer.parseInt(currPage);
            //2. 创建PageBean对象,设置当前页参数; 传入service方法参数
            PageBean<Employee> pageBean = new PageBean<Employee>();
            pageBean.setCurrentPage(currentPage);
            //3. 调用service
            employeeService.getAll(pageBean);    //【pageBean已经被dao填充了数据】
            //4. 保存pageBean对象,到request域中
            request.setAttribute("pageBean", pageBean);
            //5. 跳转
            uri = "/WEB-INF/list.jsp";
        } catch(Exception e) {
            e.printStackTrace();  //测试使用
            //出现错误,跳转到错误页面;给用户友好提示
            uri = "/error/error.jsp";
        }
        request.getRequestDispatcher(uri).forward(request, response);
    }
    public voiddoPost(HttpServletRequest request, HttpServletResponse response)
            throwsServletException, IOException {
        this.doGet(request, response);
    }
}
packagecom.loaderman.demo.utils;
importjava.util.List;
/**
 * 封装分页的参数
 *
 * @authorJie.Yuan
 *
 */
public class PageBean<T>{
    private int currentPage = 1; //当前页, 默认显示第一页
    private int pageCount = 4;   //每页显示的行数(查询返回的行数), 默认每页显示4行
    private int totalCount;      //总记录数
    private int totalPage;       //总页数 = 总记录数 / 每页显示的行数  (+ 1)
    private List<T> pageData;       //分页查询到的数据
    //返回总页数
    public intgetTotalPage() {
        if (totalCount % pageCount == 0) {
            totalPage = totalCount /pageCount;
        } else{
            totalPage = totalCount / pageCount + 1;
        }
        returntotalPage;
    }
    public void setTotalPage(inttotalPage) {
        this.totalPage =totalPage;
    }
    public intgetCurrentPage() {
        returncurrentPage;
    }
    public void setCurrentPage(intcurrentPage) {
        this.currentPage =currentPage;
    }
    public intgetPageCount() {
        returnpageCount;
    }
    public void setPageCount(intpageCount) {
        this.pageCount =pageCount;
    }
    public intgetTotalCount() {
        returntotalCount;
    }
    public void setTotalCount(inttotalCount) {
        this.totalCount =totalCount;
    }
    public List<T>getPageData() {
        returnpageData;
    }
    public void setPageData(List<T>pageData) {
        this.pageData =pageData;
    }
}

免责声明:文章转载自《分页技术实现分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇8080端口被占用的解决方案(其它端口同理)CMDB初步了解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

图书管理系统【用户、购买、订单模块、添加权限】

用户模块 要登陆后才能购买,因此我们先写购买模块. 设计实体 private String id; private String username; private String password; private String email; private String cellphone; privat...

spring基于注解的IOC配置 知识点

明确:注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。 配置注解扫描的包:声明到指定的包下去进行扫描,如果发现类上有对应的注解,将其装配到容器中 <context:component-scan base-package="cn.XXX"></context:component-scan>...