JSP分页功能实现案例:从基础到应用的全面解析

想要实现基于jsp的分页功能:

需要从数据库中获取数据,并在前端页面中分页展示

  • 基于JDBC访问MySQL数据库,获取数据
  • 基于JSP处理数据并展示

本质上是JSP的一种开发模式(即JSP+JavaBean)

 第一步:创建JavaWeb项目,配置pom.xml文件

项目结构

 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>fenye_9_18_rumen</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>fenye_9_18_rumen Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>
<!--文件上传,这里暂时用不到-->
<!--    <dependency>-->
<!--      <groupId>smartupload</groupId>-->
<!--      <artifactId>smartupload</artifactId>-->
<!--      <version>1.0</version>-->
<!--      <scope>system</scope>-->
<!--      <systemPath>D:/maven/maven-3.9.9/repository/smartuplaod/smartupload/1.0/smartupload.jar</systemPath>-->
<!--    </dependency>--></dependencies><build><finalName>fenye</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin><plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>9.3.14.v20161028</version></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8080</port><path>/my_maven_pro</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins></build>
</project>

第二步:创建数据库表和对应的实体类

t_user表

创建用户表,包含用户id,用户名和用户密码字段,并且预先存储一些数据

 表结构如下

User.java

 引入了lombok注解,自动生成getter/setter方法和有参无参构造

package entity;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private Integer userId;private String userName;private String password;
}

第三步:导入JDBC工具类DBUtil和分页工具类PageUtil

DBUtil

 工具类中的数据库名以及用户名和密码是自己本地的数据库中的数据库名和MySQL的账号和密码(注意甄别)

package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class DBUtil {private final static String DRIVER="com.mysql.cj.jdbc.Driver";private final static String URL="jdbc:mysql://localhost:3306/csx_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull";private final static String DBNAME="root";private final static String DBPASS="root";public static Connection getConn(){Connection conn=null;try {Class.forName(DRIVER);conn= DriverManager.getConnection(URL,DBNAME,DBPASS);}catch (Exception e){e.printStackTrace();}return conn;}public static void closeAll(Connection conn, Statement st, ResultSet rs){try {if (rs!=null){rs.close();}if (st!=null){st.close();}if (conn!=null){conn.close();}}catch (Exception e){e.printStackTrace();}}}

PageUtil

目的是获取,当前的分页页数

package util;public class PageUtil {public static final int PAGE_SIZE=3;//每页显示条数public static int getTotalPages(int count,int pageSize){return count%pageSize==0?count/pageSize:count/pageSize+1;}
}

第四步:分析功能实现需要的SQL支持,书写DAO

UserDao

package dao;import entity.User;import java.util.List;public interface UserDao {/*** 查看用户总条数* @return*/int selectUsersCount();/*** 分页查询用户列表* @param pageIndex 当前页* @param pageSize 每页显示的条数* @return*/List<User> selectUserListByPage(int pageIndex, int pageSize);
}

UserDaoImpl

