Jsp学习笔记(4)——分页查询

核心sql

i是第几页,itemNum是每页显示的数据条数
select * from (
    select e.*,rownum rn from (
        select * from employee where 1=1 order by empno) e where rownum <(i*itemNum))
where rn >(i-1)*itemNum

大体思路

使用Page类封装(Page当做Dao类中某个方法的参数,Dao类中需要有个方法来获得获得满足条件的记录总数

每次点击查询,重新获得总记录数

首次进入某个需要显示分页的jsp页面,先创建一个Page对象,设置页号为第一页,并同时使用当前的这个Page,从Dao类中查询,得到第一页的List数据,使用session.setAttribute()方法,把Page对象和List数据存入到session中

第二次则是将pageNo的请求参数获得,把session中的Page对象取出,设置pageNo,之后再使用这个Page,从Dao类中获得新的一页的List数据,把Page对象和List数据再次存入session中

之后,为分页按钮设置好href链接(上一页,下一页,最后一页,a标签定义herf,带上页号的参数 query.jsp?pageNo=?

//使用EL表达式读取Page对象中的数据

    
    
        
            首页
        
        
            上一页
        
        <%--如果有下一页,就显示下一页的链接 --%>
        
            下一页
        
        
            尾页
        
    
    
        当前第${employeePage.pageNo}页/总共${employeePage.totalPage}页
    

Page类代码

/**
 * 分页控制类,封装了相关分页时所需的信息,包括:
*
 *      pageNo    -  页号
 *      pageSize  -  每页显示记录数
 *      totalRow  -  总行数
 *      totalPage     -  总页数
 *      previous  -  是否有上一页
 *      next     -  是否有下一页
 *      first        -  是否是每一页
 *      last     -  是否是最后一页
 *      firstIndex -当前页号的开头索引  如页号为2,每页显示记录数为5,当前的页号的开头索引为6
 *      lastIndex  -当前页号的末尾索引  如页号为2,每页显示记录数为5,当前的页号的末尾索引为10
 * 
* * @param 查询条件对象。Map 或者 POJO * @author starsone *

* pageSize=10; * 1页: 第1~10条记录 * 2页: 第11~20第记录 * ..... * 【第一页】【上一页】【下一页】【最后一页】 * Page page = new Page(); */ public class Page { //预定常量:每页的行数 public static final int R5 = 5; public static final int R10 = 10; public static final int R20 = 20; public static final int R50 = 50; public static final int R100 = 100; public static final int DEFAULT_SIZE = R10; //总行数 private int totalRow = 0; //当前页号 private int pageNo = 1; //每页的记录数 public int pageSize = DEFAULT_SIZE; //总页数 private int totalPage = 0; //是否有上一页 private boolean previous; //是否有下一页 private boolean next; //是否是第一页 private boolean first; //是否是最后一页 private boolean last; //当前页数据首条记录索引 每页10, 当前2页:11~20 private int firstIndex; //当前页数据最后条记录索引 private int lastIndex; //查询条件对象 private T queryObject; public Page() { this(0); } /** * @param totalRow 总记录数 */ public Page(int totalRow) { // 101 this(totalRow, DEFAULT_SIZE); } /** * @param totalRow 总记录数 * @param pageSize 每页记录数 */ public Page(int totalRow, int pageSize) { this.totalRow = totalRow; this.pageSize = pageSize; //根据记录数自动算出总页数 if (totalRow % pageSize == 0) { this.totalPage = totalRow / pageSize; } else { this.totalPage = totalRow / pageSize + 1; } } /** * @param queryObject 查询条件 */ public Page(T queryObject, int pageSize, int totalRow) { this.queryObject = queryObject; this.totalRow = totalRow; this.pageSize = pageSize; //根据记录数自动算出总页数 if (totalRow % pageSize == 0) { this.totalPage = totalRow / pageSize; } else { this.totalPage = totalRow / pageSize + 1; } } /** * @param totalRow 总记录数 * @param queryObject 查询条件 */ public Page(int totalRow, T queryObject) { setTotalRow(totalRow); this.queryObject = queryObject; } /** * 得到总记录数 * * @return */ public int getTotalRow() { return totalRow; } /** * @param totalRow */ public void setTotalRow(int totalRow) { this.totalRow = totalRow; } /** * 得到当前的页号 * * @return */ public int getPageNo() { return pageNo; } /** * 得到下一页的页号 * * @return */ public int getNextNo() { if (this.getNext()) { return pageNo + 1; } else { return totalPage; } } /** * 得到上一页的页号 * * @return */ public int getPrevNo() { if (this.getPrevious()) { return pageNo - 1; } else { return pageNo; } } public void setPageNo(int pageNo) { this.pageNo = pageNo; } /** * 得到每页显示的记录数 * * @return */ public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** * 得到总页数 * * @return */ public int getTotalPage() { if (totalRow % pageSize == 0) { this.totalPage = totalRow / pageSize; } else { this.totalPage = totalRow / pageSize + 1; } return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } /** * 是否有下一页 * * @return */ public boolean getNext() { if (pageNo == 1 && pageNo < getTotalPage()) { return true; } if (pageNo > 1 && pageNo < getTotalPage()) { return true; } else { return false; } } /** * 是否有上一页 * * @return */ public boolean getPrevious() { if (getPageNo() > 1) { return true; } else { return false; } } /** * 是否是第一页 * * @return */ public boolean getFirst() { return (getPageNo() > 1 ? false : true); } /** * 是否是最后一页 * * @return */ public boolean getLast() { return (getPageNo() == getTotalPage() ? true : false); } /** * 得到本页数据首条记录索引 * * @return */ public int getFirstIndex() { int i = getPageNo(); //pageNo = 3 return ((i < 1 ? 1 : i) - 1) * getPageSize() + 1; } /** * 得到本页数据最后一条记录索引 * * @return */ public int getLastIndex() { return getFirstIndex() + this.getPageSize() - 1; } /** * 得到查询分页的条件 * * @return */ public T getQueryObject() { return queryObject; } /** * 设置查询分页的条件 * * @return */ public void setQueryObject(T queryObject) { this.queryObject = queryObject; //this.totalRow = new EmployeeDao().countForQuery(((Employee) queryObject)); //根据记录数自动算出总页数 if (totalRow % pageSize == 0) { this.totalPage = totalRow / pageSize; } else { this.totalPage = totalRow / pageSize + 1; } } // 便于调试 @Override public String toString() { return "Page [是否是第一页:" + getFirst() + ", 是否是最后页:" + getLast() + ", 是否有上一页:" + getPrevious() + ", 是否有下一页:" + getNext() + ", 当前的页号:" + getPageNo() + ", 每页记录数:" + getPageSize() + ",开始索引:" + getFirstIndex() + ",末尾索引:" + getLastIndex() + ", 总页数=" + getTotalPage() + ", 总记录数=" + getTotalRow() + "]"; } }

使用范例

/* public static void main(String[] args) {
    // 模拟页页提交的查询条件
    Employee emp = new Employee();

    Page page = new Page(13);

    // 设置(保存)查询条件
    page.setQueryObject(emp);

    //设置 默认每页显示的记录数
    page.setPageSize(Page.R5);
    // 设置当前页号
    page.setPageNo(3);

    System.out.println(page);
    // session.setAttribute("empPage", page);
}*/
select * from (select e.*,rownum rn from (select * from emploee where order by empno) where rownum <= (i*itemNUm) ) where rn >(i-1)*itemNum

你可能感兴趣的:(Jsp学习笔记(4)——分页查询)