手写简单的web分页功能(非插件)

1.建立一个简单的数据库

手写简单的web分页功能(非插件)

sql脚本

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for tbluser
-- ----------------------------
DROP TABLE IF EXISTS `tbluser`;
CREATE TABLE `tbluser` (
  `username` varchar(255) DEFAULT NULL,
  `userpass` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.新建一个web项目

手写简单的web分页功能(非插件)

3.新建一个实体类

package entity;

public class TblUser {
    private String username;
    private String userpass;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpass() {
        return userpass;
    }

    public void setUserpass(String userpass) {
        this.userpass = userpass;
    }

    @Override
    public String toString() {
        return "TblUser{" +
                "username='" + username + '\'' +
                ", userpass='" + userpass + '\'' +
                '}';
    }
}

4.新建一个pageUtil工具类

package util;

import java.io.Serializable;
import java.util.List;


/**
 *
 * <b> 分页通用类 </b>
 *
 * @author kangxu
 * @param <T>
 *
 */
public class PageUtil<T> implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 4542617637761955078L;

    /**
     * currentPage 当前页
     */
    private int currentPage = 1;
    /**
     * pageSize 每页大小
     */
    private int pageSize = 10;
    /**
     * pageTotal 总页数
     */
    private int pageTotal;
    /**
     * recordTotal 总条数
     */
    private int recordTotal = 0;
    /**
     * previousPage 前一页
     */
    private int previousPage;
    /**
     * nextPage 下一页
     */
    private int nextPage;
    /**
     * firstPage 第一页
     */
    private int firstPage = 1;
    /**
     * lastPage 最后一页
     */
    private int lastPage;
    /**
     * content 每页的内容
     */
    private List<T> content;

    // 以下set方式是需要赋值的
    /**
     * 设置当前页 <br>
     *
     * @author kangxu
     *
     * @param currentPage
     */
    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    /**
     * 设置每页大小,也可以不用赋值,默认大小为10条 <br>
     *
     * @author kangxu
     *
     * @param pageSize
     */
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 设置总条数,默认为0 <br>
     *
     * @author kangxu
     *
     * @param recordTotal
     */
    public void setRecordTotal(int recordTotal) {
        this.recordTotal = recordTotal;
        otherAttr();
    }

    /**
     * 设置分页内容 <br>
     *
     * @author kangxu
     *
     * @param content
     */
    public void setContent(List<T> content) {
        this.content = content;
    }

    /**
     * 设置其他参数
     *
     * @author kangxu
     *
     */
    public void otherAttr() {
        // 总页数
        this.pageTotal = this.recordTotal % this.pageSize > 0 ? this.recordTotal / this.pageSize + 1 : this.recordTotal / this.pageSize;
        // 第一页
        this.firstPage = 1;
        // 最后一页
        this.lastPage = this.pageTotal;
        // 前一页
        if (this.currentPage > 1) {
            this.previousPage = this.currentPage - 1;
        } else {
            this.previousPage = this.firstPage;
        }
        // 下一页
        if (this.currentPage < this.lastPage) {
            this.nextPage = this.currentPage + 1;
        } else {
            this.nextPage = this.lastPage;
        }
    }

    // 放开私有属性
    public int getCurrentPage() {
        return currentPage;
    }

    public int getPageSize() {
        return pageSize;
    }

    public int getPageTotal() {
        return pageTotal;
    }

    public int getRecordTotal() {
        return recordTotal;
    }

    public int getPreviousPage() {
        return previousPage;
    }

    public int getNextPage() {
        return nextPage;
    }

    public int getFirstPage() {
        return firstPage;
    }

    public int getLastPage() {
        return lastPage;
    }

    public List<T> getContent() {
        return content;
    }

    @Override
    public String toString() {

        return "Pager [" +
                "currentPage:当前页=" + currentPage + "," +
                " pageSize:每页大小=" + pageSize + ", " +
                "pageTotal:总页数=" + pageTotal + ", " +
                "recordTotal:总条数=" + recordTotal + ", " +
                "previousPage:前一页=" + previousPage + ", " +
                "nextPage:下一页=" + nextPage + ", " +
                "firstPage:第一页=" + firstPage + "," +
                " lastPage:最后一页=" + lastPage + ", " +
                "content:每页的内容=" + content + 
                "]";
    }


  
}

5.导入相关依赖包,mysql驱动,jstl

手写简单的web分页功能(非插件)

6.手写一个简单的封装basedao访问数据库操作

