签在我们数据量多的时候我们通常都会使用分页表格来显示数据,但分页着个内容有很多,每一个页面的分页表格都需要重新写,代码的重复率太高,所以我们采用标签来就简化我们的代码,今天我们就来自定义 我们自己的通用分页标
步骤:
PageBean
-
- import java.util.Map;
-
- import javax.servlet.http.HttpServletRequest;
-
- import com.mysql.jdbc.StringUtils;
-
- public class PageBean {
- /**
- * 页码
- */
- private int page = 1;
-
- /**
- * 每页显示的记录数
- */
- private int rows = 10;
-
- /**
- * 总记录数
- */
- private int total = 0;
-
- /**
- * 是否分页
- */
- private boolean pagination = true;
-
- /**
- * 记录查询的url,以便于点击分页时再次使用
- */
- private String url;
-
- /**
- * 存放请求参数,用于生成隐藏域中的元素
- */
- private Map
parameterMap; -
- /**
- * 根据传入的Request初始化分页对象
- *
- * @param request
- */
- public void setRequest(HttpServletRequest request) {
-
- if (!StringUtils.isNullOrEmpty(request.getParameter("page"))) {
- this.page = Integer.valueOf(request.getParameter("page"));
- }
- if (!StringUtils.isNullOrEmpty(request.getParameter("rows"))) {
- this.rows = Integer.valueOf(request.getParameter("rows"));
- }
- if (!StringUtils.isNullOrEmpty(request.getParameter("pagination"))) {
- this.pagination = Boolean.valueOf(request.getParameter("pagination"));
- }
-
- // 通过键值对把所有的参数全部保存起来
- this.url = request.getRequestURI();
- this.parameterMap = request.getParameterMap();
- // 把this放到页面中去便于使用
- request.setAttribute("pageBean", this);
- }
-
- public int getPage() {
- return page;
- }
-
- public void setPage(int page) {
- this.page = page;
- }
-
- public int getRows() {
- return rows;
- }
-
- public void setRows(int rows) {
- this.rows = 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 String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public Map
getParameterMap() { - return parameterMap;
- }
-
- public void setParameterMap(Map
parameterMap) { - this.parameterMap = parameterMap;
- }
-
- // 计算起始页码
- public int getStartIndex() {
- return (this.page - 1) * this.rows;
- }
-
- // 获取总页数
- public int getTotalPage() {
- if (this.getTotal() % this.rows == 0) {
- return this.getTotal() / this.rows;
- } else {
- return this.getTotal() / this.rows + 1;
- }
- }
-
- // 上一页
- public int getPreviousPage() {
- return this.page - 1 > 0 ? this.page - 1 : 1;
- }
-
- // 下一页
- public int getNextPage() {
- return this.page + 1 > getTotalPage() ? getTotalPage() : this.page + 1;
- }
-
- }
BaseDao
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.List;
-
- public final class BaseDao {
-
- public BaseDao() {
- }
-
- // 回调函数
- public static interface ICovent
{ - List
convent(ResultSet rs) throws SQLException; - }
-
- public static
List query(String sql, Object[] params, PageBean pagebean, ICovent covent) { -
- List
students = new ArrayList(); -
- // 不变部分
- Connection con = null;
- PreparedStatement ps = null;
- ResultSet rs = null;
-
- if (pagebean == null || !pagebean.isPagination()) {
-
- try {
- con = DBUtil.getConection();
- ps = con.prepareStatement(sql);
-
- // 设置查询参数
- int i = 1;
- for (Object param : params) {
- ps.setObject(i, param);
- i++;
- }
- rs = ps.executeQuery();
- // 通过使用者调用回调函数,执行转换
- students = covent.convent(rs);
-
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- DBUtil.closeDB(rs, ps, con);
- }
-
- } else {
- try {
- String countsql = "select count(*) from (" + sql + ") emp";
- con = DBUtil.getConection();
- ps = con.prepareStatement(countsql);
- // 设置查询参数
- int i = 1;
- for (Object param : params) {
- ps.setObject(i, param);
- i++;
- }
- rs = ps.executeQuery();
- if (rs.next()) {
- pagebean.setTotal(rs.getInt(1));
- }
- // 判断总记录数是否大于0,大于则有数据,然后查询当前记录数(分页数据)
- // 如果没有直接返回
- if (pagebean.getTotal() == 0) {
- return students;
- }
- String pagesql = sql + "limit " + pagebean.getStartIndex() + "," + pagebean.getRows();
-
- con = DBUtil.getConection();
- ps = con.prepareStatement(pagesql);
- // 设置查询参数
- int f = 1;
- for (Object param : params) {
- ps.setObject(f, param);
- f++;
- }
- rs = ps.executeQuery();
- //
- students = covent.convent(rs);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return students;
- }
-
- }
- import java.io.IOException;
- import java.util.Map;
-
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.BodyTagSupport;
-
- import com.zking.mvc.util.PageBean;
-
- public class PagingTag 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 = this.pageContext.getOut();
-
- try {
- out.print(buildHtml());
- return SKIP_BODY;
- } catch (IOException e) {
- throw new JspException("分页标签异常" + e);
- }
- }
-
- // 构建分页的面板内容
- private String buildHtml() {
- //构建分页页面元素
- String pagingTag="\r\n"
- + " 第"+pageBean.getPage()+"页 \r\n"
- + " href=\"javascript: goPage("+pageBean.getPreviousPage()+");\">上一页 \r\n"
- + " +pageBean.getNextPage()+");\">下一页 \r\n"
- + " +pageBean.getTotalPage()+");\">尾页 \r\n"
- + " 第
- + " href=\"javascript: goPage(document.getElementById('pagingPageNum').value)\">GO\r\n"
- + " ";
-
- String ycform="
- + "";
-
- Map
parameterMap = pageBean.getParameterMap(); - for (Map.Entry
param : parameterMap.entrySet()) { - String pageName=param.getKey();
- if("page".equals(pageName)) continue;
- String[] values = param.getValue();
- for(String val: values) {
- ycform += "";
- }
- }
- ycform += "";
-
- String script="";
-
- return pagingTag+ycform+script;
- }
- }
准备一个servlet用于处理请求,获取数据库中的数据,并转发到结果显示页面。
- package com.zking.mvc.dao;
-
- 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.zking.mvc.dome.Student;
- import com.zking.mvc.util.PageBean;
- import com.zking.mvc.util.StudentDao;
-
- @WebServlet("/students")
- public class StudetnServlet extends HttpServlet {
-
- private StudentDao studao = new StudentDao();
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doPost(req, resp);
-
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- PageBean pagebean = new PageBean();
- pagebean.setRequest(req);
-
- String sname = req.getParameter("sname");
- List
students = studao.getStudents02(sname, pagebean); - req.setAttribute("students", students);
- req.getRequestDispatcher("/students.jsp").forward(req, resp);
- }
-
- }
- 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.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- 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();
- }
- }
- }

