通用分页一已经把数据展示到页面上,并且能够按代码来规定查询多少条
对一些代码进行了封装,而分页二所做的则是针对于前台进行封装,到前台的界面显示。
点我跳转到通用分页一
1、 对PageBean
增强(page、rows、总记录数,是否分页、上一次请求,添加初始化pagebean的方法、最大页、上一页、下一页方法)
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("");
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("");
//分页隐藏域表单 用来传递数据
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>