【JavaWeb】手写一个Servlet+JSP+JavaBean分页

news2025/8/1 18:15:49

在这里插入图片描述

✅✅作者主页:🔗孙不坚1208的博客
🔥🔥精选专栏:🔗JavaWeb从入门到精通(持续更新中)
📋📋 本文摘要:本篇文章主要分享如何使用Servlet+JSP+JavaBean写一个分页。

💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞
👉 👉你的一键三连是我更新的最大动力❤️❤️

手写分页总结

      • 一、分页技术
        • 1、前端分页
        • 2、后端分页
      • 二、实现分页
        • 1、准备工作
        • 2、效果图
        • 3、核心代码

运行环境:tomcat8.0+idea

技术:servlet+jsp+javabean+mysql

一、分页技术

1、前端分页

前端分页:一次性从数据库读出表的所有数据一次性的返回给客户端,由前端js来控制每一页的显示,由于一次性读出所有数据并返回给客户端,如果数据量庞大,这一次的动作可能是非常消耗服务器资源和带宽的,但是返回给客户端以后就非常轻松了,客户端在一段时间内不会再像服务器端请求资源。

2、后端分页

本文分页是后端分页实现的一种。

后端分页:由后端程序控制,每一次只返回一页大小的数据,返回并显示到客户端,优点的话就是减少单次查询数据库的时间,后端分页的方法需要频繁和服务器端进行交互,因为频繁交互,所以会给服务器带来负担。

二、实现分页

1、准备工作

在制作分页之前,首先需要了解,分页的属性有哪些?

  • 当前页数 currentPage
  • 总页数 totalPage
  • 总记录数 totalSize
  • 每页记录数 pageSize
  • 当前页数据 pageList
  • 等等…

我们可以将这些属性变成一个JavaBean中的属性来调用,并且实现一些分页相关的业务逻辑。

封装关于页数的数据:

请求数据: 当前页数 currentPage

响应数据: PageBean 类封装(包含上面我们说过的属性)

总页数 = (总记录数 % 每页记录数 == 0) ? (总记录数 / 每页记录数) : (总记录数 / 每页记录数 + 1);

当前页数据 list = query( select * from limit 每页记录数*(当前页数-1), 每页记录数 );

2、效果图

image-20221118182545962

3、核心代码

bean PageBean.java

package com.sun.bean;

import com.sun.util.DBConnection;
import com.sun.util.Date_String;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author JumperSun
 * @date 2022-11-15-8:31
 */
public class PageBean<T> {
    private Integer currentPage; // 当前页数
    private Integer totalPage; // 总页数
    private Integer totalSize; // 总记录数
    private Integer pageSize; // 每页记录数
    private List<T> list; // 当前页数据 <T>

    public Integer getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    public Integer getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }

    public Integer getTotalSize() {
        return totalSize;
    }

    public void setTotalSize(Integer totalSize) {
        this.totalSize = totalSize;
    }

    public Integer getPageSize() {
        return pageSize;
    }

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

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    // 分页总数
    public int size()throws SQLException {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            conn = DBConnection.getConnection();
            String sql = "select count(*) from user";
            st = conn.createStatement();
            rs = st.executeQuery(sql);
            if(rs.next()) {
                return rs.getInt(1);
            }
        } finally {
            DBConnection.close(rs, st, conn);
        }
        return 0;
    }

    // 分页查询数据
    public List<UserBean> queryAllByLimit(int offset, int limit) throws SQLException {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<UserBean> users=new ArrayList<UserBean>();
        try {
            conn = DBConnection.getConnection();
            String sql = "select * from user limit " + offset + "," + limit;
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()==true){
                UserBean tmp=new UserBean();
                tmp.setUserid(rs.getInt("id"));
                tmp.setUsername(rs.getString("name"));
                tmp.setPassword(rs.getString("password"));
                tmp.setSex(rs.getString("sex"));
                tmp.setAge(rs.getInt("age"));
                String birthday= Date_String.getStringDate1(rs.getDate("birthday"));
                tmp.setBirthday(birthday);
                users.add(tmp);
            }
        } finally {
            DBConnection.close(rs, ps, conn);
        }
        return users;
    }

    // 分页查询处理
    public void selectUserListByPage(Integer currentPage, PageBean<UserBean> pageBean) throws SQLException {
        // 当前页数
        pageBean.setCurrentPage(currentPage);
        // 总记录数
        Integer totalSize = pageBean.size();
        pageBean.setTotalSize(totalSize);
        // 每页记录数
        Integer pageSize = 3;
        pageBean.setPageSize(pageSize);
        // 总页数(没余数为整页,有余数页数+1)
        Integer totalPages = null;
        if (totalSize != null) {
            totalPages = (totalSize%pageSize==0) ? (totalSize/pageSize) : (totalSize/pageSize+1);
        }
        if(totalPages != null) {
            pageBean.setTotalPage(totalPages);
        }
        // 当前页数据
        List<UserBean> list = queryAllByLimit(pageSize*(currentPage-1), pageSize);
        pageBean.setList(list);
    }
}

