基于Servlet实现分页查询

news2024/11/15 16:53:09

Servlet + JSP+JSTL +MySQL+Bootstrap 等技术实现分页查询功能。 

所用工具:IDEA 2022.3.3 + Navicat +Tomcat 等。

本文目录

一:运行效果

 二:代码详解

(1)index.jsp 

(2)PageBean 

(3)Servlet

(4)DAO层

(5)BaseDao

(6)JSP

 (7)所需数据表

 (8)案例项目结构

三:功能展示

点击下一页

点击尾页

点击上一页

点击首页


一:运行效果

运行之后如上图👆所示。

所包含的功能有: 首页、尾页、上一页、下一页、当前的页码总页码统计等。

至于关于分页的其他功能,如控制每一页显示几条数据、跳转到第几页等,有待后续更新...

 二:代码详解

(1)index.jsp 

首页发起请求。侧重功能实现,没做样式(可自行设计)。

<%--
  Created by IntelliJ IDEA.
  User: AdminSun
  Date: 2023/6/12
  Time: 15:44
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>首页</title>
  </head>
  <body>
      <h1>欢迎使用</h1>
      <a href="/RoomServlet">分页查询展示</a>
  </body>
</html>

(2)PageBean 

分页工具类:

package cn.shq.util;

import java.util.List;

public class PageBean {
    private Integer curPage;//当前页码
    private Integer pageSize;//每一页显示的条数
    private List datas; //每一页要显示的数据
    private Integer firstPage;//首页
    private Integer prevPage;//上一页
    private Integer nextPage;//下一页
    private Integer lastPage;//尾页
    private  Integer totalCount;//数据总条数
    private  Integer totalPages; //总页码

    public PageBean() {
    }

    /*   构造方法*/
    public PageBean(Integer curPage, Integer pageSize, List datas, Integer totalCount) {
        //初始化各个属性
        this.curPage = curPage;
        this.pageSize = pageSize;
        this.datas = datas;
        this.totalCount = totalCount;
        //计算出来其他的属性=====也算作初始化
        //计算总页码
        /*
         *    总页码  = 总条数 %  pageSize  ? 整除   则 总条数/pageSize
         *                                   有余数   总条数/pageSize+1
         * */
        this.totalPages=this.totalCount%this.pageSize==0?this.totalCount/this.pageSize:this.totalCount/this.pageSize+1;
        //   意思:   ↓↓↓↓
       /* if(totalCount%pageSize==0){
            this.totalPages=totalCount/pageSize;
        }else{
            this.totalPages=totalCount/pageSize+1;
        }*/
        this.firstPage=1;
        this.prevPage=this.curPage-1;
        this.nextPage=this.curPage+1;
        this.lastPage=this.totalPages;
        //对于超出范围的,加以限定
        //如果第一次访问的时候,
        if(curPage==null||curPage<1) curPage=1;
        //总页码
        if(this.totalPages==0) this.totalPages=1;
        //对于 上一页   当显示的页面为第一页的时候,不再递减
        if(prevPage<=0) this.prevPage=1;
        //对于下一页  最后一页的时候,下一页 停留在最后一页
        if(nextPage>=this.totalPages) this.nextPage=this.totalPages;
    }

    public Integer getCurPage() {
        return curPage;
    }

    public void setCurPage(Integer curPage) {
        this.curPage = curPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public List getDatas() {
        return datas;
    }

    public void setDatas(List datas) {
        this.datas = datas;
    }

    public Integer getFirstPage() {
        return firstPage;
    }

    public void setFirstPage(Integer firstPage) {
        this.firstPage = firstPage;
    }

    public Integer getPrevPage() {
        return prevPage;
    }

    public void setPrevPage(Integer prevPage) {
        this.prevPage = prevPage;
    }

    public Integer getNextPage() {
        return nextPage;
    }

    public void setNextPage(Integer nextPage) {
        this.nextPage = nextPage;
    }

    public Integer getLastPage() {
        return lastPage;
    }

    public void setLastPage(Integer lastPage) {
        this.lastPage = lastPage;
    }

    public Integer getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
    }

    public Integer getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(Integer totalPages) {
        this.totalPages = totalPages;
    }


}

(3)Servlet

控制器类:

package cn.shq.controller;

