通用分页二

目录

  • 前言
    • 思路步骤

前言

通用分页一已经把数据展示到页面上,并且能够按代码来规定查询多少条
对一些代码进行了封装,而分页二所做的则是针对于前台进行封装,到前台的界面显示。
点我跳转到通用分页一

思路步骤

1、 对PageBean增强(page、rows、总记录数,是否分页、上一次请求,添加初始化pagebean的方法、最大页、上一页、下一页方法)
通用分页二_第1张图片
PageBean实例类:

package com.houzhihong.paging.util;

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

import javax.servlet.http.HttpServlet;
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;//请求路径
	 //存储页面传的 参数
	 private Map<String, String[]> ParameterMap = new HashMap<String, String[]>();
	 
	 	//专门写一个方法,用来做pageBean的初始化
	 public void setRequest(HttpServletRequest request) {
		 // page  rows  pagination  公关参数  只能做分页
		 //从界面获取到分页的参数
		String page= request.getParameter("page");
		String rows= request.getParameter("rows");
		String pagination = request.getParameter("pagination");
		//给参数赋值
		 this.setPage(page);
		 this.setRows(rows);
		 this.setPagination(pagination);
		 //获取请求路径
		 this.url=request.getContextPath()+request.getServletPath();
		 //获取界面传递的参数
		 this.ParameterMap =request.getParameterMap();
		 
	 }
	 /**
	  * 上一页
	  * @return
	  */
	 public int getPreviousPage() {
		 int previousPage=this.page-1;
		 if(0 == previousPage) {
			 previousPage =1;
		 }
		 return previousPage;
	 }
	 
	 /**
	  * 下一页
	  * @return
	  */
	 public int getNextPage() {
		 int nextPage=this.page+1;
		 if(nextPage>getMaxPage()) {
			 nextPage=getMaxPage();
		 }
		 return nextPage;
	 }
	 
	 
	public int getPage() {
		return page;
	}

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

	public void setPage(String page) {
		if(null!=page && !"".equals(page.trim())){
			this.page =Integer.parseInt(page);
		}
	}
	
	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	public void setRows(String rows) {
		if(null!=rows && !"".equals(rows.trim())){
			this.rows =Integer.parseInt(rows);
		}
	}
	public int getTotal() {
		return total;
	}

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

	public boolean isPagination() {
		return pagination;
	}

	public void setPagination(boolean pagination) {
		this.pagination = pagination;
	}
	public void setPagination(String pagination) {
		if("false".equals(pagination)) {
			this.pagination = Boolean.parseBoolean(pagination);
		}
	}
		
	public PageBean() {
		super();
	}
	
	/**
	 * 获得启始记录的下标
	 * @return
	 */
	public  int getStartsIndex() {
		
		return (this.page-1)*this.rows;
	}
	/**
	 * 获取最大页数
	 * @return
	 */
	public int getMaxPage() {
		int maxPage =this.total/this.rows;
		if(0!=this.total%this.rows) {
			maxPage=maxPage+1;
		}
		return maxPage;
	}

	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) {
		ParameterMap = parameterMap;
	}


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

核心思想:

同样的核心思路是将上一次查询请求再发一次,只不过页码变了。

将查询参数保存到pagebean中Map paramMap 存储参数键值对

 //存储页面传的 参数
	 private Map<String, String[]> ParameterMap = new HashMap<String, String[]>();

2.完善servlet
注意:不能将分页表单嵌套到其它表单中,否则不能提交表单!!!
写一个servlet处理业务逻辑访问数据库和显示界面

package com.houzhihong.paging.action;

import java.io.IOException;
import java.util.Arrays;
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.mysql.fabric.xmlrpc.base.Array;
import com.houzhihong.paging.dao.StudentDao;
import com.houzhihong.paging.entity.Student;
import com.houzhihong.paging.util.PageBean;

public class StudentServlet  extends HttpServlet{
	private static final long serialVersionUID = -3873396407836776137L;

	@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 {
		//获取参数
		Student stu = new Student();
		StudentDao  studao = new StudentDao();
		stu.setSname(req.getParameter("sname"));
		
		//初始化分页
		PageBean pageBean = new PageBean();
		pageBean.setRequest(req);
		req.setAttribute("pageBean", pageBean);
		//后台分页查询
		List<Student> student= studao.find(stu,pageBean);
		req.setAttribute("student", student);
		//跳转界面
		req.getRequestDispatcher("/studentList.jsp").forward(req, resp);
		
		
	
		
		
	}
	
}

