手写简单的web分页功能(非插件)
1.建立一个简单的数据库
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项目
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
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}¤tPage=1" >首页</a>
<c:if test="${pageUtil.currentPage > 1 }">
<a href="user?pageSize=${pageUtil.pageSize}¤tPage=${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}¤tPage=${i }">${i }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${pageUtil.currentPage < pageUtil.pageTotal }">
<a href="user?pageSize=${pageUtil.pageSize}¤tPage=${pageUtil.currentPage+1 }" >下一页</a>
</c:if>
<a href="user?pageSize=${pageUtil.pageSize}¤tPage=${pageUtil.lastPage }" >尾页</a>
第${pageUtil.currentPage}页/共${pageUtil.lastPage}页
</center>
</body>
</html>
11.测试结果