Servlet GetUserListByPage.java

package com.sun.servlet;

import java.io.IOException;
import java.sql.SQLException;

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 com.sun.bean.PageBean;
import com.sun.bean.UserBean;

@WebServlet("/getUserListByPage")
public class GetUserListByPage extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String currentPageStr = request.getParameter("currentPage");
		Integer currentPageNum = getCurrentPage(currentPageStr);

		PageBean<UserBean> pageBean = new PageBean<>();
		try {
			pageBean.selectUserListByPage(currentPageNum,pageBean);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		request.setAttribute("pageBean", pageBean);
		request.getRequestDispatcher("/Main.jsp").forward(request,response);
	}

	private Integer getCurrentPage(String currentPagestr) {
		if (null == currentPagestr) {
			currentPagestr = "1";
		}
		return Integer.valueOf(currentPagestr);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

jsp Main.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" errorPage="../error.jsp" %>
<%@ page import="java.util.List" %>
<%@ page import="com.sun.bean.UserBean" %>
<%@ page import="com.sun.bean.PageBean" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/style.css"/>
    <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/common.css"/>
</head>
<body>
<div class="content">
    <jsp:useBean id="pageBean" class="com.sun.bean.PageBean" scope="request"/>
    <table class="mtable2">
        <h3 style="margin-bottom: 0">学生列表</h3>
        <form action="${pageContext.request.contextPath}/getUserListByPageLike" method="post">
            学生名:<input type="text" name="username" value="${param.username}"/>&nbsp;&nbsp;
            性别:<input type="text" name="sex" value="${param.sex}"/>
            <input type="submit" value="查询"/>
            <input type="reset" value="重置">
        </form>
        <tr>
            <th>学生id</th>
            <th>学生名</th>
            <th>密码</th>
            <th>性别</th>
            <th>年龄</th>
            <th>出生日期</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${pageBean.list}" var="user">
            <tr>
                <td>${user.getUserid()}</td>
                <td>${user.getUsername()}</td>
                <td>${user.getPassword()}
                </td>
                <td>${user.getSex()}
                </td>
                <td>${user.getAge()}
                </td>
                <td>${user.getBirthday()}
                </td>
                <td>
                    <a href="user/UpdateUser.jsp?userid=${user.getUserid()}">修改</a>&nbsp;&nbsp;&nbsp;&nbsp;
                    <a href="user/DelUser_do.jsp?userid=${user.getUserid()}">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
    <div class="fenye">
        第${pageBean.currentPage}/${pageBean.totalPage}页
        总记录数:${pageBean.totalSize}条
        每页${pageBean.pageSize}条
        <c:if test="${pageBean.currentPage != 1}">
            <a href="${pageContext.request.contextPath}/getUserListByPageLike?currentPage=1">
                [首页]
            </a>
            <a href="${pageContext.request.contextPath}/getUserListByPageLike?currentPage=${pageBean.currentPage-1}">
                [上一页]
            </a>
        </c:if>
        <c:if test="${pageBean.currentPage != pageBean.totalPage}">
            <a href="${pageContext.request.contextPath}/getUserListByPageLike?currentPage=${pageBean.currentPage+1}">
                [下一页]
            </a>
            <a href="${pageContext.request.contextPath}/getUserListByPageLike?currentPage=${pageBean.totalPage}">
                [尾页]
            </a>
        </c:if>
    </div>
</div>
</body>
</html>

此致,一个分页就写完了。

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

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

相关文章

C++对象拷贝

前言&#xff1a;本教程使用到的工具是vs2010&#xff1b;能用VC6就用VC6&#xff0c;因为vs2010生成的汇编代码可能有点乱&#xff1b;此外&#xff0c;文章中涉及的汇编&#xff0c;我都会予以解释&#xff0c;所以放心观看。 目录 一、什么是对象拷贝&#xff1f; 二、C对…

【微服务】SpringCloud微服务剔除下线源码解析

&#x1f496; Spring家族及微服务系列文章 ✨【微服务】SpringCloud微服务续约源码解析 ✨【微服务】SpringCloud微服务注册源码解析 ✨【微服务】Nacos2.x服务发现&#xff1f;RPC调用&#xff1f;重试机制&#xff1f; ✨【微服务】Nacos通知客户端服务变更以及重试机制 ✨【…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.4 Redis 下载安装与基本使用

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.4 Redis 下载安装与基本使用4.4.1 问题引入4.4.2 …

Linux Mint(Ubuntu)上 安装 效率神器 utools

Linux Mint&#xff08;Ubuntu&#xff09;上 安装 效率神器 utools 我的 Windows 系统的笔记本只有 256G 固态&#xff0c;磁盘已经快用满了&#xff0c;最近想装个 Linux 玩玩&#xff0c;1 选择了 Linux Mint&#xff0c;然后就在闲置的移动硬盘上安装了 Linux Mint 21 cin…

Centos 安装Java库的多种方式

安装jdk(介绍三种方法) 查看java版本&#xff1a;java -version 方法一&#xff1a;利用yum源来安装jdk&#xff08;此方法不需要配置环境变量&#xff09; 查看yum库中的java安装包 &#xff1a;yum -y list java* 安装需要的jdk版本的所有java程序&#xff1a;yum -y instal…

纯正体验,极致商务 | 丽亭酒店聚焦未来赛道,实现共赢发展

10月28日&#xff0c;锦江酒店(中国区)“齐鲁集锦 共话未来”投资人交流会在济南盛大召开&#xff0c;面向华东地区投资人&#xff0c;行业专家、商旅客、品牌代表齐聚一堂&#xff0c;共同聚焦酒店市场投资新价值&#xff0c;商讨新时代酒店行业新机遇&#xff0c;多维探索酒店…

蓝牙数据包协议解析

1.前言 由于工作需要&#xff0c;初次接触蓝牙。从最基础的知识开始了解。 引用wiki中的介绍&#xff1a; 蓝牙&#xff08;英语&#xff1a;Bluetooth&#xff09;&#xff0c;一种无线通讯技术标准&#xff0c;用来让固定与移动设备&#xff0c;在短距离间交换资料&#xff…

第一章:Spring流程执行步骤

Spring执行流程图 注意观察&#xff1a;每一个执行步骤的结果都会返回到DispatcherServlet &#xff0c;然后再出发调用&#xff0c; 所以是请求接口的入口也是出口。 简单了解几个大类的走的流程和具体功能 DispatcherServlet 类 中文调度应用程序&#xff0c;而Servlet就…

libusb系列-007-Qt下使用libusb1.0.26源码

libusb系列-007-Qt下使用libusb1.0.26源码 文章目录libusb系列-007-Qt下使用libusb1.0.26源码摘要安装编译环境确认需要的文件开始编译错误1&#xff1a;找不到文件错误2&#xff1a;expected错误3&#xff1a;SCM_CREDENTALS错误4&#xff1a;类型冲突错误5 assert断言错误错误…

低代码平台和无代码平台有什么区别

低代码&#xff08;LowCode&#xff09;/无代码(NoCode)”是技术界近几年的热门词汇之一&#xff0c;随着企业数字化发展的深入&#xff0c;越来越多的场景化需求要求企业具备更加灵活敏捷的应用开发能力&#xff0c;传统应用开发模式周期长、技术人员能力要求高&#xff0c;无…

OWASP API SECURITY TOP 10

目录 1. API 安全风险 2. 细说TOP10 1. Broken Object Level Authorization 2. Broken User Authentication 3 Excessive Data Exposure 4 Lack of Resources & Rate Limiting 5 Broken Function Level Authorization 6 Mass Assignment 7 security misconfigura…

redis哨兵系列1

需要配合源码一起康~ 9.1 哨兵基本概念 官网手册yyds&#xff1a;https://redis.io/docs/manual/sentinel/ redis主从模式&#xff0c;如果主挂了&#xff0c;需要人工将从节点提升为主节点&#xff0c;通知应用修改主节点的地址。不是很友好&#xff0c;so Redis 2.8之后开…

同花顺_代码解析_技术指标_EJK

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 EMV ENV EXPMA JF_ZNZX KD KDJ KDJFS EMV 简易波动指标 1.EMV 由下往上穿越0 轴时&#xff0c;视为中期买进参考信号&#xff1b; 2.EMV 由上往下穿越0 轴时&#xff0c;视为中…

根据以下电路图,补全STM32F103RCT6的IO口初始化程序

void KEY_Init(void)//接按键的端口初始化程序 { RCC->APB2ENR|______________; //使能PORTA时钟 JTAG_Set(SWD_ENABLE); GPIOA->CRL&__________________; // PA3设置成下拉输入 GPIOA->CRL|__________________; } void LED_Init(void)//接LED的端…

【Qt】控件探幽——QLineEdit

注1&#xff1a;本系列文章使用的Qt版本为Qt 6.3.1 注2&#xff1a;本系列文章常规情况下不会直接贴出源码供复制&#xff0c;都以图片形式展示。所有代码&#xff0c;自己动手写一写&#xff0c;记忆更深刻。 本文目录QLineEdit探幽1、设置数据/获取数据2、只读&#xff08;re…

【15-项目中服务的远程调用之OpenFeign订单模块与商品模块集成使用OpenFeign的案例】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

【面试题】圣杯布局和双飞翼布局

圣杯布局和双飞翼布局的特点&#xff1a; 三栏布局&#xff0c;中间一栏最先加载和渲染&#xff08;内容最重要&#xff09;两侧内容固定&#xff0c;中间内容随着宽度自适应一般用于PC页面 圣杯布局和双飞翼布局的实现方式&#xff1a; 使用float布局两侧使用margin负值&am…

git 、gitLub 提交后查看显示全部删除又全部新增

问题&#xff1a; git提交后删除的行数与增加的行数一样&#xff0c;没有修改git也会去全部删除又全部新增 大概是下面你这个样子&#xff1a; 原因&#xff1a; 换行符的原因&#xff0c;win、mac、linux/Unix 换行符是不一样的&#xff0c;提交的文件换行符和git服务器的不…

【Unity300个技巧】牛顿的学问!如何优雅地使用力?

Unity 提供了一个完备且强大物理引擎。但在刚接触的时候&#xff0c;你可能会对它与现实物理规律对应有一些疑惑。 比如&#xff1a; 现实中 1N 的力在 Unity 中怎么表现&#xff1f;Unity 中物体的质量是计算的&#xff1f;Unity 中给物体添加力的方法是 rb.AddForce()&#x…

ICME 论文Latex模版要求

2023年模版获取链接&#xff1a; 链接: https://pan.baidu.com/s/1Hjk4nnybQN6LE23SGfbxKQ 提取码: 27dj --来自百度网盘超级会员v4的分享 论文写作要求&#xff1a; 所有手稿必须是英文的&#xff1b; 论文长度不应超过6页&#xff0c;包括所有文本、图形和参考文献&#…