import cn.shq.dao.RoomDao;
import cn.shq.dao.impl.RoomDaoImp;
import cn.shq.util.PageBean;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "RoomServlet", value = "/RoomServlet")
public class RoomServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
        RoomDao rm=new RoomDaoImp();
        String pageParam = req.getParameter("curPage");
        if (pageParam == null) pageParam = "1";
        if (pageParam == "") pageParam = "1";
        int curPage = Integer.parseInt(pageParam);
        //每一页显示的条数, 从页面下拉框获取
        String psize=req.getParameter("pageSize");
        if (psize == null) psize = "3";
        int pageSize = Integer.parseInt(psize);
        //调用dao,执行查询
        PageBean pageBean = rm.selByPage(curPage, pageSize);
        req.setAttribute("pager", pageBean);
        req.getRequestDispatcher("/admin/showRoom.jsp").forward(req, response);
    }

}

(4)DAO层

本案例中Servlet直接访问DAO层调用方法。

package cn.shq.dao.impl;

import cn.shq.dao.RoomDao;
import cn.shq.util.BaseDao;
import cn.shq.util.PageBean;

import java.util.List;
import java.util.Map;

public class RoomDaoImp implements RoomDao {
    @Override
    public PageBean selByPage(int curPage, int pageSize) {
        String sql="select r.rNum,r.rStatus,rs.roomstatus,rt.typeName,r.rPrice,r.rPhone,r.rPic \n" +
                "from room r,roomstatus rs,roomtype rt\n" +
                "where r.rType=rt.tid and r.rStatus=rs.sid\n" +
                "LIMIT ?,?";
        int startIndex=pageSize	* (curPage-1);
        List<Map<String, Object>> list = BaseDao.executeQuery(sql, startIndex, pageSize);
        sql="select count(*) pageNum from room";
        Long pageNum = (Long) BaseDao.executeQuery(sql).get(0).get("pageNum");
        PageBean pageBean = new PageBean(curPage,pageSize,list,pageNum.intValue());
        pageBean.setDatas(list);
        pageBean.setTotalCount(pageNum.intValue());
        return pageBean;
    }
}

(5)BaseDao

 访问数据库所用的工具类

