JSP通用分页

 通用分页核心思路:将上一次查询请求再发一次,只不过页码变了
 实现步骤:
   1)先查询全部数据
    baseDao<T>
   2)通用分页实现
    pagebean


1. PageBean
   分页三要素 
   page=1        页码        视图层传递过来
   rows=10         页大小      视图层传递过来
   total=0       总记录数    后台查出来

 pagination=true  是否分页    视图层传递过来

   getStartIndex()        基于MySql数据库分页,获取分页开始标记
  (page-1)*rows

  url         请求路径    视图层传递过来 
   map           参数集合    视图层传递过来
   setRequest(HttpServletRequest req)  设置请求参数

   getMaxPager()        获取最大页码
   getProviousPager()   获取上一页
   getNextPager()       获取下一页

2. 后台
  2.1 entity
  2.2 dao
      BaseDao<T>
 1)匿名内部接口
 2)分页查询方法,接口方法传参
  3)二次查询的条件要一致

3.视图层
   PageTag

   点击分页按钮,将上一次的请求再发一次
   注意:不能将分页表单嵌套到其它表单中,否则不能提交表单!

pageTag代码

package com.tag;

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.util.PageBean;

public class PageTag extends BodyTagSupport{

	private PageBean pageBean;//包含了所有分页相关的元素
	
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.print(toHTML());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	private String toHTML() {
		StringBuffer sb=new StringBuffer();
		
		//隐藏的form表单---上一次请求下一次重新发送的关键
		sb.append("<form action='"+pageBean.getUrl()+"' id='pageBeanForm' method='post'>");
		sb.append("<input type='hidden' name='page'>");
		Map<String, String[]> map = pageBean.getMap();//上一次请求的参数
		
		if(map!=null&&map.size()>0) {
			Set<Entry<String, String[]>> set = map.entrySet();
			for (Entry<String, String[]> s : set) {
				//参数名
				String key = s.getKey();
				//参数值
				String[] value = s.getValue();
				for (String v : value) {
					//上一次请求的参数,再一次拼成了新的form表单
					//注意:page参数每次都会提交,我们需避免
					if(!"page".equals(key)) {
					sb.append(" <input type='hidden' name='"+key+"' value='"+v+"'>");
				}
			  }
			}
		}
		sb.append("</form>");
		sb.append("<ul class='pagination justify-content-center'>");
		sb.append(" <li class='page-item "+(pageBean.getPage()==1?"disable":"")+"'><a class='page-link' href='javascript:gotoPage(1)'>首页〉</a></li>");
		sb.append(" <li class='page-item "+(pageBean.getPage()==1?"disable":"")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.previousPage()+")'>&lt;</a></li>");
//		sb.append(" <li class='page-item'><a class='page-link' href='#'>1</a></li>");
//		sb.append(" <li class='page-item'><a class='page-link' href='#'>2</a></li>");
		sb.append(" <li class='page-item active'><a class='page-link' href='javascript:gotoPage("+pageBean.getPage()+")'>"+pageBean.getPage()+"</a></li>");
		sb.append(" <li class='page-item "+(pageBean.getPage()==pageBean.maxPage()?"disable":"")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.nextPage()+")'>&gt;</a></li>");
		sb.append(" <li class='page-item "+(pageBean.getPage()==pageBean.maxPage()?"disable":"")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.maxPage()+")'>尾页〉</a></li>");
		sb.append(" <li class='page-item go-input'><b>到第</b><input class='page-link' type='text' id='skipPage' name='' /><b>页/b></li>");
		sb.append(" <li class='page-item go'><a class='page-link' href='javascript:skipPage()'>确定</a></li>");
		sb.append(" <li class='page-item'><b>共"+pageBean.getTotal()+"条</b></li>");
		sb.append("</ul>");
		
		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("");
		sb.append("       function skipPage() {");
		sb.append("            var page = document.getElementById('skipPage').value;");
		sb.append("            if (!page || isNaN(page) || parseInt(page) < 1 || parseInt(page) > "+pageBean.maxPage()+") {");
		sb.append("                    alert('请输入1-"+pageBean.maxPage()+"的数字');");
		sb.append("                     return;");
		sb.append("         }");
		sb.append("   gotoPage(page);");
		sb.append(" }");
		sb.append("</script>");
		return sb.toString();
	}
	@Override
	public int doEndTag() throws JspException {
		return super.doEndTag();
	}
}

bookDao代码

package com.dao;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
 
import com.entity.Book;
import com.util.DBAccess;
import com.util.PageBean;
 
public class BookDao extends BaseDao<Book>{
/**
 * 未继承时的方法
 * @param book
 * @return
 * @throws Exception
 */
	public List<Book> getAll(Book  book) throws Exception{
		List<Book> list=new ArrayList<Book>();
		String sql="select * from t_mvc_book where 1=1";
		//书籍名称
		String bname = book.getBname();
		if(com.util.StringUtils.isNotBlank(bname)) {
			sql+=" and bname like %"+bname+"%";
		}
		Connection con=DBAccess.getConnection();
		PreparedStatement ps = con.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()) {
			Book b=new Book();
			b.setBid(rs.getInt("bid"));
			b.setBname(rs.getString("bname"));
			b.setPrice(rs.getDouble("price"));
			list.add(b);
		}
		return list;
	}
	
	
	
