通用分页

分页的三要素

在pageBean里面

page 页码 视图层传递过来
rows 页大小 视图层传递过来
total 总记录数 后台查出来
pagination 是否分页 视图层传递过来

后台

1entity
2 dao
第一次查满足条件的总记录数
第二次查指定页码并满足条件的记录
二次查询的条件要一致
3 控制层
Servlet

视图层

在 PageTag类里面

如何将上一次查询请求再发一次
String contextPath = req.getContextPath();//根目录
String url = req.getServletPath();//请求的地址
req.getRequestURL() //获取请求全路径
Map parameterMap = req.getParameterMap();//获得请求中的所有参数

具体思路

具体思路:
1、补全servlet
2、页面展示
3、分页重要参数(page、rows、是否分页、上一次请求、上一次的表单参数)
4、自定义分页标签

代码

Bookdao


package com.zhoujun.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.zhoujun.entity.Book;
import com.zhoujun.util.BaseDao;
import com.zhoujun.util.DBAccess;
import com.zhoujun.util.PageBean;
import com.zhoujun.util.StringUtils;

public class BookDao extends BaseDao<Book>{

	public List<Book> list(Book book, PageBean pageBean ) throws SQLException, InstantiationException, IllegalAccessException{
		List<Book> list =new ArrayList<Book>();
		String sql ="select * from t_mvc_book where true";
		String bname=book.getBname();
		if(StringUtils.isNotBlank(bname)) {
			sql += "and bname like '%"+bname+"%' ";	
		}
		return super.executeQuery(sql, Book.class, pageBean);
	}	
	
	public static void main(String[] args) throws SQLException, InstantiationException, IllegalAccessException {
		BookDao bookDao=new BookDao();
		Book  book =new Book();
		//book.setBname("圣墟");
		PageBean pageBean =new PageBean();
		pageBean.setPage(2);
		//如果不想分页
		//pageBean.setPagination(false);
		List<Book> list =bookDao.list(book, pageBean);
		for (Book b : list) {
			System.out.println(b);
		}
		System.out.println(pageBean);
	}
	
	
}

BaseDao里面写出需求

package com.zhoujun.util;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.zhoujun.entity.Book;

public class BaseDao<T> {
	public List<T> executeQuery(String sql, Class clz, PageBean pageBean ) throws SQLException, InstantiationException, IllegalAccessException {
		List<T> list =new ArrayList<>();
		Connection con=DBAccess.getConnection();
		PreparedStatement pst = null;
		ResultSet rs = null;
		if(pageBean !=null && pageBean.isPagination()) {
			//想要分页     列表需求
			//查询符合条件的总记录数
			String countSql=getCountSql(sql);
			pst = con.prepareStatement(countSql);
			rs = pst.executeQuery();
			if(rs.next()) {
				pageBean.setTotal(rs.getObject(1).toString());//85
			}	
			//显示想要看到的数据,就比如说第3页的10 条数据
			String pageSql=getPageSql(sql,pageBean);
			pst = con.prepareStatement(pageSql);
			rs = pst.executeQuery();
		}else {
			//不想要分页   下拉框需求
			pst = con.prepareStatement(sql);
			rs = pst.executeQuery();
		}
		while(rs.next()) {
			/**
			 * 实例化了一个对象
			 * 给这个空对象的每一个属性赋值
			 * 将赋值的对象添加到list集合中返回
			 */
	//		list.add(new Book(rs.getInt("bid"),rs.getString("bname"),rs.getFloat("price")));	
		T t=(T) clz.newInstance();
		 for (Field f : clz.getDeclaredFields()) {
			f.setAccessible(true);
			f.set(t, rs.getObject(f.getName()));
		}
		 list.add(t);
				
		}
		DBAccess.close(con, pst, rs);
		return list;	
	}
	private String getPageSql(String sql, PageBean pageBean) {
		// TODO Auto-generated method stub
		return sql + "limit"+pageBean.getStartIndex()+ ","+pageBean.getRows();
	}
	public String getCountSql(String sql) {
		return "select count(1) from ("+sql+") t";
	}
	
	
}

分页工具类