package cn.shq.util;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BaseDao {
    protected static Connection conn = null;
    protected static PreparedStatement pstm = null;
    protected static ResultSet rs = null;

    private static String driver="com.mysql.jdbc.Driver";
    private static String url="jdbc:mysql://localhost:3306/bbs_xdy?useSSL=true";
    private static String username="root";
    private static String password="123456";

    private static Connection getConn(){
        try {
            Class.forName(driver);
            Connection connection = DriverManager.getConnection(url,username,password);
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /*
     * 通用关闭
     * */
    public static void closeAll(Connection conn,PreparedStatement pstm,ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pstm != null) {
                pstm.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*
     * 增删改
     * */
    public static int executeUpdate(String sql, Object... obj) {
        try {
            conn = getConn();
            pstm = conn.prepareStatement(sql);
            setParam(obj);
            int num = pstm.executeUpdate();
            return num;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll(conn,pstm,rs);
        }
        return 0;
    }

    /*
     * 解决占位符参数的问题
     * */
    private static void setParam(Object... obj) {
        if (obj != null) {
            for (int i = 0; i < obj.length; i++) {
                try {
                    pstm.setObject(i + 1, obj[i]);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /*
     * 通用查询
     * */
    public static List<Map<String, Object>> executeQuery(String sql, Object... obj) {
        List<Map<String, Object>> list = new ArrayList();
        try {
            conn = getConn();
            pstm = conn.prepareStatement(sql);
            setParam(obj);
            rs = pstm.executeQuery();
            ResultSetMetaData rd = rs.getMetaData();
            int count = rd.getColumnCount();
            while (rs.next()) {
                Map<String, Object> map = new HashMap();
                for (int i = 0; i < count; i++) {
                    map.put(rd.getColumnName(i + 1), rs.getObject(i + 1));
                }
                list.add(map);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeAll(conn,pstm,rs);
        }
        return list;
    }
}

(6)JSP

展示数据的页面。

<%--
  Created by IntelliJ IDEA.
  User: AdminSun 
  Date: 2020/12/08
  Time: 10:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<head>
    <title>住房管理</title>
    <link rel="stylesheet" href="../bootstrap/bootstrap-3.3.7-dist/css/bootstrap.css">
    <script src="../js/jquery-3.4.1.min.js"></script>
    <script src="../bootstrap/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
    <style>
        *{
            margin: 20px auto;
        }
    </style>
</head>
<body>
            <%--显示数据的表格--%>
            <table class="table table-hover table-bordered">
                <thead>
                <tr>
                    <th>序号</th>
                    <th>房号</th>
                    <th>房间图片</th>
                    <th>房间状态</th>
                    <th>房间类型</th>
                    <th>房间价格(元)</th>
                    <th>房间电话</th>
                </tr>
                </thead>
                <tbody>

                <c:if test="${empty pager.datas}">
                    <script>
                        alert("没有数据");
                    </script>
                </c:if>
                <c:if test="${ not empty pager.datas}">
                    <c:forEach items="${pager.datas}" var="room" varStatus="s">
                        <tr>
                            <td>${s.count}</td>
                            <td>${room.rNum}</td>
                            <td><img src="${room.rPic}" /></td>
                            <td>${room.roomstatus}</td>
                            <td>${room.typeName}</td>
                            <td>${room.rPrice}</td>
                            <td>${room.rPhone}</td>
                        </tr>
                    </c:forEach>
                </c:if>
                </tbody>
            </table>
        <%--分页控制--%>
            <ul class="pagination">
                <li>
                    <a href="/RoomServlet?op=selPage&&curPage=${pager.firstPage}">首页</a>
                </li>
                <li>
                    <a href="/RoomServlet?op=selPage&&curPage=${pager.prevPage}">上一页</a>
                </li>
                <li>
                    <a href="/RoomServlet?op=selPage&&curPage=${pager.nextPage}">下一页</a>
                </li>
                <li>
                    <a href="/RoomServlet?op=selPage&&curPage=${pager.lastPage}">尾页</a>
                </li>
                <li>
                    <a href="#">当前第 ${pager.curPage}页/共${pager.totalPages}页</a>
                </li>
            </ul>
</body>
</html>

该页面显示数据使用了JSTL标签库。

所以需要注意的是:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 (7)所需数据表

仅展示主要表。其他表需自行创建。

 (8)案例项目结构

案例结构描述
src写Java源代码的根目录。
web/admin展示数据的JSP页面
web/bootstrap:案例中所需要的Bootstrap样式表和脚本库
web/img存放案例所需图片
web/js案例中jQuery所用库
web/WEB-INF/lib案例所用jar包(连接MySQL数据库和JSTL标签库)

三:功能展示

点击下一页

点击尾页

点击上一页

点击首页

 首页或尾页的时候,点击上一页或下一页不会进行跳转,停留在首页或尾页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图解操作系统笔记

硬件基础 CPU是如何执行程序的&#xff1f; 程序执行的基本过程 第一步&#xff0c;CPU 读取「程序计数器」的值&#xff0c;这个值是指令的内存地址&#xff0c;然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址&#xff0c;接着通知内存设备准备数据&#…

python:并发编程(十七)

前言 本文将和大家一起探讨python并发编程的实际运用&#xff0c;会以一些我实际使用的案例&#xff0c;或者一些典型案例来分享。本文使用的案例是我实际使用的案例&#xff08;中篇&#xff09;&#xff0c;是基于之前效率不高的代码改写成并发编程的。让我们来看看改造的过…

excel数据的编排与整理——行列的批量处理

excel数据的编排与整理——行列的批量处理 1 一次性插入多行多列 1.1 插入连续行 1.1.0 题目内容 1.1.1 选中插入的位置➡按住shift键➡往下选中2行 1.1.2 鼠标右击➡点击插入 1.1.3 插入后的效果 1.2 插入不连续行 1.2.0 题目内容 1.2.1 按下ctrl键➡选中插入的位置,需要插…

7.4_1B树(二序查找树BST的升级版)

如果需要查找的值比节点小&#xff0c;会向左子树方向查找&#xff0c;如果比节点值大&#xff0c;会向右子树方向查找 拓展为5叉的形态 5叉排序树的定义 num是这个节点中真实存在的节点个数 那么一个节点中 最少有1个关键字&#xff0c;两个分叉 最多有4个关键字&#xff0c…

数据结构:二叉树详解

目录 概念&#xff08;在做习题中常用的概念&#xff09; 两种特殊的二叉树 二叉树的性质 二叉树的遍历&#xff08;重点&#xff09; 如上图&#xff1a; 二叉树的构建&#xff08;代码表示一颗二叉树和一些操作二叉树的方法&#xff09; 二叉树的oj习题讲解&#xff0…

代码审计-Java项目Filter过滤器CNVD分析XSS跨站框架安全

文章目录 Demo-Filter-过滤器引用Demo-ST2框架-组件安全CNVD-Jeesns-XSS跨站绕过CNVD-悟空CRM-Fastjson组件 Demo-Filter-过滤器引用 Filter&#xff1a;Javaweb三大组件之一(另外两个是Servlet、Listener) 概念&#xff1a;Web中的过滤器&#xff0c;当访问服务器的资源时&am…

编程语言的优劣评选标准与未来发展趋势——探索最佳编程语言选择

编程语言的优劣评选标准与未来发展趋势——探索最佳编程语言选择 评判标准不同编程语言的优点与缺点分析对编程语言未来发展的猜测和未来趋势 &#x1f495; &#x1f495; &#x1f495; 博主个人主页&#xff1a; 汴京城下君–野生程序员&#x1f495; &#x1f495; &#x…

编程输出三位数的水仙花数

目录 题目 分析思路 代码 题目 编程输出三位数的水仙花数 标准的 水仙花数 就是三位数&#xff0c;即将三位数的个位&#xff1b;十位&#xff1b;百位取出来&#xff0c;分别三次方相加&#xff0c;若个位&#xff1b;十位&#xff1b;百位三次方相加与原来的三位数相等&a…

模拟电路系列文章-频率响应的描述

目录 概要 整体架构流程 技术名词解释 技术细节 1.为什么受频率的影响 2.频率响应 小结 概要 提示&#xff1a;这里可以添加技术概要 电容和电感是储能元件&#xff0c;对不同频率的交流信号&#xff0c;它们具有不同的感抗或者容抗。虽然它们不消耗功率&#xff0c;但同电阻一…

【PHP】文件写入和读取详解

一&#xff0e;实现文件读取和写入的基本思路&#xff1a; 1&#xff0e;通过fopen方法打开文件&#xff1a;$fp fopen(/*参数&#xff0c;参数*/)&#xff0c;fp为Resource类型 2&#xff0e;进行文件读取或者文件写入操作&#xff08;这里使用的函数以1中返回的$fp作为参数…

Python网络爬虫基础进阶到实战教程

文章目录 认识网络爬虫HTML页面组成Requests模块get请求与实战效果图代码解析 Post请求与实战代码解析 发送JSON格式的POST请求使用代理服务器发送POST请求发送带文件的POST请求 Xpath解析XPath语法的规则集&#xff1a;XPath解析的代码案例及其详细讲解&#xff1a;使用XPath解…

macOS Sonoma 14 beta 2 (23A5276g) ISO、IPSW、PKG 下载

macOS Sonoma 14 beta 2 (23A5276g) ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linu…

【致敬未来的攻城狮计划】打卡2:keil 程序下载尝试

下载 终于考完试了&#xff0c;然而攻城狮的截止期限也快到了QAQ&#xff0c;得尽快水&#xff08;划掉&#xff09;写几篇文章了&#xff01; 先争取可以成功下载一个空的程序。 先对上一篇文章下载 DFP 也就是 keil MDK Software Packs 做一个补充。我们要下载的是 RA_DFP…

[进阶]TCP通信综合案例:群聊

代码演示如下&#xff1a; 客户端&#xff1a; public class Client {public static void main(String[] args) throws Exception{System.out.println("客户端开启&#xff01;");//1.创建Socket对象&#xff0c;并同时请求与服务端程序的连接。Socket socket new…

网线制作实验

计算机网络综合实训 网线制作 所在院系 计算机与信息工程学院 学科专业名称 计算机科学与技术 导师及职称 柯宗武 教授 提交时间 2023.4.30 计算机网络综合实训报告 一、实验目的 1、掌握三类UTP线缆的制作和测试方法 2、了解三类UTP线缆的作用及布线方式 二、实验内容 1、局…

第二章 进程的描述与控制

目录 一、进程的概念、组成、特征 1.1 进程的概念 1.1.1 程序 1.1.2 进程 1.2 进程的组成 1.3 进程控制块PCB 1.4 进程的特征 二、进程的状态与转换 2.1 进程的状态 2.2 创建态、就绪态 2.3 运行态 2.4 阻塞态 2.5 终止态 2.6 进程状态的转换 2.7 进程的组织 三…

【C++篇】C++字符串:标准库string类

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

python3.9 安装 pyspider

安装pyspider pip install pyspider 直接报错 Please specify --curl-dir/path/to/built/libcurl 于是从PythonLibs官网 中获取依赖并自行下载到本地 下载与3.9对应的 执行安装 pip install D:\下载\ad3-2.2.1-cp39-cp39-win32.whl 安装成功之后 执行 pip install p…

1748_Perl中使用通配符处理文件

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) 使用通配符处理文件一般是用于文件的拷贝、删除以及对文件逐个分析等功能。在Perl中遇到的相应的功能基本上也是如此。通配符匹配处理文件&#xff08;文件名&#xff09;需要使…

前端JavaScript入门-day01

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 JavaScript 介绍 1 JavaScript 是什么 1. JavaScript &#xff08;是什么&#xff1f;&#xff09; 2. 作…