通用分页(二)

通用分页核心思路

将上一次查询请求再发一次,只不过页码变了

1. PageBean

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

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

2. 后台

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

3. 视图层

PageTag

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

步骤:

1、补全servlet

package com.web;

import java.io.IOException;
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.dao.BookDao;
import com.entity.Book;
import com.uitl.PageBean;

public class BookServlet extends HttpServlet{

	private static final long serialVersionUID = 6304839939800249916L;

	BookDao bookDao=new BookDao();
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String bname=req.getParameter("bname");
		Book book=new Book();
		book.setBname(bname);
		
		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 (Exception e) {
			// TODO: handle exception
			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="/xieminglu" 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"
		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>
</body>
</html>

配置xml(encodingFiter是我们所写的过滤器,用来防止查询时乱码问题)

<?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">

<filter>
   <filter-name>encodingFiter</filter-name>
   <filter-class>com.uitl.EncodingFiter</filter-class>
</filter>
<filter-mapping>
   <filter-name>encodingFiter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>bookServlet</servlet-name>
    <servlet-class>com.web.BookServlet</servlet-class>
</servlet>  
<servlet-mapping>
    <servlet-name>bookServlet</servlet-name>
    <url-pattern>/bookServlet</url-pattern>
</servlet-mapping>
</web-app>

2、页面展示

在这里插入图片描述

3、分页重要参数(page、rows、是否分页、上一次请求、上一次的表单参数)

PageBean 类

/**
 * 分页工具类
 *
 */
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.getRequestURL().toString());
//		在jsp页面来控制是否分页
		this.setPagination(req.getParameter("pagination"));
//		在jsp页面控制一页展示多少条
		this.setRows(req.getParameter("rows"));
		this.setPage(req.getParameter("page"));
    }

    public void setPage(String page) {
		// TODO Auto-generated method stub
		this.page=StringUtils.isNotBlank(page) ? Integer.valueOf(page) : this.page;
	}

	public void setPagination(String pagination) {
		// TODO Auto-generated method stub
		this.pagination=StringUtils.isNotBlank(pagination) ? !"false".equals(pagination) : this.pagination;
	}

	public void setRows(String rows) {
		// TODO Auto-generated method stub
		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 + "]";
	}

	/*
	 * 获取最大的页码数
	 * */
	public int getMaxPage() {
		return this.total%this.rows==0 ? this.total/this.rows : this.total/this.rows+1;
	}
	/*
	 * 获取下一页
	 * */
	public int getNextPage() {
		return this.page<this.getMaxPage() ? this.page+1 : this.page;
	}
	/*
	 * 获取上一页
	 * */
	public int getPerviousPage() {
		return this.page > 1 ? this.page-1 : this.page;
	}
}

4、自定义分页标签

PageTag 类

public class PageTag extends BodyTagSupport{

	private static final long serialVersionUID = -553969530960334073L;
    private PageBean pageBean;
	public PageBean getPageBean() {
		return pageBean;
	}
	public void setPageBean(PageBean pageBean) {
		this.pageBean = pageBean;
	}
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		JspWriter out = pageContext.getOut();
		try {
			out.print(toHTML());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	private String toHTML() {
		// TODO Auto-generated method stub
		StringBuilder sb=new StringBuilder();
		
//		拼接下一次发送请求所要提交的隐藏的from表单
		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的参数,但是该参数在前面已经单独赋值 
//				为何单独赋值?因为上一次请求是第一页数据,下一次可能是第N页数据,这前后请求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 href='javascript:gotoPage(1)'>首页</a>&nbsp;&nbsp;<a");
		sb.append(" href='javascript:gotoPage("+pageBean.getPerviousPage()+")'>上一页</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)>"+pageBean.getMaxPage()+"){");
		sb.append("    alert('请输入1~N的数字');");
		sb.append("    return;");
		sb.append("    }");
		sb.append("    gotoPage(page);");
		sb.append(" }");
		sb.append("</script>");
		return sb.toString();
	}
}

属性:

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

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="/xieminglu" 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"
		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>

5. 最后的页面展示结果

在这里插入图片描述
当我们再要对另一个数据进行分页时,我们便不再需要重新再写一个分页方法,这便是写通用分页的好处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值