Servlet实现后台分页查询

相信大家在搭建后台的时候,经常会使用到分页功能,当然,目前有不少框架(如esayUI)都自带分页的实现,为了更好的理解分页原理,近期本人自己摸索了关于分页查询的一些心得。

归根结底,分页的核心还是在封装PageBean,并通过一定的算法对其进行判断,赋值

 

public class PageBean<T> implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int currentPage; //当前第几页 ,请求传过来
     private int pageCount;  // 每页显示多少条数据
     private int totalCount; //总记录数,查询数据获得
     
     private int totalPage;  //总页数, 通过  totalCount 和 pageCount计算获得
     
     private int startIndex; //开始索引,与pageCount 组成 limit 条件
     
     private List<T> pageData;
     
     //分页显示的页数,如 1,2,3,4
     private int start;
     private int end;
     
     public PageBean(int currentPage,int pageCount,int totalCount){
         this.currentPage=currentPage;
         this.pageCount=pageCount;
         this.totalCount=totalCount;
         
         if(totalCount % pageCount==0){
             this.totalPage = totalCount/ pageCount;
         }else{
             this.totalPage= totalCount/pageCount+1;
         }
         
         this.startIndex = (currentPage-1)*pageCount;
         
         this.start=1;
         this.end=5;
         
         if(pageCount<=5){
             this.end= this.totalPage;
         }else{

             this.start=currentPage-2;
             this.end = currentPage+2;
             
             if(start<=0){
                 this.start=1;
                 this.end=5;
             }
             if(this.end > this.totalPage){
                 this.end=totalPage;
                 this.start=end-4;
             }
         }
     }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    public List<T> getPageData() {
        return pageData;
    }

    public void setPageData(List<T> pageData) {
        this.pageData = pageData;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getEnd() {
        return end;
    }

    public void setEnd(int end) {
        this.end = end;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }
     
     
     
}

 

 

Controller层

1         int currentPage = Integer.valueOf(request.getParameter("currentPage"));
2         
3         int pageCount=7;
4         
5         BlogTypeService blogType = new BlogTypeServiceImpl();
6         
7         PageBean<BlogType> page = blogType.page(currentPage, pageCount);
8         request.setAttribute("page", page);
9         request.getRequestDispatcher("/jsp/blogType.jsp").forward(request, response);

service层

public PageBean<BlogType> page(int currentPage,int pageCount) {
        int totalCount=blogType.getTotal();
        
        PageBean<BlogType> pageBean = new PageBean<>(currentPage, pageCount, totalCount);
        int startIndex = pageBean.getStartIndex();
        pageBean.setPageData(blogType.page(startIndex, pageCount));
        return pageBean;
    }

dao层

public List<BlogType> page(int currentPage,int pageCount){
        String sql = "select * from t_blogtype limit ?,?";
        PageBean<BlogType> pageBean =null;
        Connection conn =null;
        PreparedStatement ps =null;
        ResultSet rs =null;
        BlogType blogType =null;
        try {
            conn =DBDao.connection();
            ps=conn.prepareStatement(sql);
            ps.setInt(1, currentPage);
            ps.setInt(2, pageCount);
            rs=ps.executeQuery();
            List<BlogType> list =new ArrayList<BlogType>();
            while(rs.next()){
                blogType = new BlogType();
                blogType.setId(rs.getInt("id"));
                blogType.setTypeName(rs.getString("typeName"));
                blogType.setOrderNum(pageCount);
                list.add(blogType);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public int getTotal() {
        String sql ="select count(id) from t_blogtype";
        Connection conn =null;
        PreparedStatement ps=null;  
        ResultSet rs=null;  
        int count=0;  
        try{  
            conn= DBDao.connection();
            ps=conn.prepareStatement(sql);  
            rs=ps.executeQuery();  
            rs.next();  
            count=rs.getInt(1);
              
        }catch(Exception e){
            e.printStackTrace();
        }
        return count;  
        
        
    }

   因为本文主要在说分页查询,所以关于 数据库的连接就一并放到dao里了!

  (其实本人是不知道将数据库的连接放在哪里。。。。嘻嘻)

 

jsp

 1 <body>
 2     共有${page.totalCount }个分类,共有${page.pageCount }页,当前为第${page.currentPage }页,每页显示${page.pageCount }条
 3     <table align="center" width="100%">
 4         <thead>
 5             <th>选择</th>
 6             <th>序号</th>
 7             <th>博客类别</th>
 8             <th>博客排序</th>
 9             <th>操作</th>
10         </thead>
11         <tbody align="center" border="1">
12             <c:forEach items="${page.pageData }" var="page">
13                 <tr>
14                 <td><input  type="checkbox" name="id"/></td>
15                 <td>${page.id }</td>
16                 <td>${page.typeName }</td>
17                 <td>${page.orderNum }</td>
18                 <td><a>修改</a>|<a>删除</a></td>
19                 <td></td>
20             </tr>
21             </c:forEach>
22         </tbody>
23     
24     </table>
25     <!-- 分页 -->
26     <div style="text-align:center;">
27         <a href="${pageContext.request.contextPath }/blogType?currentPage=1">首页</a>
28         <!-- 如果当前页为第一页,就没有上一页这个标签 -->
29         <c:if test="${page.currentPage==1 }">
30             <c:forEach begin="${page.start }" end="${page.end }" step="1" var="i">
31                 <c:if test="${page.currentPage == i}">
32                         ${i}
33                 </c:if>                
34                 <c:if test="${page.currentPage != i}">
35                         <a href="${pageContext.request.contextPath}/blogType?currentPage=${i}">${i}</a>                                        
36                  </c:if> 
37             </c:forEach>
38             <a href="${pageContext.request.contextPath }/blogType?currentPage=${page.currentPage+1}">下一页</a>
39         </c:if>
40         <!-- 如果不是首页也不是尾页,就与上一页和下一页 -->
41         <c:if test="${page.currentPage>1 && page.currentPage<page.totalPage }">
42             <a href="${pageContext.request.contextPath }/blogType?currentPage=${page.currentPage-1}">上一页</a>
43             <c:forEach begin="${page.start }" end="${page.end }" step="1" var="i">
44                 <c:if test="${page.currentPage == i}">
45                         ${i}
46                 </c:if>                
47                 <c:if test="${page.currentPage != i}">
48                         <a href="${pageContext.request.contextPath}/blogType?currentPage=${i}">${i}</a>                                        
49                  </c:if> 
50             </c:forEach>
51             <a href="${pageContext.request.contextPath }/blogType?currentPage=${page.currentPage+1}">下一页</a>
52         </c:if>
53         <!-- 如果是最后一页,则没有下一页 -->
54         <c:if test="${page.currentPage==page.totalPage }">
55             <a href="${pageContext.request.contextPath }/blogType?currentPage=${page.currentPage-1}">上一页</a>
56             <c:forEach begin="${page.start }" end="${page.end }" step="1" var="i">
57                 <c:if test="${page.currentPage == i}">
58                         ${i}
59                 </c:if>                
60                 <c:if test="${page.currentPage != i}">
61                         <a href="${pageContext.request.contextPath}/blogType?currentPage=${i}">${i}</a>                                        
62                  </c:if> 
63             </c:forEach>
64             
65         </c:if>
66         <a href="${pageContext.request.contextPath }/blogType?currentPage=${page.totalPage}">尾页</a>
67     </div>
68     
69 </body>

 

 

 

posted @ 2017-10-18 14:53  杀不死  阅读(5694)  评论(1编辑  收藏  举报