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

news2025/6/12 8:14:12

五、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 {
    @Override
    protected 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()){
                        //输出 普通类型表单的 name
                        System.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");
}

}


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

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

相关文章

Elasticsearch 8.X “图搜图”实战

1、什么是图搜图&#xff1f; "图搜图"指的是通过图像搜索的一种方法&#xff0c;用户可以通过上传一张图片&#xff0c;搜索引擎会返回类似或者相关的图片结果。这种搜索方式不需要用户输入文字&#xff0c;而是通过比较图片的视觉信息来找到相似或相关的图片。这项…

Tomcat服务器的安装即相关介绍

一、Tomcat的安装步骤 1、访问官网下载点击此处进入Tomcat官网&#xff1b; 2、在下图所示位置点击想要下载的版本下载&#xff0c;这边演示的是以Tomcat8为演示对象&#xff1b; 3、进入下载页面如下图所示&#xff0c;根据系统类型和版本选择合适的安装包&#xff1b; 4、下…

Wampsever升级增加php5.6的方法过程

1、下载wampserver2.5&#xff0c;文件包名&#xff1a;wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b.exe https://sourceforge.net/projects/wampserver/files/WampServer%202/Wampserver%202.5/ 这个版本只有40M&#xff0c;包含&#xff1a; Apache-2.4.9&#x…

SpringCloud OpenFeign 学习

SpringCloud OpenFeign 文章目录 SpringCloud OpenFeign1 OpenFeign介绍2 OpenFeign-应用实例3 OpenFeign 测试 1 OpenFeign介绍 OpenFeign 是个声明式 WebService 客户端&#xff0c;使用 OpenFeign 让编写 Web Service 客户端 更简单 它的使用方法是定义一个服务接口然后在上…

【Java 抽象类抽象方法】什么是抽象类方法,如何定义,起什么作用?

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; Java | 从入门到入坟 Java 抽象类 & 抽象方法 抽象类的概念 &#x1f445;抽象方法的概念 &#x1f42c;抽象类和抽象方法结合使用 &#x1f984; Java中的抽象类和抽象方法是面向对象编程中的重要概念&#xff0c;…

【系统学习】Java基础4之lamda表达式和函数式接口

lamda表达式与函数式接口 lamda表达式 语法格式一&#xff1a;无参&#xff0c;无返回值 Lambda 需要一个参数&#xff0c;但是没有返回值 语法格式三&#xff1a;数据类型可以省略&#xff0c;因为可由编译器推断得出&#xff0c;称为“类型推断” 语法格式四&#xff1a;…

MySQL和Redis之间的存储区别

概述 MySQL是一种关系型数据库&#xff0c;而Redis是一种键值对存储数据库。虽然它们都是用来存储和管理数据的&#xff0c;但是它们在很多方面都有不同&#xff0c;但是它们在存储策略、日志存储方式、硬盘存储、数据恢复等方面都有一定的区别。 数据类型 MySQL支持多种数据…

电脑怎么通过网络传输文件?

可以通过网络在电脑之间传输文件吗&#xff1f; “由于天气的原因&#xff0c;我的老板决定让所有员工在家工作。但是我很多工作文件都在公司的电脑中&#xff0c;怎么才能将公司的文件远程传输到我家里的电脑上&#xff1f;电脑可以通过网络远程传输文件吗&#xff1f;” …

计算机网络 | I/O模型、网络模型(OSI七层及TCP/IP四层)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Python快速实现网页工具的利器

Python快速实现网页工具的利器 Streamlit是一个基于Python的Web应用程序开发框架&#xff0c;它具有快速开发、交互式、易于使用等特点。使用Streamlit&#xff0c;开发者可以很容易地将Python代码转换为漂亮的、交互式的Web应用程序&#xff0c;无需繁琐的前端开发经验。 如果…

什么是浪涌保护器SPD

浪涌保护器&#xff08;SPD&#xff09;&#xff0c;也称为电涌保护器&#xff0c;是为各种电子设备&#xff0c;仪器和通信线路提供安全保护的电子设备。当由于外部干扰在电路或通信电路中突然产生尖峰电流或电压时&#xff0c;浪涌保护装置可以在很短的时间内传导和分流&…

设计模式之~策略模式

策略模式&#xff08;Strategy&#xff09;&#xff1a; 它定义了算法家族&#xff0c;分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;此模式让算法的变化&#xff0c;不会影响到使用算法的客户。 结构图&#xff1a; 实例&#xff1a; 优点&#xff1a; 策略模式…

MySQL行锁浅析

概述 MySQL是非常流行的关系型数据库&#xff0c;许多系统都使用它来存储和管理数据。在高并发环境下&#xff0c;为了保证数据的一致性和可靠性&#xff0c;数据库需要实现并发控制&#xff0c;其中包括锁机制。MySQL提供了两种锁类型&#xff0c;一种是表级锁&#xff0c;另…

Java遍历Map集合,获取key、value等方式

首先构建一个Map集合&#xff1a; Map<String, Integer> buynew HashMap<>();buy.put("苹果手机", 2);//添加键值对buy.put("智能手表", 1);buy.put("java书", 1);buy.put("c语言书", 1);buy.put("西瓜", 2);打…

Git已经在本地提交过文件了,但又给撤销了,恢复已经撤销的内容

Git&#xff0c;我已经在本地提交过文件了&#xff0c;也就是已经执行了git commit -m "xxx"&#xff0c;但提交完之后又给撤销了&#xff0c;撤销的还能回来嘛&#xff1f; 这种情况仍然有机会恢复它。撤销提交的方法取决于你撤销提交的方式。 说白了就是&#xff0…

背景 | 基于 Transformers 的编码器-解码器模型

!pip install transformers4.2.1 !pip install sentencepiece0.1.95 Vaswani 等人在其名作 Attention is all you need 中首创了 基于 transformer 的编码器-解码器模型&#xff0c;如今已成为自然语言处理 (natural language processing&#xff0c;NLP) 领域编码器-解码器架构…

深度解读生命周期函数

目录 前言什么是生命周期&#xff1f;生命周期的流程创建组件初始化事件和生命周期初始化组件判断渲染结构的数据与模板生成HTML结构渲染HTML结构数据更新初步销毁组件销毁组件 生命周期函数beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed 前…

视觉SLAM数据集(二):EuRoC DataSet

本文展示了在微型飞行器&#xff08;MAV&#xff09;上收集的视觉惯性数据集。数据集包含立体图像、同步 IMU 测量以及精确的运动和结构地面实况。 这些数据集发表于&#xff1a;M. Burri&#xff0c;J. Nikolic&#xff0c;P. Gohl&#xff0c;T. Schneider&#xff0c;J. Reh…

运维监控Zabbix部署——详细图文讲解

运维监控Zabbix部署 简介 Zabbix 由 Alexei Vladishev 创建&#xff0c;目前由其成立的公司—— Zabbix SIA 积极的持续开发更新维护&#xff0c; 并为用户提供技术支持服务。 Zabbix 是一个企业级分布式开源监控解决方案。 Zabbix 软件能够监控众多网络参数和服务器的健康…

StarRocks案例2: 升级后性能变慢

文章目录 一. 问题描述二. 解决方案2.1 从慢查询定位2.2 定位CPU解析时间就的问题 一. 问题描述 2023-05-18 将StarRocks从2.3.0升级到2.5.5。 升级完成后&#xff0c;所有的查询均比较慢&#xff0c;前端报表页面点开也卡。 二. 解决方案 2.1 从慢查询定位 StarRocks慢查询…