2.1配置好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>J2EE_09</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<!--配置处理字符编码的监听 -->
	<filter>

		<filter-name>EncodingFiter</filter-name>

		<filter-class>com.houzhihong.paging.util.EncodingFiter</filter-class>

	</filter>


	<filter-mapping>

		<filter-name>EncodingFiter</filter-name>

		<url-pattern>/*

	

	
	

		studentServlet

		com.houzhihong.paging.action.StudentServlet

	

	
	

		studentServlet

		/studentAction.action

	


3、 用自定义标签将按钮写入标签助手类 分页页码PageTag

sb.append("
\r\n" + " 当前第"+pageBean.getPage()+"页  共"+pageBean.getMaxPage()+"页  共"+pageBean.getTotal()+"条 \r\n" + " 首页 \r\n" + " 上一页 \r\n" + " 下一页 \r\n" + " 尾页\r\n" + " \r\n" + " GO\r\n" + "
"
);

4、 将对应的js代码写入标签助手类

sb.append("");

PageTag助手类:

package com.houzhihong.paging.tag;

import java.lang.reflect.InvocationTargetException;
import java.util.Map;

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

import com.houzhihong.paging.util.PageBean;

public class PageTag extends BodyTagSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1106459983373784935L;
	 private PageBean pageBean;
	public PageBean getPageBean() {
		return pageBean;
	}
	public void setPageBean(PageBean pageBean) {
		this.pageBean = pageBean;
	}
	@Override
	public int doStartTag() throws JspException {
			try {
				JspWriter out=	this.pageContext.getOut();
				out.println(toHtml());
				return SKIP_BODY;
				
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		
		
	}
	
	public String toHtml() throws IllegalAccessException,InvocationTargetException {
		StringBuffer sb = new StringBuffer();
		/**
		 * 判断防止pageBean空指针异常
		 */
		if(null==pageBean || !pageBean.isPagination()) {
			return sb.toString();
		}
		//分页按钮
			sb.append("
\r\n" + " 当前第"+pageBean.getPage()+"页  共"+pageBean.getMaxPage()+"页  共"+pageBean.getTotal()+"条 \r\n" + " 首页 \r\n" + " 上一页 \r\n" + " 下一页 \r\n" + " 尾页\r\n" + " \r\n" + " GO\r\n" + "
"
); //分页隐藏域表单 用来传递数据 sb.append("
"); sb.append(""); //map集合获取参数 Map<String, String[]> parameterMap=pageBean.getParameterMap(); //遍历集合 for(Map.Entry<String, String[]> entry : parameterMap.entrySet()) { String name= entry.getKey(); String[] value = entry.getValue(); if("page".equals(name)) {//上一次的页码抛掉 continue;//退出循环进入下一个循环 } //遍历数组 for(int i=0;i<value.length;i++) { sb.append(""); } } sb.append(""
); //动态拼接js sb.append(""); return sb.toString(); } }

5、配置好tld文件自定义标签库

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>Simple Tags</short-name>
	<!--标签地址  -->
	<uri>/houzhihong</uri>
	<!-- empty标签 -->
	<tag>
		<!-- 标签名 -->
		<name>page</name>
		<!-- 标签助手类 -->
		<tag-class>com.houzhihong.paging.tag.PageTag</tag-class>
		<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
		<body-content>empty</body-content>
		<!-- 标签属性 -->
		<attribute>
			<!-- 属性名 -->
			<name>pageBean</name>
			<!-- 属性是否为必填项 -->
			<required>true</required>
			<!-- 是否能接收表达式的值 -->
			<rtexprvalue>true</rtexprvalue>
			
		</attribute>
		
	
	</tag>

	
	
	
	
</taglib>

6.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="/houzhihong" %>
<!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>
 
 	<form  action="studentAction.action" method="post">
 		姓名:<input type="text" name="sname">
 		<input type="submit" value="查询">
 	</form>
 	<table border="1px" width="100%"> 
 		<tr>
 		 	<td>学号</td>
 		 	<td>姓名</td>
 		 	<td>年龄</td>
 		 	<td>备注</td>
 		 	<td>操作</td>
 		</tr>
 		<c:if test="${empty student }">
 		<jsp:forward page="studentAction.action"></jsp:forward>
 		</c:if>
 		<c:forEach items="${student}" var="s" >
 		<tr>
 		 	<td>${s.sid }</td>
 		 	<td>${s.sname }</td>
 		 	<td>${s.age }</td>
 		 	<td>${s.remartk }</td>
 		 	<td>操作</td>
 		</tr>
 		</c:forEach>
 	</table>
 	<z:page pageBean="${pageBean }"/>
 		
 
</body>
</html>

7、 测试通用分页显示效果
通用分页二_第2张图片

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