/**
 * 继承父类后的方法
 * @param book
 * @return
 * @throws Exception
 */
	public List<Book> getAll2(Book  book) throws Exception{
		String sql="select * from t_mvc_book where 1=1";
		//书籍名称
		String bname = book.getBname();
		if(com.util.StringUtils.isNotBlank(bname)) {
			sql+=" and bname like %"+bname+"%";
		}
		
		return super.getAll(sql, Book.class);
	}
	
	/**
	 * 实现分页
	 * @param book
	 * @param pageBean
	 * @return
	 * @throws Exception
	 */
	public List<Book> getAll3(Book  book,PageBean pageBean) throws Exception{
		String sql="select * from t_mvc_book where 1=1";
		//书籍名称
		String bname = book.getBname();
		if(com.util.StringUtils.isNotBlank(bname)) {
			sql+=" and bname like %"+bname+"%";
		}
		
		return super.pages(sql, Book.class, pageBean);
	}
}

pageBean代码

package com.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 String url;//保存上一次请求的url
	
	private Map<String, String []> map=new HashMap<>();
	
	public void setRequest(HttpServletRequest req) {
		this.setUrl(req.getRequestURI().toString());
		this.setMap(req.getParameterMap());
		this.setPagination(req.getParameter("pagination"));
		this.setRows(req.getParameter("rows"));
		this.setPage(req.getParameter("page"));
	}
	
	private void setPage(String page) {
		if(StringUtils.isNotBlank(page)) {
			this.setPage(Integer.parseInt(page));
		}
		
	}
	private void setRows(String rows) {
		if(StringUtils.isNotBlank(rows)) {
			this.setRows(Integer.valueOf(rows));
		
		}
	}
 
	public void setPagination(String pagination) {
		if(StringUtils.isNotBlank(pagination)) {
			this.setPagination(!"false".equals(pagination));
		}
		
	}
 
	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;
	}
	
 
	public String getUrl() {
		return url;
	}
 
	public void setUrl(String url) {
		this.url = url;
	}
 
	public Map<String, String[]> getMap() {
		return map;
	}
 
	public void setMap(Map<String, String[]> map) {
		this.map = map;
	}
 
	/**
	 * 鑾峰緱璧峰璁板綍鐨勪笅鏍�
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page - 1) * this.rows;
	}
/**
 * 最大页码
 * @return
 */
	public int maxPage() {
		return this.total%this.rows==0?this.total/this.rows:this.total/this.rows+1;
	}
	/**
	 * 下一页
	 * @return
	 */
	public int nextPage() {
		return this.page<maxPage()?this.page+1:this.page;
	}
	/**
	 * 上一页
	 * @return
	 */
	public int previousPage() {
		return this.page<1 ? 1:this.page-1;
	}
	
	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
	}
 
}

servlet代码

package com.web;
 
import java.io.IOException;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.dao.BookDao;
import com.entity.Book;
import com.util.PageBean;
@WebServlet("/index.do")
public class BookServlet extends HttpServlet {
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Book b=new Book();
		BookDao bd=new BookDao();
		b.setBname(req.getParameter("bname"));
		PageBean p=new PageBean();
		p.setRequest(req);
		try {
			List<Book> all3 = bd.getAll3(b, p);
			req.setAttribute("list3", all3);
			req.setAttribute("pageBase", p);
		} catch (Exception e) {
			e.printStackTrace();
		}
		req.getRequestDispatcher("index.jsp").forward(req, resp);
	}
 
}

jsp界面

<%@taglib prefix="zking" uri="http://java.veryedu.cn"%>    
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

    <form class="form-inline"
        action="${pageContext.request.contextPath }/book/search" method="post">
        <div class="form-group mb-2">
        <input type="text" class="form-control-plaintext" name="bname" 
                placeholder="请输入书籍名称">
        </div>
        <button type="submit" class="btn btn-primary mb-2">查询</button>
    </form>

    <table class="table table-striped bg-success">
        <thead>
            <tr>
                <th scope="col">书籍ID</th>
                <th scope="col">书籍名</th>
                <th scope="col">价格</th>
            </tr>
        </thead>
        <tbody>
        <c:forEach var="b" items="${books }">
            <tr>
                <td>${b.bid }</td>
                <td>${b.bname }</td>
                <td>${b.price }</td>
            </tr>
            </c:forEach>

        </tbody>
    </table>
    <!-- 这一行代码就相当于前面分页需求前端的几十行代码 -->
    <zking:Page pageBean="${pageBean }"></zking:Page>

要是乱码了,记得用过滤器处理哦
 


版权声明:本文为boy_10原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。