通用分页

Posted bf6rc9qu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通用分页相关的知识,希望对你有一定的参考价值。

 

通用分页核心思路:
将上一次查询请求再发一次,只是当前页变了而已。


首页 1 2 3 4 … 100 末页 跳转

mysql分页:select * from 表 limit 3,3

 

每页显示记录数      自己设置
当前页          来自前端
总页数          总记录数%每页显示记录数==0?总记录数/每页显示记录数:总记录数/每页显示记录数+1
总记录数         数据库统计count()
每页起始记录数      =(当前页-1)*每页显示记录数+1

总共101条记录,每页显示10条
第一页: 1-10
第二页: 11-20
第三页: 21-30

每页结尾记录数      =当前页*每页显示记录数

 

1、通用的查询方法代码实现

导入jar包

commons-beanutils-1.8.0.jar
commons-logging.jar
jstl-1.2.jar
mysql-connector-java-5.1.44-bin.jar
standard-1.1.2.jar

 

 

 

连接数据库之前查看自己的用户名、密码、数据库名是否正确

 

isOracle:false
isSQLServer:false
isMysql:true
数据库连接(关闭)成功

 

#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_book?useUnicode=true&characterEncoding=UTF-8
user=root
pwd=root

BookServlet.java

 

package com.huang.web;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.huang.dao.BookDao;
import com.huang.entity.Book;
import com.huang.util.PageBean;

public class BookServlet extends HttpServlet 

    private static final long serialVersionUID = 2331970325281408992L;

    private BookDao bookDao=new BookDao();
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        doPost(req, resp);
    
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        String bname=req.getParameter("bname");
//        bname=new String(bname.getBytes("ISO-8859-1"),"UTF-8");
        Book book=new Book();  
        book.setBname(bname);
        
//        Map<String, String[]> parameterMap=req.getParameterMap();
//        StringBuffer url=req.getRequestURL();  
        
        
        PageBean pagebean=new PageBean();
         try 
             pagebean.setRequest(req);
            List<Book> list=this.bookDao.list(book, pagebean);
            req.setAttribute("bookList", list);
            req.setAttribute("pageBean", pagebean);
            req.getRequestDispatcher("/bookList.jsp").forward(req, resp);
         catch (InstantiationException | IllegalAccessException | SQLException e) 
            e.printStackTrace();
        
    
    

 

bookList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
     <%@taglib uri="/huang" prefix="z"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>小说目录</h2>
    <br>
    <form action="$pageContext.request.contextPath/bookServlet.action"
        method="post">
        书名:<input type="text" name="bname"> <input type="submit"
            value="确定">
            <!-- <input type="hidden" name="pagination" value="false">
            <input type="hidden" name="rows" value="20"> -->
    </form>
    <table border="1" width="100%">
        <tr>
            <td>编号</td>
            <td>名称</td>
            <td>价格</td>
        </tr>
        <c:forEach items="$bookList " var="b">
            <tr>
                <td>$b.bid </td>
                <td>$b.bname </td>
                <td>$b.price </td>
            </tr>
        </c:forEach>
    </table>

    <z:page pageBean="$pageBean "></z:page>
    
</body>
</html>

 

PageBean.java

package com.huang.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class PageBean 

    private int page = 1;// 页码

    private int rows = 10;// 页大小

    private int total = 0;// 总记录数

    private boolean pagination = true;// 是否分页
    
    private Map<String, String[]> paMap=new HashMap<>();
    private String url;
    
    public void setRequest(HttpServletRequest req) 
        
        //保存上一次请求所携带的参数
        this.setPaMap(req.getParameterMap());
        this.setUrl(req.getRequestURI().toString());
//        在jsp页面来控制是否分页
        this.setPagination(req.getParameter("pagination"));
//        在jsp页面 控制一页展示多少条
        this.setRows(req.getParameter("rows"));
        this.setPage(req.getParameter("page"));
    
    
    
    public void setPage(String page) 
        this.page=StringUtils.isNotBlank(page) ? Integer.valueOf(page) : this.page;
        
    


    public void setPagination(String pagination) 
        this.pagination=StringUtils.isNotBlank(pagination) ? !"false".equals(pagination) : this.pagination;
    

    public void setRows(String rows) 
        this.rows=StringUtils.isNotBlank(rows) ? Integer.valueOf(rows) : this.rows;
    

    public Map<String, String[]> getPaMap() 
        return paMap;
    

    public void setPaMap(Map<String, String[]> paMap) 
        this.paMap = paMap;
    

    public String getUrl() 
        return url;
    

    public void setUrl(String url) 
        this.url = url;
    

    public PageBean() 
        super();
    

    public int getPage() 
        return page;
    

    public void setPage(int page) 
        this.page = page;
    

    public int getRows() 
        return rows;
    

    public void setRows(int rows) 
        this.rows = rows;
    

    public int getTotal() 
        return total;
    

    public void setTotal(int total) 
        this.total = total;
    

    public void setTotal(String total) 
        this.total = Integer.parseInt(total);
    

    public boolean isPagination() 
        return pagination;
    

    public void setPagination(boolean pagination) 
        this.pagination = pagination;
    

    /**
     * 获得起始记录的下标
     * 
     * @return
     */
    public int getStartIndex() 
        return (this.page - 1) * this.rows;
    

    @Override
    public String toString() 
        return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    

    /**
     * 获取最大的页码数
     * @return
     */
    public int getMaxpage() 
        return this.total % this.rows==0 ?  this.total/this.rows :  this.total/this.rows+1;
    
    
    /**
     * 获取下一页
     * @return
     */
    public int getNextpage() 
        return this.page< this.getMaxpage() ? this.page+1 : this.page;
    
    
    /**
     * 获取上一页
     */
    public int getPreviousPage() 
        return this.page > 1 ? this.page-1 : this.page;
    
    

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>T226_pagebean</display-name>
  <filter>
          <filter-name>encodingFiter</filter-name>
          <filter-class>com.huang.util.EncodingFiter</filter-class>
  </filter>
  
  <filter-mapping>
      <filter-name>encodingFiter</filter-name>
      <servlet-name> *.action</servlet-name>
  </filter-mapping>
  
  
  <servlet>
          <servlet-name>bookServlet</servlet-name>
          <servlet-class>com.huang.web.BookServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>bookServlet</servlet-name>
      <url-pattern>/bookServlet.action</url-pattern>
  </servlet-mapping>
