
一.理解分页思想
1.分页的实质
1.1(自我概述)
1.2(专业术语)
二.优化pageBean
1.添加一部分分页需要类
public String getUrl() {
return url;
}
/**
* @param url the url to set
*/
public void setUrl(String url) {
this.url = url;
}
/**
* @return the paramMap
*/
public Map<String, String[]> getParamMap() {
return paramMap;
}
/**
* @param paramMap the paramMap to set
*/
public void setParamMap(Map<String, String[]> paramMap) {
this.paramMap = paramMap;
}
// 对pagebean进行初始化
public void setRequest(HttpServletRequest req) {
// 初始化默认查询第几页数据
this.setPage(req.getParameter("page"));
// 初始化的页大小
this.setRows(req.getParameter("rows"));
// 初始化是否分页
this.setPagination(req.getParameter("pagination"));
// 保留上一次url的查询请求
this.setUrl(req.getRequestURL().toString());
// 保留上一次的查询条件
this.setParameterMap(req.getParameterMap());
}
public void setParameterMap(Map<String, String[]>paramMap) {
this.paramMap = paramMap;
}
private void setPagination(String pagination) {
// 只有填写了false字符串,才代表不分页
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))
this.setPage(Integer.valueOf(page));
}
// 上一页
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;
}
private String url;
private Map<String, String[]>paramMap;
三.分页自定义jsp标签
1为什么要使用自定义分页jsp标签?
1.1自我理解
1.2专业术语
2.实现自定义分页标签
1.首先建立连接类
package com.lz.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.JspTag;
import com.lz.utils.PageBean;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
/**
*
* @author lzzxq
*
*/
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 (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
private String toHTML() {
StringBuilder sb = new StringBuilder();
// 这里拼接的是一个上一次发送的请求以及携带的参数,唯一改变的就是页码
sb.append("<form id='pageBeanForm' action='" + pageBean.getUrl() + "' method='post'>");
sb.append("<input type='hidden' name='methodName' value='list'>");
sb.append("<input type='hidden' name='page'>");
// 重要设置拼接操作,将上一次请求参数携带到下一次
Map<String, String[]> paMap = pageBean.getParamMap();
if (paMap != null && paMap.size() > 0) {
Set<Map.Entry<String, String[]>> entrySet = paMap.entrySet();
for (Map.Entry<String, String[]> entry : entrySet) {
for (String val : entry.getValue()) {
if (!"page".equals(entry.getKey())) {
sb.append("<input type='hidden' name='" + entry.getKey() + "' value='" + val + "'>");
}
}
}
}
sb.append("</form>");
int page = pageBean.getPage();
int max = pageBean.getMaxPage();
int before = page > 4 ? 4 : page - 1;
int after = 10 - 1 - before;
after = page + after > max ? max - page : after;
// disabled
boolean startFlag = page == 1;
boolean endFlag = max == page;
// 拼接分页条
sb.append("<ul class='pagination'>");
sb.append("<li class='page-item " + (startFlag ? "disabled" : "")
+ "'><a class='page-link' href='javascript:gotoPage(1)'>首页</a></li>");
sb.append("<li class='page-item " + (startFlag ? "disabled" : "")
+ "'><a class='page-link' href='javascript:gotoPage(" + pageBean.getPrevPage() + ")'><</a></li>");
// 代表了当前页的前4页
for (int i = before; i > 0; i--) {
sb.append("<li class='page-item'><a class='page-link' href='javascript:gotoPage(" + (page - i) + ")'>"
+ (page - i) + "</a></li>");
}
sb.append("<li class='page-item active'><a class='page-link' href='javascript:gotoPage(" + pageBean.getPage()
+ ")'>" + pageBean.getPage() + "</a></li>");
// 代表了当前页的后5页
for (int i = 1; i <= after; i++) {
sb.append("<li class='page-item'><a class='page-link' href='javascript:gotoPage(" + (page + i) + ")'>"
+ (page + i) + "</a></li>");
}
sb.append("<li class='page-item " + (endFlag ? "disabled" : "")
+ "'><a class='page-link' href='javascript:gotoPage(" + pageBean.getNextPage() + ")'>></a></li>");
sb.append("<li class='page-item " + (endFlag ? "disabled" : "")
+ "'><a class='page-link' href='javascript:gotoPage(" + pageBean.getMaxPage() + ")'>尾页</a></li>");
sb.append(
"<li class='page-item go-input'><b>到第</b><input class='page-link' type='text' id='skipPage' name='' /><b>页</b></li>");
sb.append("<li class='page-item go'><a class='page-link' 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 || parseInt(page) > " + max + ") {");
sb.append("alert('请输入1~N的数字');");
sb.append("return;");
sb.append("}");
sb.append("gotoPage(page);");
sb.append("}");
sb.append("</script>");
return sb.toString();
}
}
2.建立tid
<!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>/lz</uri>
<tag>
<name>page</name>
<tag-class>com.lz.tag.PageTag</tag-class>
<!--该标签有标签体-->
<body-content>jsp</body-content>
<attribute>
<name>pageBean</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3.导入jsp即可
<%@taglib prefix="z" uri="/lz"%>
3.servelt编写,过滤器
1.servelt代码实现
package com.lz.servelt;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lz.dao.BookDao;
import com.lz.entity.Book;
import com.lz.utils.PageBean;
@WebServlet("/book.action")
public class BookServelt extends HttpServlet {
private static final String UNUSED = "unused";
/**
*
*/
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@SuppressWarnings(UNUSED)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PageBean pageBean=new PageBean();
pageBean.setRequest(request);
BookDao bd=new BookDao();
Book bk=new Book();
bk.setBname(request.getParameter("bname"));
try {
List<Book>book= bd.list(bk, pageBean);
// System.out.println(book);
request.setAttribute("book",book);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
request.setAttribute("pageBean",pageBean);
request.getRequestDispatcher("bookList.jsp").forward(request, response);
}
}
2.处理乱码
package com.lz.utils;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("*.action")
public class EncodingFiter implements Filter {
private String encoding = "UTF-8";// 默认字符集
public EncodingFiter() {
super();
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// 中文处理必须放到 chain.doFilter(request, response)方法前面
res.setContentType("text/html;charset=" + this.encoding);
if (req.getMethod().equalsIgnoreCase("post")) {
req.setCharacterEncoding(this.encoding);
} else {
Map map = req.getParameterMap();// 保存所有参数名=参数值(数组)的Map集合
Set set = map.keySet();// 取出所有参数名
Iterator it = set.iterator();
while (it.hasNext()) {
String name = (String) it.next();
String[] values = (String[]) map.get(name);// 取出参数值[注:参数值为一个数组]
for (int i = 0; i < values.length; i++) {
values[i] = new String(values[i].getBytes("ISO-8859-1"),
this.encoding);
}
}
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
String s = filterConfig.getInitParameter("encoding");// 读取web.xml文件中配置的字符集
if (null != s && !s.trim().equals("")) {
this.encoding = s.trim();
}
}
}
3.最终效果图:

四.debug使用
1.什么是debug?
2.怎么使用?