分页可以大大的减轻服务器的压力 它一次性只加载部分数据 也增强了用户的体验性 可读性
首先我们需要一个page工具类
package com.shenwang.booksInfoManager.utils;
import java.util.ArrayList;
import java.util.List;
public class Page<T> {
/**
* 每页总数
*/
private int pageSize;
/**
* 数据总数(此表中总共有多少条数据)
*/
private int count;
/**
* 每页第一条数据索引
*/
private int startIndex;
/**
* 每页最后一条数据索引
*/
private int endIndex;
/**
* 当前页数
*/
private int currentPage;
/**
* 可点击的开始页
*/
private int start;
/**
* 可点击的最后一页
*/
private int end;
/**
* 总页数
*/
private int totalPage;
/**
* 用于存储每页数据的集合
*/
private List<T> list=new ArrayList<T>();
/**
* 当前页数 每页多少条数据 数据总数
* @param currentPage
* @param pageSize
* @param count
*/
public Page(int currentPage,int pageSize,int count){
this.currentPage=currentPage;
this.pageSize=pageSize;
this.count=count;
//求总页数
if (count%pageSize==0) {
this.totalPage = count / pageSize;
}
else {
this.totalPage = count / pageSize + 1;
}
//每一页的第一条数据的索引
this.startIndex=(currentPage-1)*pageSize;
//每页的最后一条数据
//如果当前页是最后一页
if (currentPage==totalPage) {
this.endIndex = count - 1;
}
else {
this.endIndex = startIndex + pageSize - 1;
}
//选项卡的启始页和最后一页默认值为1-5
this.start=1;
this.end=5;
if (totalPage<=5) {
this.end = totalPage;
}
else{
this.start=currentPage-2;
this.end=currentPage+2;
if (this.start<=0){
this.start=1;
this.end=5;
}
if (this.end>totalPage){
this.end=totalPage;
this.start=end-4;
}
}
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getStartIndex() {
return startIndex;
}
public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
}
public int getEndIndex() {
return endIndex;
}
public void setEndIndex(int endIndex) {
this.endIndex = endIndex;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
然后是dao层
package com.shenwang.booksInfoManager.dao; import com.mysql.jdbc.StringUtils; import com.shenwang.booksInfoManager.pojo.BooksInfo; import com.shenwang.booksInfoManager.utils.DBCPUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import java.util.ArrayList; import java.util.List; @SuppressWarnings("all") /** * @author shenwang * @version 1.0 */ public class BooksInfoDaoImpl implements BooksInfoDao { /** * 实例化queryRunner */ QueryRunner queryRunner=new QueryRunner(DBCPUtils.getDataSource()); @Override public List<BooksInfo> paging(int startIndex, int pageSize, BooksInfo booksInfo) throws Exception { //准备sql语句 String sql="select * from booksInfo where 1=1"; //实例化list 用于存储参数 List<Object> list=new ArrayList<Object>(); //实例化StringBuffer类用于拼接sql语句 StringBuffer sbSql=new StringBuffer(sql); //如果该对象的书籍编号不为空 则给sbSql追加查询条件 if (!StringUtils.isNullOrEmpty(booksInfo.getBookNumber())){ sbSql.append(" and bookNumber like ?"); list.add("%"+booksInfo.getBookNumber()+"%"); } //如果该对象的借出状态不为空 则给sbSql追加查询条件 if (booksInfo.getBookFlag()!=null&&booksInfo.getBookFlag()!=-1){ sbSql.append(" and bookFlag=?"); list.add(booksInfo.getBookFlag()); } //给sql语句添加分页条件 并且将 startIndex pageSize 添加到list中去 sbSql.append(" limit ?,?"); list.add(startIndex); list.add(pageSize); //返回数据集合 return queryRunner.query(sbSql.toString(),new BeanListHandler<BooksInfo>(BooksInfo.class),list.toArray()); } @Override public int getCount() throws Exception { String sql="select count(1) from booksInfo"; return ((Long)queryRunner.query(sql,new ScalarHandler<>(1))).intValue(); } @Override public int getCountByNumberAndFlag(BooksInfo booksInfo) throws Exception { //准备sql语句 String sql="select * from booksInfo where 1=1"; //实例化list 用于存储参数 List<Object> list=new ArrayList<Object>(); //实例化StringBuffer类用于拼接sql语句 StringBuffer sbSql=new StringBuffer(sql); //如果该对象的书籍编号不为空 则给sbSql追加查询条件 if (!StringUtils.isNullOrEmpty(booksInfo.getBookNumber())){ sbSql.append(" and bookNumber like ?"); list.add("%"+booksInfo.getBookNumber()+"%"); } //如果该对象的借出状态不为空 则给sbSql追加查询条件 if (booksInfo.getBookFlag()!=null&&booksInfo.getBookFlag()!=-1){ sbSql.append(" and bookFlag=?"); list.add(booksInfo.getBookFlag()); } List<BooksInfo> query = queryRunner.query(sbSql.toString(), new BeanListHandler<BooksInfo>(BooksInfo.class), list.toArray()); return query.size(); } @Override public int updFlagById(Integer bookId) throws Exception { String sql="update booksInfo set bookFlag=1 where bookId=?"; return queryRunner.update(sql,bookId); } @Override public BooksInfo selById(Integer bookId) throws Exception { String sql="select * from booksInfo where bookId=?"; return queryRunner.query(sql, new BeanHandler<BooksInfo>(BooksInfo.class),bookId); } }
再后面是Service层
package com.shenwang.booksInfoManager.service;
import com.shenwang.booksInfoManager.dao.BooksInfoDao;
import com.shenwang.booksInfoManager.dao.BooksInfoDaoImpl;
import com.shenwang.booksInfoManager.pojo.BooksInfo;
import com.shenwang.booksInfoManager.utils.Page;
import java.util.List;
/**
* @author shenwang
* @version 1.0
*/
public class BooksInfoServiceImpl implements BooksInfoService {
/**
* 实例化 booksInfo Dao层
*/
BooksInfoDao dao=new BooksInfoDaoImpl();
@Override
public Page<BooksInfo> userPaging(int currentPage, int pageSize,BooksInfo booksInfo) {
int count= 0;
try {
//根据条件筛选数据总数量
count=dao.getCountByNumberAndFlag(booksInfo);
Page<BooksInfo> page = new Page<>(currentPage, pageSize, count);
int start=page.getStartIndex();
int sum=page.getPageSize();
List<BooksInfo> list = dao.paging(start,sum,booksInfo);
page.setList(list);
return page;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public int getCount(){
try {
return dao.getCount();
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
@Override
public boolean updFlagById(Integer bookId) {
try {
return dao.updFlagById(bookId)>0?true:false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据书籍编号查询 返回booksInfo
* @param bookId
* @return
* @throws Exception
*/
@Override
public BooksInfo selById(Integer bookId) {
try {
return dao.selById(bookId);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
Servlet层:
package com.shenwang.booksInfoManager.servlet;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.shenwang.booksInfoManager.pojo.BooksInfo;
import com.shenwang.booksInfoManager.service.BooksInfoService;
import com.shenwang.booksInfoManager.service.BooksInfoServiceImpl;
import com.shenwang.booksInfoManager.utils.Page;
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 java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@WebServlet(name = "BooksInfoServlet",urlPatterns = "/booksInfoServlet")
public class BooksInfoServlet extends HttpServlet {
/**
* 实例化服务层
*/
BooksInfoService service=new BooksInfoServiceImpl();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取方法名
String function=request.getParameter("function");
switch (function==null?"":function){
//调用分页的方法
case "paging":
paging(request,response);
break;
//查询
case "queryPaging":
queryPaging(request,response);
break;
//修改
case "updFlagById":
updFlagById(request,response);
break;
//默认调用分页的方法
default:
paging(request,response);
break;
}
}
/**
* 分页
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void paging(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//默认为第一页
String str=request.getParameter("currentPage");
int currentPage=1;
//获取当前页数
if(str!=null) {
currentPage = Integer.valueOf(str);
}
//默认每页2条数据
int pageSize=2;
//获取书籍编号
Object bookNumberStr=request.getSession().getAttribute("bookNumber");
String bookNumber=null;
if (bookNumberStr!=null) {
bookNumber = bookNumberStr.toString();
}
//获取书籍状态
Object bookFlagStr=request.getSession().getAttribute("bookFlag");
Integer bookFlag=null;
//如果bookFlagStr不为空则将bookFlagStr赋值给bookFlag
if (bookFlagStr!=null) {
bookFlag = Integer.valueOf(bookFlagStr.toString());
};
//实例化booksInfo
BooksInfo booksInfo=new BooksInfo();
booksInfo.setBookNumber(bookNumber);
booksInfo.setBookFlag(bookFlag);
Page<BooksInfo> page = service.userPaging(currentPage, pageSize,booksInfo);
//设置属性
request.setAttribute("page",page);
request.getRequestDispatcher("index.jsp").forward(request,response);
}
/**
* 查询方法
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void queryPaging(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取书籍编号 并设置未session属性
String bookNumber=request.getParameter("bookNumber");
request.getSession().setAttribute("bookNumber",bookNumber);
//获取书籍状态 且 设置为session属性
Integer bookFlag=Integer.valueOf(request.getParameter("bookFlag"));
request.getSession().setAttribute("bookFlag",bookFlag);
//调用分页方法
paging(request,response);
}
/**
* 根据id修改书籍借阅状态 并响应给index.jsp
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void updFlagById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取参数 书籍编号
String bookId = request.getParameter("bookId");
//根据id获取该书
BooksInfo book = service.selById(Integer.valueOf(bookId));
//获取该书的借阅状态
String bookFlag=String.valueOf(book.getBookFlag());
if (bookFlag.equals("1")) {
//响应
response.getWriter().write("已借阅");
}
else {
//修改书籍状态
boolean flag = service.updFlagById(Integer.valueOf(bookId));
//响应
response.getWriter().write(String.valueOf(flag));
}
}
}
jsp界面
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<%--<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">--%>
<style>
td{
text-align: center;
150px;
}
tr{
height: 40px;
}
</style>
</head>
<body>
<div align="center" id="showDiv">
<h2>图书管理系统</h2>
编号<input type="text" name="bookNumber">
<select name="bookFlag">
<option value="-1">全部</option>
<option value="0">未借阅</option>
<option value="1">已借阅</option>
</select>
<input type="button" value="查询" onclick="query()">
<hr/>
<table>
<tr>
<th>序号</th>
<th>图书名称</th>
<th>作者</th>
<th>出版社</th>
<th>编号</th>
<th>操作</th>
</tr>
<c:forEach items="${page.list}" var="book">
<tr>
<td>${book.bookId}</td>
<td>${book.bookName}</td>
<td>${book.bookPublish}</td>
<td>${book.bookAuthor}</td>
<td>${book.bookNumber}</td>
<td>
<c:if test="${book.bookFlag==1}">
<a href="javaScript:void(1)" id="msgFlag1">已借阅</a>
</c:if>
<c:if test="${book.bookFlag==0}">
<a href="javaScript:void(1)" onclick="updBookFlag(${book.bookId})") id="msgFlag0">借阅</a>
</c:if>
</td>
</tr>
</c:forEach>
<tr>
<td>
<input type="button" value="上一页" id="prev" onclick="prev(${page.currentPage})">
${page.currentPage}/${page.totalPage}
<input type="button" value="下一页" id="next" onclick="next(${page.currentPage})">
</td>
<td>
<input type="button" value="首页" onclick="goHeaderPage(${page.start})">
<input type="button" value="末页" onclick="goTrailerPage(${page.end})">
</td>
<td colspan="2">
第<input type="text" id="pageNumber">页
<input type="button" value="Go" onclick="goFindPage()">
</td>
</tr>
</table>
</div>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
//返回上一页方法
function prev(currentPage){
//页数等于当前页数减一
var curPage=currentPage-1;
//获取第一页
var start=${page.start}
//如果当前页减一小于第一页 则设置当前按钮为不可用 并且不执行下面代码
if(curPage<start){
$("#prev").attr("disabled","disabled")
return;
}
//发送请求
$("#showDiv").load("booksInfoServlet",{"function":"paging","currentPage":curPage})
}
//去下一页方法
function next(currentPage){
//页数等于当前页数加一
var curPage=currentPage+1;
//获取最后一页是第几页
var end=${page.end}
//如果当前页加一大于最后一页则设置该按钮不可用 并 不执行下面代码
if(curPage>end){
$("#next").attr("disabled","disabled")
return;
}
//发送请求
$("#showDiv").load("booksInfoServlet",{"function":"paging","currentPage":curPage})
}
//根据书籍编号及书籍借阅状态分页查询
function query(){
//获取用户输入的书籍编号
var bookNumber = $("input[name='bookNumber']").val();
//获取用户选择的书籍借阅状态
var bookFlag = $("select").val();
//发送请求
$("#showDiv").load("booksInfoServlet",{"bookNumber":bookNumber,"bookFlag":bookFlag,"currentPage":1,"function":"queryPaging"})
}
//去第一页
function goHeaderPage(start){
$("#showDiv").load("booksInfoServlet",{"function":"paging","currentPage":start})
}
//去尾页
function goTrailerPage(end){
$("#showDiv").load("booksInfoServlet",{"function":"paging","currentPage":end})
}
//指定去某一页
function goFindPage(){
//获取用户输入的页数
var pageNumber=$("#pageNumber").val()
//如果用户输入的页数大于总页数则不执行下面代码
if(pageNumber>${page.end}){
alert("抱歉 没有这么多页 请重新输入页数")
return;
}
//如果用户输入的页数为负数则不执行下面代码
else if(pageNumber<${page.start}){
alert("抱歉 页数不能为负数 请重新输入页数")
return;
}
var reg=/^d$/
if (!reg.test(pageNumber)) {
alert("页数必须为数字")
return;
}
//发送异步请求
$("#showDiv").load("booksInfoServlet",{"function":"paging","currentPage":pageNumber})
}
//借阅书籍方法
function updBookFlag(bookId){
$.post("booksInfoServlet",{"function":"updFlagById","bookId":bookId},function (data) {
if (data=="true") {
alert("借阅成功~")
$("#msgFlag0").text("已借阅")
}
else if (data=="已借阅") {
alert("该书已被别位小可爱借走 下次记得早点来哟")
}
else{
alert("借阅失败~")
}
},"text")
$("#")
}
$("#msgFlag1").click(function () {
alert("亲 该书已被别位小可爱借走 下次记得早点来哟")
})
</script>
</body>
</html>
效果截图 该图书借阅系统 实现了分页 多条件查询分页 去首页 去尾页 去指定页 和借阅功能 下面是效果截图:
