当前位置: 首页 > news >正文

五、JSP05 分页查询及文件上传

五、JSP 分页查询及文件上传

5.1 使用分页显示数据

通过网络搜索数据时最常用的操作,但当数据量很大时,页面就会变得冗长,用户必须拖动才能浏览更多的数据

分页是把数据库中需要展示的数据逐页分步展示给用户

以分页的形式显示数据,使数据更加清晰直观

页面不在冗长,也不受数据量的限制

5.1.1 如何实现分页

  • 首先,要实现数据分页,可以参考以下几个关键步骤
    • 确定数据的总量
    • 确定每页需要显示的数据数量
    • 计算数据可以显示的总页数
    • 确定 当前显示的为第几页

1、确定数据的总量

  • 确定你要查询的数据的总行
  • 之后可以根据数据总量以及每页显示的数据数量求出显示的总页数
  • 在数据库中可以使用聚合函数 count() 来查询数据总量

2、确定每页需要显示的数据数量

  • 每页需要显示的数据数量,即每次需要从数据库中查询出多少条记录用于页面显示
  • 这个数量是用户自己定义好的

3、计算数据可以显示的总页数

  • 分页功能经常会提示用户按照每页显示的记录数总共会产生多少页数据
  • 每次页面中显示的记录数是已知的
  • 可以使用数据的总量除以每页显示的数据数量,来得到可以显示的总页数
  • 要注意,如果数据的总量除以每页显示的数据数量,如果纯在余数,需要显示的总页数加一

4、实现获取指定页码的数据记录

  • 使用 SQL 语句查询是实现数据分页的关键

  • 使用 SQL 语句中的 LIMIT 子句实现分页需求,来查询每页的数据

  • 使用 LIMIT 查询每页的数据具体语法如下

  • //LIMIT 参数如下
    LIMIT (当前页数-1)*每页显示的数据数量,每页显示的数据数量
    

5.1.2 实现分页的具体步骤

  • 创建一个实体类,将有关分页的数据封装到一个类中

  • 代码示例

 import java.util.List;public class Page {//总数量private int totalCount;//总页数private int totalPageCount;//每页显示的数量,这里设置每页显示10个private int pageSize=10;//当前页数private int currPageNo;//存储数据的集合private List list;public int getTotalCount() {return totalCount;}public void setTotalCount(int totalCount) {this.totalCount = totalCount;}public int getTotalPageCount() {return totalPageCount;}public void setTotalPageCount(int totalPageCount) {//计算总页数this.totalPageCount =this.totalCount%pageSize==0?(this.totalCount/pageSize):(this.totalCount/pageSize+1);}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getCurrPageNo() {return currPageNo;}public void setCurrPageNo(int currPageNo) {this.currPageNo = currPageNo;}public List getList() {return list;}public void setList(List list) {}
}
  • 当在一个 JavaBean 接口的实现类中可将 Page 实体类当做参数
  • 通过 Page 实体类中的各种参数,来编写 SQL 语句以此进行分页查询

5.2 实现文件上传

使用文件上传,需要借助一些使用的第三方文件上传工具

我这里使用的是 commons-fileupload 和 commons-io 依赖

提供了对文件上传的支持,内置的一些方法方便我们更好的上传文件

上传文件的 Maven 依赖

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.2</version>
</dependency>

5.2.1 页面中的表单元素

1、表单的属性设置

  • HTTP 实现上传文件时需要用到表单元素
  • 需要设置表单的 enctype 属性,该属性用于设置表达提交数据的编码方式
  • 其使用的 multipart/form-data 的编码方式
<form action enctype="mutilpart/form-data" method="psot">

2、使用 File 组件选择文件

  • 通过设置 input 标签的 type 属性可以在页面中添加不同类型的控件
  • 如要实现文件上传,则需要使用 File 控件
<input type="file" name="ufile">

5.2.2 ServletFileUpload API详解

  • ServletFileUpload 类是 Apache 组件处理文件上传的核心高级类

  • 内置的一些方法可以方便地进行文件上传

  • ServletFileUpload 常用方法