我写的是以students学生来当实体的,所以在封装的时候是以学生一些属性啊等等命名的 ,你可以自己看自己来就是。上面的servlet也是使用的学生来的,下面就让我们按学生来完成实例。
- public List
getStudents02(String sname, PageBean pagebean) { -
- // 构造sql语句 变化部分
- String sql = "select * from Student t ";
- List
- if (!Objects.isNull(sname) && sname.length() > 0) {
- sql += " where t.sname like ?";
- prame.add(sname+"%");
- }
- List
list = BaseDao.query(sql, prame.toArray(), pagebean, new ICovent() { - public List
convent(ResultSet rs) throws SQLException { - List
students = new ArrayList(); - while (rs.next()) {
- Student stu = new Student();
- stu.setSid(rs.getInt("sid"));
- stu.setSname(rs.getString("sname"));
- stu.setSex(rs.getString("sex"));
- stu.setSage(rs.getInt("sage"));
- stu.setSclass(rs.getString("sclass"));
- students.add(stu);
- }
- return students;
- }
- });
- return list;
- }
下面我们只需要在我们的页面引入我们的标签库就行了。
使用分页标签
首先在页面中引入标签
<%@taglib prefix="z" uri="/zking" %>
将原来的分页功能,替换为标签即可
<z:paging pageBean="${pageBean}"/>
通用分页需要的是通用,着需要将其进行一个差分封装,但在我们还不熟悉的时候我们在编写代码时应该先不考虑封装,先将分页写出来,然后提取公共构造,封装继承。通用分页步骤就是先分析分页条属性,然后封装属性实体,然后编写dao层方法提取公共部分,然后编写助手类,为了避免出现乱码问题,在编写一个字符过滤器,过滤所有请求,然后就开始配置过滤器,在xml中配置在第一位,然后在标签库描述文件中添加分页标签,然后就可以按自己需求来使用了。全球其实通用分页的思想就是将能提取的部分给提取出来然后拼接,辛苦现在,幸福以后。