先创建一个PageBean:

public class PageBean<T> {
    private int pc;//记录当前页码
    private int tr;//总记录数
    private int ps;//每页记录数
    //请求路径和参数,例如:/BookServlet?...
    private String url;
    private List<T> beanList;
    
    // 计算总页数
    public int getTp() {
        int tp = tr / ps;
        return tr % ps == 0 ? tp : tp + 1;
    }
    
    public int getPc() {
        return pc;
    }
    public void setPc(int pc) {
        this.pc = pc;
    }
    public int getTr() {
        return tr;
    }
    public void setTr(int tr) {
        this.tr = tr;
    }
    public int getPs() {
        return ps;
    }
    public void setPs(int ps) {
        this.ps = ps;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public List<T> getBeanList() {
        return beanList;
    }
    public void setBeanList(List<T> beanList) {
        this.beanList = beanList;
    }
创建一个page.jsp(pb是PageBean对象,在Servlet中存放到request中):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<link rel="stylesheet" type="text/css" href="css/pager.css">
<script type="text/javascript">
    function _go() {
        var pc = $("#pageCode").val();    //获取文本框中的当前页码
        if(!/^[1-9]\d*$/.test(pc)) {    //对当前页码进行整数校验
            alert('请输入正确的页码!');
            return;
        }
        if(pc > "${pb.tp}") {    //判断当前页码是否大于最大页
            alert('请输入正确的页码!');
            return;
        }
        location = "${pb.url}&pc=" + pc;
    }
</script>
<div class="divBody">
  <div class="divContent">
    <!--上一页 当前页如果是第一页,那么就不能点击“上一页”。-->
<c:choose>
    <c:when test="${pb.pc == 0 }"><span class="spanBtnDisabled">上一页</span></c:when>
    <c:when test="${pb.pc eq 1 }"><span class="spanBtnDisabled">上一页</span></c:when>
    <c:when test="${pb.pc ne 0 && pb.pc ne 1 }"><a href="${pb.url }&pc=${pb.pc-1}" class="aBtn bold">上一页</a></c:when>
</c:choose>
<!--计算页码列表的开始和结束位置,即两个变量begin和end
计算它们需要通过当前页码!
1. 总页数不足3页 begin=1, end=最大页
2. 设置begin和end,begin=当前页-1,end=当前页+3
3. 如果begin<1,那么让begin=1,end=6
4. 如果end>tp, 让begin=tp-5, end=tp
5.    pb指的是servlet中根据数据库查询结果封装的PageBean对象,通过request传送
 -->
 <c:choose>

     <c:when test="${pb.tp <= 3}">
         <c:set var="begin" value="1"/>
         <c:set var="end" value="${pb.tp }"/>
     </c:when>
     <c:when test="${pb.tp > 3}">
         <c:set var="begin" value="${pb.pc-1 }"/>
         <c:set var="end" value="${pb.pc + 2}"/>         

          <c:choose>
              <c:when test="${begin<1}">
                <c:set var="begin" value="1"/>
                <c:set var="end" value="3"/>
              </c:when>
              <c:when test="${end>pb.tp}">
                <c:set var="begin" value="${pb.tp-2 }"/>
                <c:set var="end" value="${pb.tp}"/>
              </c:when>
         </c:choose>        
</c:when>
 </c:choose>
 <c:if test = "${pb.tp ne 0}">
 <c:forEach begin="${begin }" end="${end }" var="i">
   <c:choose>
         <c:when test="${i eq pb.pc }">
           <span class="spanBtnSelect">${i}</span>
         </c:when>
         <c:when test="${i ne pb.pc && i ne 0}">
           <a href="${pb.url }&pc=${i}" class="aBtn">${i }</a>
         </c:when>
   </c:choose>
              
 </c:forEach>
    <!-- 计算begin和end -->
      <!-- 如果总页数<=3,那么显示所有页码,即begin=1 end=${pb.tp} -->
        <!-- 设置begin=当前页码-2,end=当前页码+3 -->
          <!-- 如果begin<1,那么让begin=1 end=3 -->
          <!-- 如果begin==end,那么不显示 -->
          <!-- 如果end>最大页,那么begin=最大页-2 end=最大页 -->
   </c:if>


    
    <!-- 显示点点点 -->
    <c:if test="${end < pb.tp }">
      <span class="spanApostrophe">...</span>
    </c:if>

    
     <!--下一页 -->
    <c:choose>
    <c:when test="${pb.pc eq pb.tp }"><span class="spanBtnDisabled">下一页</span></c:when>
    <c:when test="${pb.tp eq 0 }"><span class="spanBtnDisabled">下一页</span></c:when>
    <c:when test="${pb.pc ne pb.tp && pb.tp ne 0 }"><a href="${pb.url }&pc=${pb.pc+1}" class="aBtn bold">下一页</a></c:when>
    </c:choose>
        
        
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    
    <%-- 共N页 到M页 --%>
    <span>共<span style="size: 10px">${pb.tp }</span>页</span>
    <span>到</span>
    <c:choose>
    <c:when test ="${pb.tp == 0 }">
    </c:when>
    <c:when test ="${pb.tp > 0 }">
    <input type="text" class="inputPageCode" id="pageCode" value="${pb.pc }"/>
    </c:when>
    </c:choose>
    <span>页</span>
    <a href="javascript:_go();" class="aSubmit">确定</a>
  </div>
</div>

创建一个servlet与jsp进行交互获取pageBean对象,通过request请求转发到jsp页面,通过遍历pb.beanList来显示需分页显示的内容:

    private static final long serialVersionUID = 1L;
    
    /*
     * 获取当前页码
     */
    private int getPageCode(HttpServletRequest req) {
        String pageCode = req.getParameter("pc");
        if(pageCode == null) return 1;
        if(Integer.parseInt(pageCode) <= 0) return 1;
        try {
            return Integer.parseInt(pageCode);
        } catch(Exception e) {
            return 1;
        }
    }



    /**
     * 获取pageBean的url,req.getRequestURI()获得请求的地址(?前的一串),要去掉&pc=  ,因为点击第几页时要动态的为地址拼装上&pc=  ,以达到分页的效果
     * @param request
     * @param response
     */
    private String getUrl(HttpServletRequest req){
        String url = req.getRequestURI() + "?" + req.getQueryString();
        int fromIndex = url.lastIndexOf("&pc=");
        if(fromIndex == -1){
            return url;
        }
        int toIndex = url.indexOf("&", fromIndex + 1);
        if(toIndex == -1){
            return url.substring(0, fromIndex);
        }
        return url.substring(0, fromIndex) + url.substring(toIndex);
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        /**
         * 1. 获取当前页码
         */
        int pc = getPageCode(request);
        /**
         * 2. 使用BookService查询,得到PageBean
         */
        String type = request.getParameter("type");//jsp跳进servlet的方式通过<a href="/bookshop/BookServlet?type=  ">获得
        
        BookService bookService = new BookService();
        PageBean<ShowInfo> pb = bookService.findByType(type, pc);//按书的种类和当前页码进行查询,其中type作为查询的限制条件,页面作为数据库查询时limit的起始查询位置
        /**
         * 3. 获取url,设置给PageBean
         */
        
        String url = getUrl(request);
        pb.setUrl(url);
        /**
         * 4. 把PageBean保存到request中,请求转发
         */
        request.setAttribute("pb", pb);
        request.getRequestDispatcher("/home/home.jsp").forward(request, response);

    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

创建service:

    public PageBean<Book> findByType(String type, int pc) {
        try {
            BookDao bookDao = new BookDao();
            return bookDao.findByType(type, pc);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }创建dao:

public PageBean<Book> findByType(String type, int pc) throws SQLException {

    Connection conn = null;
        ResultSet rs = null;
        List<Book> bookList = null;
        try{
            bookList = new ArrayList<Book>();
            int ps = PageConstants.BOOK_PAGE_SIZE;//PageConstants.BOOK_PAGE_SIZE静态属性定义了每页显示的数据量,也是PageBean中的ps属性
            String sql = "select * from book where type = ' " + type +" ' limit "+ps * (pc-1) + "," + ps;
            //获取总记录数
            String sql1 = "select count(*) from book where type = '" + type +" ' ";
            conn = DBTools.getConnection();
            st = conn.createStatement();
            rs = st.executeQuery(sql);
            while(rs.next()){
                Book book = new Book();

               book.setAuthor(rs.getString("author"));
               book.setB_no(rs.getString("b_no"));
                book.setBook_info(rs.getString("book_info"));
               book.setType(rs.getString("type"));    
                bookList.add(showInfo);
            }
            rs1 = st.executeQuery(sql1);
            int tr = 0;
            while(rs1.next()){
                tr = rs1.getInt(1); //获取总记录数
            }
            PageBean<Book> pb = new PageBean<ShowInfo>();
            pb.setBeanList(BookList);
            pb.setPs(ps);
            pb.setPc(pc);
            pb.setTr(tr);
            return pb;
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            DBTools.close(conn);
            DBTools.close(st);
            DBTools.close(rs);
        }
        return null;
       

posted on 2017-12-02 23:03  AsiasticWormwood  阅读(224)  评论(0)    收藏  举报