目录
一、PageBean分页封装类
首先我们得明确前端分页我们需要如何实现,以下是我实现前端分页的思路和方法
1.需要新增变量保存上一次的请求地址
2.需要拿到第一次查询的条件
//需要新增变量保存上一次的请求地址
private String Url ;
//需要新增变量保存上一次的查询条件
private Map<String, String[]> parameterMap = new HashMap<String, String[]>();
思路:因为我们可能拿到的是多个条件的值,所以返回的是一个字符串数组,同时用Map集合进行存储
3.需要添加方法,获取最大页的页码:看不懂可以看注释
public int MaxPage() {
//将总数据数除以总行数 如果等于0说明能除尽就拿到这个值,
//如果不能除尽就在这值的基础上加1
return this.total%this.rows==0?
this.total/this.rows:
this.total/this.rows+1;
}
4.需要添加方法,获取下一页的页码:看不懂可以看注释
public int nextPage() {
//如果当前页数小于最大页数说明还有下一页的值,就+1代表下一页,
//如果大于最大页就停留在当前页
return this.page<this.MaxPage()?this.page+1:this.page;
}
5.需要添加方法,获取上一页的页码:看不懂可以看注释
public int previousPage() {
//如果当前页数大于1说明还有上一页的值,就-1代表上一页
//如果小于1就停留在当前页
return this.page>1?this.page-1:this.page;
}
同时我们在分页的封装类定义一个存值的方法,将分页所需要的五个变量或者方法(页码page、rows页大小、是否分页pagination、地址Url、查询条件ParameterMap)进行存储,然后再Servlet中直接调用这个方法就可以了
public void setRequest(HttpServletRequest request) {
this.setPage(request.getParameter("page"));
this.setRows(request.getParameter("rows"));
this.setPagination(request.getParameter("pagination"));
this.setUrl(request.getRequestURL().toString());
this.setParameterMap(request.getParameterMap());
}
private void setPagination(String pagination) {
if(StringUtils.isNotBlank("pagination")) {
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))
//set自动生成的方法
this.setPage(Integer.valueOf(page));
}
二、PageTag分页标签
我们运用之前所分享的自定义jsp标签的知识来自定义一个Page标签,PageTag继承 BodyTagSupport类,用stringbuffer中的append方法来实现页面展示效果。最后我们只要在jsp页面引用PageTag标签就可以了
package com.dgl.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.dgl.util.PageBean;
public class PageTag extends BodyTagSupport{
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 (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' value=''>");
Map<String, String[]> parameterMap = pageBean.getParameterMap();
if(parameterMap != null && parameterMap.size() > 0) {
Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();
for (Entry<String, String[]> entry : entrySet) {
String key = entry.getKey();// name/likes/page/rows
String[] values = entry.getValue();
if(!"page".equals(key)) {
for (String value : values) {
sb.append(" <input type='hidden' name='"+key+"' value='"+value+"'>");
}
}
}
}
sb.append("</form>");
// 分页条
sb.append("<ul class='pagination justify-content-center'>");
sb.append(" <li class='page-item "+(pageBean.getPage() == 1 ? "disabled" : "")+"'><a class='page-link'");
sb.append(" href='javascript:gotoPage(1)'>首页</a></li>");
sb.append(" <li class='page-item "+(pageBean.getPage() == 1 ? "disabled" : "")+"'><a class='page-link'");
sb.append(" href='javascript:gotoPage("+pageBean.previousPage()+")'><</a></li>");
sb.append(" <li class='page-item active'><a class='page-link' href='#'>"+pageBean.getPage()+"</a></li>");
sb.append(" <li class='page-item "+(pageBean.getPage() == pageBean.MaxPage() ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.nextPage()+")'>></a></li>");
sb.append(" <li class='page-item "+(pageBean.getPage() == pageBean.MaxPage() ? "disabled" : "")+"'><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'");
sb.append(" type='text' id='skipPage' name='' /><b>页</b></li>");
sb.append(" <li class='page-item go'><a class='page-link'");
sb.append(" href='javascript:skipPage()'>确定</a></li>");
sb.append(" <li class='page-item'><b>共"+pageBean.getTotal()+"条</b></li>");
sb.append("</ul>");
// 分页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");
sb.append(" || 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();
}
}
要记得在标签库中定义该标签哦!
三、Jsp界面
我们在Servlet中要调用我们分页的方法以及用 request.setAttribute存值并转发到jsp界面 Servlet中的代码:
PageBean pageBean = new PageBean();
pageBean.setRequest(request);
request.setAttribute("pageBean", pageBean);
request.getRequestDispatcher("BookList.jsp").forward(request, response);
界面引用:
<z:Page pageBean="${PageBean}"></z:Page>