目录
一,分页的核心思想:
二,优势:
2.1 降低数据负荷:
2.2 提升用户体验:
2.3 管理复杂数据:
2.4 管理复杂数据:
三:PageBean的优化(分页工具类)
四,分页标签制作过程
五,模糊查询
将大量的数据或内容划分成多个页面,以便更好地管理和呈现。它可以应用于各种环境和场景,包括网页浏览器、文档处理软件、数据库查询,使用户在浏览或处理大量数据时更加方便和高效
2.1 降低数据负荷:
将大量数据分成多个页面,可以减少每个页面上要显示的数据量,从而减轻服务器和客户端的负荷。这样可以提高页面的加载速度和响应性能。
2.2 提升用户体验:
分页使得用户可以快速浏览和定位所需内容,而不必浏览整个数据集。用户可以根据自己的需求选择浏览哪些页面,从而提高浏览效率和准确性。
2.3 管理复杂数据:
对于包含大量复杂数据的应用程序或系统,分页可以帮助组织和管理数据,使其更易于理解和操作。用户可以将数据按照某种逻辑分组,将不同的数据分配到不同的页面中,从而提供更好的数据管理和导航方式。
2.4 管理复杂数据:
对于包含大量复杂数据的应用程序或系统,分页可以帮助组织和管理数据,使其更易于理解和操作。用户可以将数据按照某种逻辑分组,将不同的数据分配到不同的页面中,从而提供更好的数据管理和导航方式
将分页所需要的属性定义及一些的功能计算在里面进行一个封装
- 需要新增变量保存上一次查询条件
- 需要新增变量保存上一次请求地址
- 需要添加方法:获取最大页的页码
- 需要添加方法:获取上一页的页码
- 需要添加方法:获取下一页的页码
- 需要新增方法:初始化pagebean
- 在实现分页的操作下,跟着以下的图片结论走
PageBean的封装类代码:
最后定义一个封装方法将参数为HttpServletRequest req,将数据保存到此方法中以便Servlet中调用
package com.LiuBing.util;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.sun.xml.internal.ws.resources.HttpserverMessages;
/**
* 分页工具类
*
*/
public class PageBean {
private int page = 1;// 页码
private int rows = 10;// 页大小
private int total = 0;// 总记录数
private boolean pagination = true;// 是否分页
private String url;//通过新增变量保存上一次请求地址
private Map parameterMap= new HashMap();//通过新增变量保存上一次查询条件
//添加方法,获取最大页码
public int MaxPage() {
return this.total % this.rows ==0? this.total / this.rows : this.total / this.rows + 1;
}
//上一页页码
public int prevPage() {
return this.page>1?this.page-1:this.page;
}
//下一页页码
public int nextPage() {
return this.page getParameterMap() {
return parameterMap;
}
public void setParameterMap(Map parameterMap) {
this.parameterMap = parameterMap;
}
}
以上封装进行判断的时候StringUtils是另外一个类主要进行字符串判断直接调用里面的判断方法即可判断字符串(如下图代码)
package com.LiuBing.util;
public class StringUtils {
// 私有的构造方法,保护此类不能在外部实例化
private StringUtils() {
}
/**
* 如果字符串等于null或去空格后等于"",则返回true,否则返回false
*
* @param s
* @return
*/
public static boolean isBlank(String s) {
boolean b = false;
if (null == s || s.trim().equals("")) {
b = true;
}
return b;
}
/**
* 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
*
* @param s
* @return
*/
public static boolean isNotBlank(String s) {
return !isBlank(s);
}
}
Servlet(服务端)代码:
package com.LiuBing.text;
import java.io.IOException;
import java.util.List;
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.LiuBing.entity.Book;
import com.LiuBing.util.BookDao;
import com.LiuBing.util.PageBean;
/**
* Servlet implementation class BookServlet
*/
@WebServlet("/book.action")
public class BookServlet extends HttpServlet {
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 {
//获取前端name
// String bname = request.getParameter("bname");
// //map包含浏览器传递到后台所有参数键值对
// Map map = request.getParameterMap();
// //浏览器的请求地址
// String url =request.getRequestURL().toString();
//分页工具类
PageBean pagebean= new PageBean();
//调用分页工具类已封装好的分页数据
pagebean.setRequest(request);
//实例实体类
Book book = new Book();
//实例Dao方法 获取查询所有的方法
BookDao bookdao= new BookDao();
//获取实体类中name值 方便模糊查询用
book.setBname(request.getParameter("bname"));
try {
//将分页工具类和实体保存到集合中 但需要抛异常
List books = bookdao.List(book, pagebean);
//再将集合保存到域对象中 前端调用
request.setAttribute("books", books);
} catch (Exception e) {
e.printStackTrace();
}
//将PageBean保存到域对象中
request.setAttribute("pagebean", pagebean);
//转发到前端book.jsp中
request.getRequestDispatcher("book.jsp").forward(request, response);
}
}
最后在jsp前端运行需要自定义一个标签库来进行一个el表达式获取servlet服务器中的数据,在自定义一个标签库前是需要继承一个标签助手类的(如下继承助手类和自定义标签库代码)代码后面附带着拼接分页显示效果代码
package com.LiuBing.Tag;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import com.LiuBing.util.PageBean;
/**
* @author 小耗子
* @site www.LiuBing.com
*/
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("");
int page = pageBean.getPage();
int max = pageBean.MaxPage();
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("");
sb.append("- 首页
");
sb.append("- <
");
// 代表了当前页的前4页
for (int i = before; i > 0 ; i--) {
sb.append("- "+(page-i)+"
");
}
sb.append("- "+pageBean.getPage()+"
");
// 代表了当前页的后5页
for (int i = 1; i <= after; i++) {
sb.append("- "+(page+i)+"
");
}
sb.append("- >
");
sb.append("- 尾页
");
sb.append("- 到第页
");
sb.append("- 确定
");
sb.append("- 共"+pageBean.getTotal()+"条
");
sb.append("
");
// 拼接分页的js代码
sb.append("");
return sb.toString();
}
}
自定义标签库代码:
JSTL 1.1 core library
JSTL core
1.1
z
http://PageTag
PageTag
com.LiuBing.Tag.PageTag
JSP
pageBean
true
true
进行一个jsp页面代码:
注:进行一个引入自定义标签库<%@ taglib prefix="z" uri="http://PageTag"%>,再进行一个引用同过el表达式获取servlet中数据
<%@ 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="http://PageTag"%>
书籍列表
书籍ID
书籍名
价格
${book.bid }
${book.bname }
${book.price }
在分页工具类中通过参数值HttpServletRequest获取name值,再servlet中通过实列实体获取name值一起保存到域对象中,在前端输入框from表单中修改成servlet地址即可
注意:实现模糊查询需要防止中文乱码情况(导入过滤器即可)
代码展示:
以下注意:@WebFilter("*.action")。@WebFilter是代表对Web内容进行过滤和控制访问,扩号中(*代表标记,.action是Servlet中路径后缀名)
package com.LiuBing.util;
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();
}
}
}
模糊查询运行结果: