• 图书借阅系统简易异步分页源码


    分页可以大大的减轻服务器的压力 它一次性只加载部分数据 也增强了用户的体验性 可读性

    首先我们需要一个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>


    效果截图 该图书借阅系统 实现了分页 多条件查询分页 去首页 去尾页 去指定页 和借阅功能 下面是效果截图:



  • 相关阅读:
    普通文本(.txt)篇章排版样式参考 [文档说明][日志]
    C++基础练习案例
    Markdown 编写技巧汇总(二)
    Markdown 编写技巧汇总(一)
    有关C++程序设计基础的各种考题解答参考汇总
    有关算法与数据结构的考题解答参考汇总 [C++] [链表] · 第三篇
    有关算法与数据结构的考题解答参考汇总 [C++] [链表] · 第二篇
    有关算法与数据结构的考题解答参考汇总 [C++] [链表]
    DOS批处理小案例应用分享
    基于Processing图像序列处理保存导出的流程梳理
  • 原文地址:https://www.cnblogs.com/javaBoy-ahua/p/13899310.html
Copyright © 2020-2023  润新知