</web-app>

z.tld

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    
  <description>huang 1.1 core library</description>
  <display-name>huang core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>c</short-name>
 <uri>/huang</uri>
    
    <tag>
         <!--库中的标签(类似c:set c:out的定义)-->
        <name>page</name>
        <!-- 是标签运行具体代码,也就是助手类,下面填写的是助手类的全路径名 -->
        <tag-class>com.huang.tag.PageTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
        <!-- 该标签的属性 -->
        <name>pageBean</name>
        <!-- 该属性是否必填 -->
        <required>true</required>
        <!-- 是否支持表达式 -->
        <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag> 
      
      
      
</taglib>

PageTag.java

package com.huang.tag;

import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import com.huang.util.PageBean;

public class PageTag extends BodyTagSupport 

    private static final long serialVersionUID = -7819663757698266331L;

    private PageBean pageBean;

    public PageBean getPageBean() 
        return pageBean;
    

    public void setPageBean(PageBean pageBean) 
        this.pageBean = pageBean;
    
    
    @Override
    public int doStartTag() throws JspException 
        JspWriter out=pageContext.getOut();
        try 
            out.print(toHTML());
         catch (IOException e) 
            e.printStackTrace();
        
        return super.doStartTag();
    

    private String toHTML() 
        StringBuilder sb=new StringBuilder();
//        拼接下一次发送请求所要提交的隐藏的form表单
        sb.append("<form id=‘pageBeanForm‘ action=‘"+pageBean.getUrl()+"‘ method=‘post‘>");
        sb.append("<input type=‘hidden‘ name=‘page‘>");
        
        Map<String, String[]> paMap=pageBean.getPaMap();
        if(paMap!=null&&paMap.size()>0) 
            Set<Entry<String, String[]>> entrySet=paMap.entrySet();
            for (Entry<String, String[]> entry : entrySet) 
//                上一次请求可能携带页码name=page的参数,但是该参数在前面已经单独赋值
//                为什么要单独赋值呢?因为上一次请求是第一页的数据,下一次可能是第二页,
//                因为这前后请求page对应的值是不一样的,需要单独赋值
                if("page".equals(entry.getKey())) 
                    for (String val : entry.getValue()) 
                        sb.append("<input type=‘hidden‘ name=‘"+entry.getKey()+"‘ value=‘"+val+"‘>");
                    
                
            
        
        sb.append("</form>");
        
//        拼接分页条
        sb.append("<div style=‘text-align: right; font-size: 12px;‘>");
        sb.append("每页"+pageBean.getRows()+"条,共"+pageBean.getTotal()+"条,第"+pageBean.getPage()+"页,共"+pageBean.getMaxpage()+"页&nbsp;&nbsp;<a");
        sb.append(" href=‘javascript:gotoPage(1)‘>首页</a>&nbsp;&nbsp;<a");
        sb.append(" href=‘javascript:gotoPage("+pageBean.getPreviousPage()+")‘>上一页</a>&nbsp;&nbsp;<a");
        sb.append("href=‘javascript:gotoPage("+pageBean.getNextpage()+")‘>下一页</a>&nbsp;&nbsp;<a");
        sb.append("href=‘javascript:gotoPage("+pageBean.getMaxpage()+")‘>尾页</a>&nbsp;&nbsp;<input type=‘text‘");
        sb.append("id=‘skipPage‘");
        sb.append("style=‘text-align: center; font-size: 12px; width: 50px;‘>&nbsp;&nbsp;<a");
        sb.append("href=‘javascript:skipPage()‘>Go</a>");
        sb.append("</div>");
        
//         拼接分页所需要的js代码
        sb.append("<script type=‘text/javascript‘>");
        sb.append(" function gotoPage(page) ");
        sb.append("        document.getElementById(‘pageBeanForm‘).page.value = page;");
        sb.append("        document.getElementById(‘pageBeanForm‘).submit();");
        sb.append(" ");
        sb.append(" function skipPage() ");
        sb.append("            var page = document.getElementById(‘skipPage‘).value;");
        sb.append("            if(!page || isNaN(page) || parseInt(page)<1 || parseInt(page)>maxPage)");
        sb.append("                alert(‘请输入1~N的数字‘);");
        sb.append("             return;");
        sb.append("             ");
        sb.append("            gotoPage(page);");
        sb.append("     ");
        sb.append("</script>");
        
        
        return sb.toString();
    
    

 

以上是关于通用分页的主要内容,如果未能解决你的问题,请参考以下文章

单页分页问题中的多个角度材料表

梦内容页分页标题提取

一个视图中的 CI 多页分页,

以多页分页打印所有数据

CakePHP 2中带有分页分页类的大小为f数组的问题

当我在基于类的视图中应用过滤器时,如何在 django 中使用分页分页。网址总是不断变化我如何跟踪网址