有网站怎么做app/seo短视频发布页
五、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()
获取的路径
- 输出目录则是
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 使用分页显示数据 通过网络搜索数据时最常用的操作,但当数据量很大时,页面就会变得冗长,用户必须拖动才能浏览更多的数据 分页是把数据库中需要展示的数据逐页分步展示给用户 以分页的形式显示数据ÿ…...

一起看 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:指定提取的范围。(也可以使用/CR,它可以指定多个范围࿰…...

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

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

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

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

Numpy学习
Numpy官方手册: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电动机(三相空调压缩机)的电流计算公式为:Ⅰ=额定功率(1.732额定电压功率因数效率)。 功率因数是电力系统的一个重要的技术数据。功率因数是衡量电气设备效率高低的一个系数。功率因数低,说…...

chatgpt赋能python:Python如何设置输入的SEO
Python如何设置输入的SEO Python是一种高级的编程语言,具有容易上手、可扩展和开源等特点,因此在软件开发过程中得到广泛的应用。然而,如果您想让您的Python项目在搜索引擎上获得更好的排名和流量,您需要考虑如何设置输入的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 查看数据帧内容 查看数据帧模式 对数据帧指定列进行查询,查询结果依然是数据帧,然后通过write成员的save()方法写入HDF…...

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

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

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 部分的一个辅助性标签,提供关于 HTML 文档的元数据。它并不会显示在页面上,但对于机器是可读的。可用于浏览器(如何显示内容或重新加载页面),搜索引擎(SEO)或…...

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

Tomcat ServletConfig和ServletContext接口概述
ServletConfig是一个接口,是Servlet规范中的一员 WEB服务器实现了ServletConfig接口,这里指的是Tomcat服务器 一个Servlet对象中有一个ServletConfig对象,Servlet和ServletConfig对象是一对一 ServletConfig对象是Tomcat服务器创建的…...

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

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

PostgreSQL修炼之道之高可用性方案设计(十六)
20 高可用性方案设计(一) 在一个生产系统中,通常都需要用高可用方案来保证系统的不间断运行。本章将详细介绍如何实现PostgreSQL数据库的高可用方案。 20.1 高可用架构基础 通常数据库的高可用方案都是让多个数据库服务器协同工作࿰…...

Bybit面经
缘起 V2EX有广告内推,看描述还挺不错 贴主5 年半工作经验,有两年大厂工作经历,20 年 11 月来到新加坡分公司开始工作 后来是猎头Jeff找的我 0318 主面 主要一个面试官是后端开发金融背景 某条金融线的负责人;其余是交叉面试。面…...

GORM---创建
目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义 定义一个PersonInfo结构体。 type PersonInfo struct {Id uint64 gorm:"column:id;primary_key;NOT NULL" json:"id"UserName string gorm:"co…...

高级查询 — 分组汇总
关于分组汇总 1.概述 将查询结果按某一列或者多列的值分组。 group by子句 分组后聚合函数将作用于每一个组,即每一组都有一个函数值。 语法 select 字段列表 from 表名 where 筛选条件 group by 分组的字段;select 字段列表 from 表名 group by 分组的字段 hav…...

【多线程】阻塞队列
1. 认识阻塞队列和消息队列 阻塞队列也是一个队列,也是一个特殊的队列,也遵守先进先出的原则,但是带有特殊的功能。 如果阻塞队列为空,执行出队列操作,就会阻塞等待,阻塞到另一个线程往阻塞队列中添加元素(…...

python2升级python3
查看当前版本 [roottest-01 node-v18.16.0]# python -V Python 2.7.5 安装依赖 [roottest-01 node-v18.16.0]# yum install -y gcc gcc-c zlib zlib-devel readline-devel 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base…...

Apache Hudi初探(八)(与spark的结合)--非bulk_insert模式
背景 之前讨论的都是’hoodie.datasource.write.operation’:bulk_insert’的前提下,在这种模式下,是没有json文件的已形成如下的文件: /dt1/.hoodie_partition_metadata /dt1/2ffe3579-6ddb-4c5f-bf03-5c1b5dfce0a0-0_0-41263-0_202305282…...

Java之旅(九)
Java 循环语句 Java 中的循环语句包括 for、while 和 do-while,它们都可以用于实现循环结构。 for 语句用于循环执行一段代码块,直到给定的条件表达式的布尔值为 false。 for 语句的一般格式如下: for (initialization; condition; update…...

6年测试经验之谈,为什么要做自动化测试?
一、自动化测试 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。 个人认为,只要能服务于测试工作,能够帮助我们提升工作效率的,不管是所谓的自动化工具,还是简单的SQL 脚本、批处理脚本,还是自己编写…...

二分法的边界条件 2517. 礼盒的最大甜蜜度
2517. 礼盒的最大甜蜜度 给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。 商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。 返回礼盒的 最大 甜蜜度。 记录一…...