方法描述
List<FileItem> parseRequest(Request request)解析 Request对象,得到所有上传的数据
然后返回一个 FileItem 类型的 集合
boolean isMultipartContent(Request request)用于判断是否是上传,可以简单理解,就是判断
是否有 encType="multipart/form-data"如果存在才会执行文件上传
void setFileSizeMax(long fileSizeMax)设置单个文件上传大小
void setSizeMax(long sizeMax)设置总文件上传大小

5.2.3 FileItem 类 详解

  • ServletFileUpload 对象将 Request 中的每个数据都单独转成 FileItem 类型的数据
  • 可以使用 FileItem 中的一些方法来对这些数据进行操作
  • FileItem 常用方法
方法
boolean isFormField()判断数据是文件类型表单还是普通类型表单
String getFieldName()获取普通类型表单的 name 值
String getName()获取文件类型表单的 name 值
String getString()获取表单当中的值
InputStream getInputStream()获取输入流
void write(File file)写入文件

5.2.4 通过 ServletFileUpload 实现文件上传 详解

  • 上传文件之前,需要先确认上传的路径
  • 上传路径应当为 Tomcat 服务器中的文件路径,而不是本地路径
  • 因为项目在运行时,会部署在 Tomcat 服务器当中,如果你直接上传到了本地,第一次不会显示,需要重启项目才会显示
  • 因此需要获取到 Tomcat 服务器当中的地址
  • 项目中的 target 文件夹下的东西就是部署在 Tomcat 中的资源

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9XlVmH9-1685591009448)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20230601112942898.png)]

  • 因此可以使用 Request 中的方法来获取到 target 的具体路径
  • 获取 target 路径语法如下
String imgPath=req.getSession().getServletContext().getRealPath("imges/");
  • 其中 req.getSession().getServletContext() 表示获取 target 路径
  • **getRealPath("imges/") 表示在 target 路径下面查找 imges 文件夹 **
  • 也可以在 项目结构当中设置 req.getSession().getServletContext() 获取的路径

image-20230601113309875

image-20230601113336581

  • 输出目录则是 req.getSession().getServletContext() 获取的路径
  • 文件上传需要使用 ServletFileUpload 类,但是创建 ServletFileUpload 类 需要使用到 FileItemFactory 工厂类
  • 因此创建 ServletFileUpload 对象之前,需要先创建 FileIteamFactory 类工厂,当做参数传给 ServletFileUpload 对象
  • 创建 ServletFileUpload 示例
FileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);

5.2.5 ServletUpload 上传文件示例

  • 在代码中实现文件上传功能的具体案例
package com.example.demo01.servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;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.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;@WebServlet("/ser01")public class Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html; charset=UTF-8");//创建 ServletFileUpload 对象FileItemFactory factory=new DiskFileItemFactory();ServletFileUpload upload=new ServletFileUpload(factory);//上传文件的路径String imgPath=req.getSession().getServletContext().getRealPath("imges/");System.out.println("tomcat"+imgPath);//判断表单是否时多类型表单Boolean isMultipart=ServletFileUpload.isMultipartContent(req);if(isMultipart){try {List<FileItem> fileItems=upload.parseRequest(req);Iterator<FileItem> iterator=fileItems.iterator();while (iterator.hasNext()) {FileItem item=iterator.next();if(item.isFormField()){//输出 普通类型表单的 nameSystem.out.println(item.getFieldName());//输出 普通类型表单的 value 值System.out.println(item.getString());}else {String fileName=item.getName();//判断文件是否上传,文件名是否为空if(fileName!=null&&!"".equals(fileName)){//修改文件的名字,获取系统毫秒值,防止文件名重复导致错误String newsFileName=System.currentTimeMillis()+item.getName();//创建 File 类型对象,将 上传路径以及文件名当作参数传入File file=new File(imgPath,newsFileName);//上传文件到指定的路径item.write(file);System.out.println(newsFileName);}}}} catch (FileUploadException e) {throw new RuntimeException(e);} catch (Exception e) {throw new RuntimeException(e);}}//响应resp.sendRedirect("index.jsp");}
}
                }}} catch (FileUploadException e) {throw new RuntimeException(e);} catch (Exception e) {throw new RuntimeException(e);}}//响应resp.sendRedirect("index.jsp");
}

}


相关文章:

五、JSP05 分页查询及文件上传

五、JSP 分页查询及文件上传 5.1 使用分页显示数据 通过网络搜索数据时最常用的操作&#xff0c;但当数据量很大时&#xff0c;页面就会变得冗长&#xff0c;用户必须拖动才能浏览更多的数据 分页是把数据库中需要展示的数据逐页分步展示给用户 以分页的形式显示数据&#xff…...

一起看 I/O | 借助 Google Play 管理中心价格实验,优化定价策略

作者 / Google Play 产品经理 Phalene Gowling 今年 Google I/O 大会上的 "通过 Google Play Commerce 提升收益" 演讲重点为您介绍了深度集成至 Google Play 的最新创收工具。此工具专注于帮您优化定价策略。为您的产品或内容确定合适的价格是实现更出色的用户生命周…...

hexview 命令行操作使用说明

hexview 命令行操作使用说明 命令行操作基础格式 hexview.exe infile [option] -o outfile提取部分内容 hexview.exe app.hex /AR:0X200000-0X303404 /s /XI -o app1.hex/AR&#xff1a;指定提取的范围。&#xff08;也可以使用/CR&#xff0c;它可以指定多个范围&#xff0…...

vue3+element plus,使用分页total修改成中文

vue3element plus&#xff0c;使用分页total修改成中文 使用element plus的分页功能 el-pagination 的时候&#xff0c;total属性显示是英文 这是我建的一个新项目&#xff0c;总数显示的Total 1000 我们的需求是显示中文&#xff0c;共 1000 条 这个就很尴尬&#xff0c;组件…...

RPC、HTTP、DSF、Dubbo,每个都眼熟,就是不知道有什么联系?

一、HTTP 和 RPC 首先&#xff0c;http 与 rpc 有什么区别这个问题不太严谨&#xff0c;因为这俩就不是一个层级的东西。 HTTP 这个大家太熟悉了吧&#xff1f;日常接触最多的恐怕就是各种http协议的接口了。 没错&#xff0c;http它是一个协议。 其他在这里就不打算铺开了…...

java.security.MessageDigest的用法

java.security.MessageDigest MessageDigest的含义 message含义是:消息,信息 digest的含义是 digest 必应词典 n.摘要&#xff1b;文摘&#xff1b;概要&#xff1b;汇编 v.消化&#xff1b;领会&#xff1b;领悟&#xff1b;理解 海词 n. 摘要 vt. 消化&#xff1b;理解 vi…...

3.2 分析特征间的关系

3.2 分析特征间的关系 3.2.1 绘制散点图 scatter()例子1&#xff1a;绘制2000-2017年各季度国民生产总值散点图例子2&#xff1a;使用不同颜色不同形状的点&#xff0c;绘制2000-2017年各产业各季度国民生产总值散点图 3.2.2 绘制折线图 plot()例子1&#xff1a;绘制2000-2017年…...

Numpy学习

Numpy官方手册&#xff1a;Array objects — NumPy v1.24 Manual 创建数组 1.1 从现有数据创建 重要类型 np.ndarray # 判断是否可以迭代 注意0维标量不可以遍历 print(__iter__ in dir(np.ndarray) and __getitem__ in dir(np.ndarray))np.array(object, dtypeNone) objec…...

IDC机房相电压与线电压的关系

380V电动机&#xff08;三相空调压缩机&#xff09;的电流计算公式为&#xff1a;Ⅰ&#xff1d;额定功率&#xff08;1.732额定电压功率因数效率&#xff09;。 功率因数是电力系统的一个重要的技术数据。功率因数是衡量电气设备效率高低的一个系数。功率因数低&#xff0c;说…...

chatgpt赋能python:Python如何设置输入的SEO

Python如何设置输入的SEO Python是一种高级的编程语言&#xff0c;具有容易上手、可扩展和开源等特点&#xff0c;因此在软件开发过程中得到广泛的应用。然而&#xff0c;如果您想让您的Python项目在搜索引擎上获得更好的排名和流量&#xff0c;您需要考虑如何设置输入的SEO。…...

Spring Cloud Alibaba — Nacos 构建服务注册中心

文章目录 Nacos Server下载启动登录创建命名空间 Nacos Client启动样例Nacos 服务发现配置项 集成 OpenFeign 远程接口调用添加 OpenFeign 依赖开启 EnableFeignClients 注解编写远程服务接口远程接口调用 集成 Sentinel 熔断降级添加 Sentinel 依赖开启 Sentinel 熔断降级编写…...

4.2 Spark SQL数据源 - 基本操作

一、默认数据源 案例演示读取Parquet文件 查看Spark的样例数据文件users.parquet 1、在Spark Shell中演示 启动Spark Shell 查看数据帧内容 查看数据帧模式 对数据帧指定列进行查询&#xff0c;查询结果依然是数据帧&#xff0c;然后通过write成员的save()方法写入HDF…...

事件相关功能磁共振波谱技术(fMRS)

导读 质子磁共振波谱(MRS)是一种非侵入性脑成像技术&#xff0c;用于测量不同神经化学物质的浓度。“单体素”MRS数据通常在几分钟内采集&#xff0c;然后对单个瞬态进行平均&#xff0c;从而测量神经化学物质浓度。然而&#xff0c;这种方法对更快速的神经化学物质的时间动态…...

跨境电商客户服务五步法

互联网技术的革新与升级对商务客服产生了巨大的影响&#xff0c;过去由在线客服与客户直接电联的单一服务形式被全渠道客服系统所替代。在电子商务时代&#xff0c;商家与客户之间的互动变得尤为重要&#xff1a;一方面&#xff0c;卖家通过分析客户喜好及消费趋向来针对性处理…...

hadoop环境配置及HDFS配置

环境与配置 ubuntu 20.04.6 /centos8hadoop 3.3.5 指令有部分不一样但是,配置是相同的 安装步骤 创建一个虚拟机,克隆三个虚拟机,master内存改大一点4G,salve内存1Gj修改主机名和配置静态ip(管理员模式下)) hostnamectl set-hostname node1 # 修改主机名 sudo passwd root …...

HTML中 meta的基本应用

meta 标签的定义 meta 标签是 head 部分的一个辅助性标签&#xff0c;提供关于 HTML 文档的元数据。它并不会显示在页面上&#xff0c;但对于机器是可读的。可用于浏览器&#xff08;如何显示内容或重新加载页面&#xff09;&#xff0c;搜索引擎&#xff08;SEO&#xff09;或…...

docker compose 下 Redis 主备配置

1、准备两台虚拟机或者物理机 node1 IP&#xff1a;192.168.123.78 node2 IP&#xff1a;192.168.123.82 2、安装docker和docker compose 3、安装node1&#xff0c;配置docker-compose.yml version: 3services:redis-rs1:container_name: redis_node1image: redis:5.0.3rest…...

Tomcat ServletConfig和ServletContext接口概述

ServletConfig是一个接口&#xff0c;是Servlet规范中的一员 WEB服务器实现了ServletConfig接口&#xff0c;这里指的是Tomcat服务器 一个Servlet对象中有一个ServletConfig对象&#xff0c;Servlet和ServletConfig对象是一对一 ServletConfig对象是Tomcat服务器创建的&#xf…...

linux内核open文件流程

打开文件流程 本文基本Linux5.15 当应用层通过open api打开一个文件&#xff0c;内核中究竟如何处理&#xff1f; 本身用来描述内核中对应open 系统调用的处理流程。 数据结构 fdtable 一个进程可以打开很多文件&#xff0c; 内核用fdtable来管理这些文件。 include/linu…...

遗传算法讲解

遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09; 是模拟生物在自然环境中的遗传和进化的过程而形成的自适应全局优化搜索算法。它借用了生物遗传学的观点&#xff0c;通过自然选择、遗传和变异等作用机制&#xff0c;实现各个个体适应性的提高。 基因型 (G…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...