package dao;


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class BaseDao {
	private static String driver="com.mysql.cj.jdbc.Driver";
	private static String url="jdbc:mysql://cainiaozhengke.top:3306/springboot01?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC";
	private static String username="root";
	private static String password="root";
	Connection conn = null;
	PreparedStatement pst = null;
	ResultSet rs = null;


	/*
	 * 获取连接方法
	 */
	public Connection getConnection() {
		try {
			// 1.先加载驱动
			Class.forName(driver);
			if (conn == null) {
				conn = DriverManager.getConnection(url, username, password);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	// 执行查询操作
	public ResultSet select(String sql, Object... params) {
		System.out.println("--->" + sql);
		System.out.println("--->params" + Arrays.toString(params));
		conn = getConnection();
		try {
			pst = conn.prepareStatement(sql);
			if (params != null) {
				for (int i = 0; i < params.length; i++) {
					pst.setObject(i + 1, params[i]);
				}
			}
			rs = pst.executeQuery();
			return rs;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	/*
	 * 将结果集放到list集合中
	 */
	public <T> List<T> query(String sql,Class<T> cls,Object... params){
		rs=select(sql, params);
		List<T> list = new ArrayList<T>();
		//使用反射技术,动态封装
		ResultSetMetaData rsmd;
		try {
			rsmd = rs.getMetaData();
		//取出列数
		int columnCount = rsmd.getColumnCount();
		while(rs.next()) {
			//实例化对象,cls为类对象
			T t=(T)cls.newInstance();
			//根据列数循环 取出每一列的列名
			//System.out.println(columnCount);
			for (int i = 0; i < columnCount; i++) {
				//获取列名
				String colsName = rsmd.getColumnLabel(i+1);
				//当前列的值
				Object colsValue = rs.getObject(colsName);
				//获取属性
				Field field = t.getClass().getDeclaredField(colsName);
				//set方法名
				String setName="set"+colsName.substring(0, 1).toUpperCase()+colsName.substring(1);
				//System.out.println("+++++++"+field.getType());
				//确定set方法,需要知道方法名以及类型
				Method setMethod = t.getClass().getDeclaredMethod(setName, field.getType());
				System.out.println(colsName+"==========="+colsValue);
				//执行setter方法,给属性赋值
				setMethod.invoke(t, colsValue);
			}
			//把封装的对象放入list
			list.add(t);
		}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/*
	 * 关闭操作
	 */
	public void close() {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (pst != null) {
			try {
				pst.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

7.创建userdao操作user的jdbc的访问

package dao;

import entity.TblUser;
import util.PageUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public class UserDao extends BaseDao {
	/**
	 * 执行查询操作
	 * @param CurrentPage 当前页
	 * @param pageSize 每页大小
	 * @return
	 */
	private List<TblUser> queryAll(int CurrentPage,int pageSize){
		String sql = "select * from tbluser limit ?,?";
		//limit ?,? 第一个?是指第条数据(下标从0开始),第一个?是指每页显示多少条数据
		// 比如:limit 0,5 第一页数据
		// limit 5,5 第二页数据,需要计算第二页的开始下标(CurrentPage-1)*pageSize
		return super.query(sql, TblUser.class,(CurrentPage-1)*pageSize,pageSize);
	}

	/**
	 * 统计数据总数
	 * @return
	 */
	private int getCount(){
		int count=0;
		String sql = "select (1) from tbluser";
		ResultSet resultSet = super.select(sql);
		try {
			//结果集遍历一次,总数加一
			while (resultSet.next()){
				count++;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return count;
	}

	/**
	 * 分页查询数据
	 * @param CurrentPage 当前页
	 * @param pageSize 每页大小
	 * @return 携带分页的数据及实体结果集
	 */
	public PageUtil queryPageUser(int CurrentPage,int pageSize){
		PageUtil pageUtil = new PageUtil();
		//PageUtil对象中设置当前页、每页大小
		pageUtil.setCurrentPage(CurrentPage);
		pageUtil.setPageSize(pageSize);
		//获取数据总数,并设置总数
		int count = this.getCount();
		pageUtil.setRecordTotal(count);
		//获取数据结果集,并设置结果集
		List<TblUser> tblUsers = this.queryAll(CurrentPage,pageSize);
		pageUtil.setContent(tblUsers);
		//返回携带分页的数据及实体结果集
		return pageUtil;
	}

	//测试
//	public static void main(String[] args){
//		UserDao userDao = new UserDao();
//		PageUtil pageUtil = userDao.queryPageUser(1, 3);
//		System.out.println(pageUtil);
//
//	}
}

8.新建控制层servlet

package servlet;

import dao.UserDao;
import util.PageUtil;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.IOException;

@WebServlet("/user" )
public class UserServlet extends HttpServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //当前页
        String currentPage = request.getParameter("currentPage");
        //每页大小
        String pageSize = request.getParameter("pageSize");
        //设置默认值
        int i=1;
        int j=5;
        //防止第一次访问没人传入的数据,出现空指针异常
        if (currentPage!=null && pageSize!=null){
            i = Integer.parseInt(currentPage);
            j = Integer.parseInt(pageSize);
        }
        System.out.println("i"+"====="+j);
        UserDao userDao = new UserDao();
        PageUtil pageUtil = userDao.queryPageUser(i, j);
        request.setAttribute("pageUtil",pageUtil);
        request.getRequestDispatcher("/page.jsp").forward(request,response);
    }
}

9.新建index.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/3/29/029
  Time: 15:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <a href="user">分页查询</a>
  </body>
</html>

10.新建page.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/3/29/029
  Time: 17:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>分页</title>
</head>
<body>
<table align="center" border="1px">
    <tr>
        <th>用户名</th>
        <th>密码</th>
    </tr>
    <%--
        要遍历的是pageUtil对象的List集合
    --%>
    <c:forEach items="${pageUtil.content}" var="user">
        <tr>
            <td>${user.username }</td>
            <td>${user.userpass }</td>
        </tr>
    </c:forEach>

</table>
<%--
    给出分页相关的链接
    Pager [
    currentPage:当前页=1,
    pageSize:每页大小=3,
    pageTotal:总页数=5,
    recordTotal:总条数=15,
    previousPage:前一页=1,
    nextPage:下一页=2,
    firstPage:第一页=1,
    lastPage:最后一页=5,
    content:每页的内容=[TblUser{username='zhengke', userpass='zhengke'}, TblUser{username='123', userpass='123'}, TblUser{username='123456', userpass='1234567890'}]]
    pageUtil
--%>
<center>
    <a href="user?pageSize=${pageUtil.pageSize}&currentPage=1" >首页</a>
    <c:if test="${pageUtil.currentPage > 1 }">
        <a href="user?pageSize=${pageUtil.pageSize}&currentPage=${pageUtil.currentPage-1 }" >上一页</a>
    </c:if>

    <%-- 分页页码列表 --%>

    <%-- 计算begin和end --%>
    <c:choose>
        <%-- 当总页数小于10,那么就把所有的页数都显示出来 --%>
        <c:when test="${pageUtil.pageTotal <= 10 }">
            <c:set var="begin" value="1" />
            <c:set var="end" value="${pageUtil.pageTotal}" />
        </c:when>

        <%-- 当总页数 >= 10 --%>
        <c:when test="${pageUtil.pageTotal > 10 }">
            <c:set var="begin" value="${pageUtil.pageTotal - 5 }" />
            <c:set var="end" value="${pageUtil.pageTotal + 4 }" />

            <%-- begin溢出 --%>
            <c:if test="${begin < 1 }">
                <c:set var="begin" value="1" />
                <%-- 因为begin已经溢出,所以表示总页数不足10页 --%>
                <c:set var="end" value="${pageUtil.pageTotal }" />
            </c:if>

            <%-- end溢出 --%>
            <c:if test="${end > pageUtil.pageTotal }">
                <%-- 因为end溢出,所以begin = end - 9 --%>
                <c:set var="begin" value="${pageUtil.pageTotal - 9 }" />
                <c:set var="end" value="${pageUtil.pageTotal }" />
            </c:if>
        </c:when>
    </c:choose>

    <%-- 循环显示页码列表 --%>
    <c:forEach var="i" begin="${begin }" end="${end }">
        <c:choose>
            <%-- 当前页码与页码列表相同时,输出简单文本 --%>
            <c:when test="${pageUtil.currentPage eq i }">
                [${i }]
            </c:when>
            <c:otherwise>
                <a href="user?pageSize=${pageUtil.pageSize}&currentPage=${i }">${i }</a>
            </c:otherwise>
        </c:choose>
    </c:forEach>


    <c:if test="${pageUtil.currentPage < pageUtil.pageTotal }">
        <a href="user?pageSize=${pageUtil.pageSize}&currentPage=${pageUtil.currentPage+1 }" >下一页</a>
    </c:if>

    <a href="user?pageSize=${pageUtil.pageSize}&currentPage=${pageUtil.lastPage }" >尾页</a>
    第${pageUtil.currentPage}页/共${pageUtil.lastPage}页

</center>
</body>
</html>

11.测试结果

手写简单的web分页功能(非插件)