package com.zhoujun.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;// 总记录数
	//上一次查询的url
	private String url;
	//上一次查询所带的查询条件
	private Map<String,String[]> parameterMap =new HashMap<String, String[]>();

	//对pagebaean进行初始化
	public void setRequest(HttpServletRequest req) {
		//初始化jsp页面传递过来的当前页
		this.setPage(req.getParameter("page"));
		//初始化jsp页面传递过来的页大小
		this.setRows(req.getParameter("rows"));
		//初始化jsp页面传递过来是否分页
		this.setPagination(req.getParameter("pagination"));
		//保留上一次的查询请求
		this.setUrl(req.getRequestURL().toString());
		//保留上一次的查询条件
		this.setParameterMap(req.getParameterMap());
	}
	
	
	public String getUrl() {
		return url;
	}





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





	public Map<String, String[]> getParameterMap() {
		return parameterMap;
	}





	public void setParameterMap(Map<String, String[]> parameterMap) {
		this.parameterMap = parameterMap;
	}





	private void setPagination(String pagination) {
		//只有填写了false字符串,才代表不分页
		this.setPagination(!"false".equals(pagination));
		
	}

	private void setRows(String rows) {
		if(StringUtils.isNotBlank(rows)) {
			this.setRows(Integer.valueOf(rows));
		}
		
	}

	private void setPage(String page) {
		if(StringUtils.isNotBlank(page)) {
			this.setPage(Integer.valueOf(page));
		}
		
	}

	private boolean pagination = true;// 是否分页

	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 + "]";
	}
	
	//上一页
	public int getPrevPage() {
		return this.page >1 ? this.page-1 : this.page;
	}
	//下一页
	public int getNextPage() {
		return this.page < this.getMaxPage() ? this.page +1 :this.page;
	}
	//最大页
	public int getMaxPage() {
		return this.total % this.rows ==0 ? this.total / this.rows :(this.total / this.rows)+1;
	}
	
	
}

pagetag类

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

public class pageTag extends BodyTagSupport{
	private static final long serialVersionUID = -4625761529807396689L;
	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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return super.doStartTag();
		
	}
	private String toHTML() {
		StringBuilder sb=new StringBuilder();
		//上一次查询的form表单的html
		sb.append("
"); //查第几页的数据 sb.append(""); Map<String, String[]> parameterMap = pageBean.getParameterMap(); if(parameterMap.size()>0) { Set<Entry<String,String[]>> entrySet = parameterMap.entrySet(); for (Entry<String,String[]> entry : entrySet) { if(!"page".equals(entry.getKey())) { for (String val: entry.getValue()) { sb.append(""); } } } } sb.append(""
); //默认展示前面4页,当前页,后面5页 int page =pageBean.getPage(); int max =pageBean.getMaxPage(); int before =page>4 ? 4: page-1; int after = 10-1-before;//5 after = max-page >after ? after : max-page; //用来控制上一页的点击按钮特效的 boolean startFlag = page >1; //用来控制下一页的点击按钮特效的 boolean endFlag = page <max; // 拼接分页条 sb.append("
    "); sb.append("
  • 首页
  • "
    ); sb.append("
  • <
  • "
    ); // 代表了当前页的前4页 for (int i = before; i > 0 ; i--) { sb.append("
  • "+(page-i)+"
  • "
    ); } sb.append("
  • "+pageBean.getPage()+"
  • "
    ); // 代表了当前页的后5页 for (int i = 1; i <= after; i++) { sb.append("
  • "+(page+i)+"
  • "
    ); } sb.append("
  • >
  • "
    ); sb.append("
  • 尾页
  • "
    ); sb.append("
  • 到第
  • "
    ); sb.append("
  • 确定
  • "
    ); sb.append("
  • 共"+pageBean.getTotal()+"条
  • "
    ); sb.append("
"
); // 拼接分页的js代码 sb.append(""); return sb.toString(); } }

自定义tid文件

<?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>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>z</short-name>
  <uri>/zhoujun</uri>



  <tag>
    <name>page</name>
    <tag-class>com.zhoujun.tag.pageTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>pageBean</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

</taglib>

jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
   <%@ taglib prefix="z" uri="/zhoujun" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8">
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>

<title>书籍列表</title>
<style type="text/css">
	.page-item input {
	padding: 0;
	width: 40px;
	height: 100%;
	text-align: center;
	margin: 0 6px;
}

.page-item input,
.page-item b {
	line-height: 38px;
	float: left;
	font-weight: 400;
}

.page-item.go-input {
	margin: 0 10px;
}

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

<table class="table">
  <thead>
    <tr>
      <th scope="col">书籍ID</th>
      <th scope="col">书籍名称</th>
      <th scope="col">书籍价格</th>
    </tr>
  </thead>
  <tbody>
   <c:forEach var="b" items="${bookList }">
  	 <tr>
      <td>${b.bid }</td>
      <td>${b.bname }</td>
      <td>${b.price }</td>
    </tr>
  </c:forEach> 
   
 
  </tbody>
</table>
 <z:page pageBean="${pageBean }"></z:page> 
</body>
</html>

输出结果:

通用分页_第1张图片

总结:下次见

你可能感兴趣的:(通用分页)