package dao.impl;import dao.UserDao;
import entity.User;
import util.DBUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class UserDaoImpl extends DBUtil implements UserDao {private Connection conn=null;private PreparedStatement pstmt=null;private ResultSet rs=null;/*** 查看用户总条数** @return*/@Overridepublic int selectUsersCount() {int count=0;try{//继承工具类中的方法,获取数据库连接conn=getConn();String sql="select count(user_id) from t_user";pstmt=conn.prepareStatement(sql);rs=pstmt.executeQuery();if (rs.next()){//返回单行单列数据count=rs.getInt(1);}}catch (SQLException e){e.printStackTrace();}//返回countreturn count;}/*** 分页查询用户列表** @param pageIndex 当前页* @param pageSize  每页显示的条数* @return*/@Overridepublic List<User> selectUserListByPage(int pageIndex, int pageSize) {List<User> list =new ArrayList<>();try{conn=getConn();String sql="select * from t_user order by user_id desc limit ?,?";pstmt=conn.prepareStatement(sql);//分页查询pstmt.setInt(1,pageSize*(pageIndex-1));pstmt.setInt(2,pageSize);rs=pstmt.executeQuery();while (rs.next()){User user =new User(rs.getInt(1),rs.getString(2),rs.getString(3));list.add(user);}}catch (SQLException e){e.printStackTrace();}return list;}
}

第五步:创建处理后端数据并展示的jsp

结构

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>Archetype Created Web Application</display-name>
</web-app>

userList.jsp

<%@ page import="dao.UserDao" %>
<%@ page import="dao.impl.UserDaoImpl" %>
<%@ page import="util.PageUtil" %>
<%@ page import="java.util.List" %>
<%@ page import="entity.User" %><%--Created by IntelliJ IDEA.User: 21038Date: 2024/9/18Time: 10:56To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>分页查询</title>
</head>
<body>
<table border="1px"><tr><th>编号</th><th>姓名</th><th>操作</th></tr><%String currentPage=request.getParameter("pageIndex");if (currentPage==null){currentPage="1";}int pageIndex = Integer.parseInt(currentPage);UserDao userDao =new UserDaoImpl();int count = userDao.selectUsersCount();//总页数int totalPages= PageUtil.getTotalPages(count,PageUtil.PAGE_SIZE);List<User> list= userDao.selectUserListByPage(pageIndex,PageUtil.PAGE_SIZE);for (User u:list){%><tr><td><%=u.getUserId()%></td><td><%=u.getUserName()%></td><td><a href="">修改</a><a href="">删除</a></td></tr><%}%><tr><td colspan="3"><a href="userList.jsp?pageIndex=1">首页</a><a href="userList.jsp?pageIndex=<%=pageIndex-1%>">上一页</a><a href="userList.jsp?pageIndex=<%=pageIndex+1%>">下一页</a><a href="userList.jsp?pageIndex=<%=totalPages%>">最后一页</a></td></tr>
</table></body>
</html>

此时的功能是存在一些问题的,比如当我们在首页点击前一页或在最后一页点击下一页都会出现数据异常,但是这里主要展示如何完成分页功能,暂不处理,后续会在servlet实现分页功能中完善。

第六步:运行测试

启动项目,并在浏览器的地址栏输入:

只实现了分页功能,操作部分的修改和删除等功能暂时未完成

这里的数据来自数据库

总结

基于JSP+JavaBean开发模式,完成了简单的分页功能,可以存在一些问题,我会在servlet实现分页功能的博客中全部解决,这里只是演示如何开发一个分页的功能实现。 

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

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

相关文章

gitlab 的CI/CD (二)

前言 上文完成了gitlab-runner的基础配置及将gitlab的制品上传至软件包库&#xff08;产品库&#xff09;的脚本编写&#xff1b; 本文实现gitlab的ci/cd对远程服务器的操作&#xff1b; 介绍 要让Gitlab Runner部署到远程机器&#xff0c;远程机器必须信任gitlab runner账…

C++标准库容器类——string类

引言 在c中&#xff0c;string类的引用极大地简化了字符串的操作和管理&#xff0c;相比 C 风格字符串&#xff08;char*或cahr[]&#xff09;&#xff0c;std::string 提供了更高效和更安全的字符串操作。接下来让我们一起来深入学习string类吧&#xff01; 1.string 的构造…

一种WLAN用户综合认证系统及其方法(本人专利号 201110408124.X)

一种WLAN用户综合认证系统及其方法(本人专利号 201110408124.X&#xff09; 本发明公开了一种WLAN用户综合认证系统及其方法&#xff0c;涉及移动通信技术领域。本系统包括WLAN终端与AP子系统和外部认证中心&#xff1b;设置有认证协议分析引擎单元和用户综合控制单元&#xff…

c/c++内存管理(详解) + new与delete的用法及底层

1:c/c内存分布情况 1.1:c/c内存的分布图 1.2:每个区域的用途及不同类型变量存储在那个区 1.3:例题讲解 2:c动态内存管理方式(new delete) 2.1:new的语法 2.2:delete的语法 3:operator new函数与operator delete函数 4:new与delete的实现原理 5:定位new表达式初识 6:mallo…

python+selenium实现自动联网认证,并实现断网重连

pythonselenium实现自动联网认证&#xff0c;并实现断网重连 echo off python “E:\autoD\auto_login.py” 要使自动登录脚本在系统重启后自动运行&#xff0c;你可以使用Windows的任务计划程序来设置。以下是详细的步骤&#xff1a; 1. 保存脚本 首先&#xff0c;将你的Py…

【高分系列卫星简介——高分二号卫星(GF-2)】

高分二号卫星&#xff08;GF-2&#xff09; 高分二号&#xff08;GF-2&#xff09;卫星是中国自主研制的首颗空间分辨率优于1米的民用光学遥感卫星&#xff0c;具有亚米级空间分辨率、高定位精度和快速姿态机动能力等特点&#xff0c;达到了国际先进水平。以下是对高分二号卫星…

对Spring-AI系列源码的讲解

前言 今天&#xff0c;我们将开启对Spring-AI系列源码的讲解。请大家不急不躁&#xff0c;我会逐步深入&#xff0c;每次专注于一个知识点&#xff0c;以防让人感到困惑。 首先&#xff0c;源码的讨论自然离不开自动装配。有人可能会问&#xff0c;之前已经讲解过这个内容了&…

【JavaSE】八种基本数据类型及包装类

数据类型字节数位数值范围包装类默认值整型byte18-128&#xff0c;127Byte0short216&#xff0c;Short0int432&#xff0c;Integer0long864&#xff0c;Long0L浮点型float432Float0.0fdouble864Double0.0d布尔型boolean18true falseBooleanfalse字符型char2160&#xff0c;Char…

C++编程语言:基础设施:异常处理(Bjarne Stroustrup)

第 13 章 异常处理(Exception Handling) 目录 13.1 错误处理(Error Handling) 13.1.1 异常(Exceptions) 13.1.2 传统错误处理(Traditional Error Handling) 13.1.3 探索(Muddling Through) 13.1.4 异常的替代观点(Alternative Views of Exceptions) 13.1.4.1 异步…

DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞

知识点&#xff1a; 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE 前置知识 1、复现环境&#xff1a;Vulfocus(官方在线的无法使用&#xff0c;需要自己本地搭建) 官方手册&#xff1a;https://fofapr…

老牛码看JAVA行业现状

一、坏消息深化与反思&#xff1a; 1、技术瓶颈与框架局限&#xff1a;尽管低代码平台崭露头角&#xff0c;为开发效率带来新气象&#xff0c;但其全面普及尚需时日&#xff0c;Java技术栈的进化似乎陷入了暂时的停滞。开发者们渴望突破&#xff0c;却发现传统框架与模式已难以…

博图V16升级V19前后内存对比

升级V19后固件版本更新到4.6 存储存储空间拓展50% 下图是官方解释 打开博图查看前后对比

[笔记]某变频器,功能列表及参数表

产品代号&#xff1a;INVT GOODDRIVE&#xff0c;这家公司我的产品我似乎在特检院看到过&#xff1f;或者在某个地铁建设工地看到过。是深圳的。 1.产品功能点&#xff1a; 变频锥形电机控制、抱闸转矩验证&#xff1f;抱闸反馈零位检测行程限位超载防护轻载升速&#xff08;…

【超详细】基于YOLOv8训练无人机视角Visdrone2019数据集

主要内容如下&#xff1a; 1、Visdrone2019数据集介绍 2、下载、制作YOLO格式训练集 3、模型训练及预测 4、Onnxruntime推理 运行环境&#xff1a;Python3.8&#xff08;要求>3.8&#xff09;&#xff0c;torch1.12.0cu113&#xff08;要求>1.8&#xff09;&#xff0c…

8. 防火墙

8. 防火墙 (1) 防火墙的类型和结构 防火墙的类型和结构可以根据其在网络协议栈中的过滤层次和实现方式进行分类。常见的防火墙类型包括: 包过滤防火墙:工作在网络层(OSI模型的第3层),主要检查IP包头的信息,如源地址、目的地址、端口号等。电路级网关防火墙:工作在会话层…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支&#xff0c;切换到该分支下面&#xff0c;输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支&#xff0c;因为刚刚提交的分支在dev环境&#xff0c;所以master是没有 3、合并分支 点击push&#xff0c;将dev里面的代码合并到…

对时间序列SOTA模型Patch TST核心代码逻辑的解读

前言 Patch TST发表于ICLR23&#xff0c;其优势在于保留了局部语义信息&#xff1b;更低的计算和内存使用量&#xff1b;模型可以关注更长的历史信息&#xff0c;Patch TST显著提高了时序预测的准确性&#xff0c;Patch可以说已成为时序模型的基本操作。我在先前的一篇文章对P…

【掘金量化使用技巧】用日线合成长周期k线

掘金API中的接口最长的周期是‘1d’的&#xff0c;因此周线/月线/年线等数据需要自己进行合成。 基本思路 用日线合成长周期的k线只需要确定好合成的周期以及需要的数据即可。 周期: 一般行情软件上提供年k、月k、周k&#xff0c;我也选择年、月、周再加一个季度频率。 数据:…

Linux:终端(terminal)与终端管理器(agetty)

终端的设备文件 打开/dev目录可以发现其中有许多字符设备文件&#xff0c;例如对于我的RedHat操作系统&#xff0c;拥有tty0到tty59&#xff0c;它们是操作系统提供的终端设备。对于tty1-tty12使用ctrlaltF*可以进行快捷切换&#xff0c;下面的命令可以进行通用切换。 sudo ch…

GPU加速时代:如何用CuPy让你的Python代码飞起来?

你是不是也有这样的感受:明明写的Python代码很简洁,用NumPy处理数据也很方便,可是一跑起来就慢得像乌龟?尤其是当你面对庞大的数据集时,光是等结果出来,就已经耗掉大半天了。其实,我以前也是这么干的,直到我发现了CuPy,一个能让NumPy飞速跑起来的GPU加速神器。 你…