SpringBoot学习笔记(2)

1.静态文件访问

        使用IDEA创建Spring Boot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下即可。

        如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。

1.1直接访问

        在application.properties中直接定义过滤规则和静态资源位置:

如果要在浏览器访问这张图片,路径默认为: http://localhost:8080/zzc.webp

1.2虚拟路径访问

可以统计加一个虚拟路径,例如:在application.properties中接入:

        spring.mvc.static-path-pattern=/images/**        

        即给图片接入了一个虚拟前缀,

在浏览器中输入网址:http://localhost:8080/images/zzc.webp

1.3自定义路径(了解)

创建java类、上传图片等会自动在target下创建class类

静态资源位置为classpath:/static/

demo中编写的java类(class)如下:

 

2.文件上传原理

        表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。

        当表单的enctype="application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:key=value&key=value。一定要把enctype类型改为form-data类型。

        当表单的enctype="multipart/form-data"时,其传输数据形式如下:

        Spring Boot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。 要更改这个默认值需要在配置文件(如application.properties)中加入两个配置:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

2.1SpirngBoot实现文件上传功能

        当表单的enctype="multipart/form-data"时,可以使用MultipartFile 获取上传的文件数据,再通过transferTo方法将其写入到磁盘中。

编写类 FileUploadController:

package com.example.demo.contraller;import com.sun.net.httpserver.HttpServer;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.coyote.http11.filters.SavedRequestInputFilter;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@RestController
public class FileUploadController {@PostMapping("/upload")//等价于://@RequestMapping(value = "/uplload",method = RequestMethod.POST)public String up(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException {System.out.println(nickname);//获取图片的原始名称System.out.println(photo.getOriginalFilename());//获取图片路径System.out.println(photo.getContentType());//获取文件类型String path = request.getServletContext().getRealPath("/upload/");//获取web服务器的运行目录,因为这个web服务器最终要部署到Linux系统上去,放到云端上去//要求动态的获取到web服务器所在的位置//这个tomcat是我们IDEA自带的,若要运行在云端,那么tomcat也会运行到云端//因此定义了一个HttpServletRequest request参数,代表网络请求//String path = request.getServletContext().getRealPath("/upload/");//通过这个对象可以获取到上下文对象(web服务器),接着就可以获取其路径(.getRealPath)//request.getServletContext().getRealPath   前面这部分是动态获取的,//("/upload/")  后面这部分是不存在的,如果不存在那么就创建出来(后面函数有写的)System.out.println(path);saveFile(photo,path);//自定义一个方法,把文件存储起来return "上传成功";}private void saveFile(MultipartFile photo,String path) throws IOException{File dir = new File(path);if(!dir.exists()){dir.mkdir();}File file = new File(path + photo.getOriginalFilename());//该文件是最终存储的文件photo.transferTo(file);}
}

        获取web服务器的运行目录,因为这个web服务器最终要部署到Linux系统上去,放到云端上去;因此要求动态的获取到web服务器所在的位置。这个tomcat是我们IDEA自带的,若要运行在云端,那么tomcat也会运行到云端。因此定义了一个HttpServletRequest request参数,代表网络请求,String path = request.getServletContext().getRealPath("/upload/");通过这个对象可以获取到上下文对象(web服务器),接着就可以获取其路径(.getRealPath)

        request.getServletContext().getRealPath   前面这部分是动态获取的,("/upload/")  后面这部分是不存在的,如果不存在那么就创建出来(后面函数有写的)。

2.2上传文件

        注:使用form-data类型上传,且名称要对应起来。

运行和结果:

zhangzongchang
zzc.webp
image/webp
C:\Windows\Temp\tomcat-docbase.8080.626034175088608909\upload\
//动态路径+固定的\upload\ 如上:

自定义方法(存储文件)如下:

    private void saveFile(MultipartFile photo,String path) throws IOException{File dir = new File(path);if(!dir.exists()){
//        判断路径是否存在dir.mkdir();
//            若不存在就创建路径}File file = new File(path + photo.getOriginalFilename());//该文件是最终存储的文件//还要加上目录路径path和存储的文件名称photo.getOriginalFilename()photo.transferTo(file);//MultipartFile对象有一个transferTo()方法//该方法可以将网络上传输过来的文件存储到上面的文件目录(file)中去}

在pc上打开该目录:C:\Windows\Temp\tomcat-docbase.8080.626034175088608909\upload\

        但该目录不可以通过浏览器访问。 如果想要用户访问之前上传的头像文件,可以重新配置路径如下:spring.web.resources.static-locations=/upload/

        可以访问了:如下

3.拦截器

        拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:        

        权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。

         性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间

        通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。

3.1功能

        Spring Boot定义了HandlerInterceptor接口来实现自定义拦截器的功能

        HandlerInterceptor接口定义了preHandle(常用)、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作

 3.2拦截器的定义

例子:

重写父类里的方法: 

package com.example.demo.interceptor;//import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;public class LoginInterceptor implements HandlerInterceptor {//继承了andlerInterceptor,重写了父类里的方法preHandle@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{//request参数对应前端的请求,response给前端返回信息System.out.println("LoginInterceptor");return true;}
}

3.3拦截器注册 

拦截器定义完成后还需要进行注册,否则不能使用。

        addPathPatterns方法定义拦截的地址

        excludePathPatterns定义排除某些地址不被拦截

        添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求

        如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。

在config包下: 

package com.example.demo.config;import com.example.demo.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
//为了让这个类生效,加一个注解@Configuration,有了这个世界springboot会自动读取这个类,下面的配置才会生效
public class WebConfig implements WebMvcConfigurer{//重写父类的方法@Overridepublic void addInterceptors(InterceptorRegistry registry){//一个增加拦截器的方法registry.addInterceptor(new LoginInterceptor());//}
}

3.4测试拦截器

        运行后访问之前的http://localhost:8080/hello

 这说明在访问http://localhost:8080/hello之前就已经进入到了拦截器内部了。

 

@Configuration
//为了让这个类生效,加一个注解@Configuration,有了这个世界springboot会自动读取这个类,下面的配置才会生效
public class WebConfig implements WebMvcConfigurer{//重写父类的方法@Overridepublic void addInterceptors(InterceptorRegistry registry){//一个增加拦截器的方法registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");//代表只拦截/user/**里的}
}

刷新后发现已经不打印了,因为访问的是/hello

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Coze:如何使用主页对话框?

你好,我是三桥君 我们今天要介绍的功能模块是“主页对话框”。 目录 访问官网 登录首页 基本功能 主页对话框 第一个功能:如何与自己收藏的机器人进行对话? 第二个功能:如何请求主页对话框的机器人帮助创建一个新的机器人&#x…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十八章 Linux编写第一个自己的命令

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

【算法系列-数组】螺旋矩阵(模拟)

【算法系列-数组】螺旋矩阵(模拟) 文章目录 【算法系列-数组】螺旋矩阵(模拟)1. 螺旋矩阵II(LeetCode 59)1.1 思路分析🎯1.2 解题过程🎬1.3 代码示例🌰 2. 螺旋矩阵(LeetCode 54)2.1 思路分析🎯2.2 解题过程🎬2.3 代码…

如何使用ssm实现基于web的网站的设计与实现+vue

TOC ssm756基于web的网站的设计与实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范…

极端天气道路目标检测数据集 3400张 带标注 VOC YOLO 6类

分类名: (图片张数,标注个数) car: (3210, 13654) truck: (1168,1629) per son: (1517,4359) bicyc le: (334, 589) bus: (381, 439) motorcycle: (164, 214) 总数: (3404, 20884) 总类(nc): 6类 极端天气道路目标检测…

09_OpenCV彩色图片直方图

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inlineimg cv2.imread(computer.jpeg, 1) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show()plot绘制直方图 plt.hist(img.ravel(), 256) #ravel() 二维降一维 256灰度级…

pycharm汉化插件无法使用也无法卸载的解决方法

pycharm汉化插件无法使用也无法卸载的解决方法 本文目录: 一、故障描述 二、故障解决 零、时光宝盒 学习没有可能一帆风顺,我们都是在不断遇到的各种突发问题,不断努力解决的过程中成长。 前几天,我发现家里的网络晚上12点左右开…

初识算法 · 双指针(3)

目录 前言: 和为s的两数之和 题目解析: ​编辑 算法原理: 算法编写: 三数之和 题目解析 算法原理 算法编写 前言: 本文通过介绍和为S的两数之和,以及三数之和,对双指针算法进行深一步…

欧科云链OKLink相约TOKEN2049:更全面、多元与安全

过去几日,OKLink 与全球 Web3 从业者与爱好者们相约狮城。在多场激动人心的活动上分享了我们的产品进展、有关于链上数据的专家观点以及打磨产品的经验。同时也听到了很多来自行业的宝贵声音。跟随我们的脚步,捕捉这充实一周的精彩瞬间: 1、…

netty之基础aio,bio,nio

前言 在Java中,提供了一些关于使用IO的API,可以供开发者来读写外部数据和文件,我们称这些API为Java IO。IO是Java中比较重要知识点,且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能,目前有三种IO共…

5G NR SSB简介

文章目录 SSB介绍SSB波束扫描 SSB介绍 5G NR 引入了SSB 这个概念,同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB) 它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH…

【分页】Spring Boot 列表分页 + javaScript前台展示

后端: 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …

【10】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-泛型基础全解(泛型函数、泛型接口、泛型类)及参数、接口补充

序言: 本文详细讲解了关于ArkTs语言中的泛型,其中包含泛型函数、泛型接口、泛型约束、泛型类及其中参数的使用方法,补充了一部分接口相关的知识,包括接口的继承和具体实现,也写到了一些边边角角的小知识,剩…

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…

jmeter学习(1)线程组与发送请求

1、线程组 执行顺序 :setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1)Http请求默认值 作用范围是该线程组下的所有HTTP请求,如果http请求设置的与默认值冲突&#xff0…

PC端微信小程序如何调试?

向往常一样运行开微信小程序开发者工具 如果只弹出pc端小程序,没有出现调试的界面:点击胶囊按钮的三个…选择重新进入小程序 即可依次展开相应的功能调试,改完代码没反应再刷新看看,再没反应就再次重新点击编译并自动调试。

【学习笔记】手写 Tomcat 六

目录 一、线程池 1. 构建线程池的类 2. 创建任务 3. 执行任务 测试 二、URL编码 解决方案 测试 三、如何接收客户端发送的全部信息 解决方案 测试 四、作业 1. 了解工厂模式 2. 了解反射技术 一、线程池 昨天使用了数据库连接池,我们了解了连接池的优…

DSPy101

DSPy 介绍 DSPy(Declarative Self-improved Language Programs in Python) 是一个用于系统化和增强在流水线内使用语言模型的框架,它通过数据驱动和意图驱动的系统来优化大型语言模型(LLM)的使用。 DSPy 的核心是模块…

C语言的内存结构

在电脑中C语言编译器也像其他软件一样占用一块内存空间。 为了更好的利用好这块内存,C语言将他们分为 在C语言中,变量定义的位置不一样,那么在内存中所处的位置也是不一样的。(变量在函数内部是存储在栈里,而在函数外部…

闯关训练三:Git 基础知识

任务1: 破冰活动:自我介绍 点击Fork目标项目,创建一个新的Fork 获取仓库链接 在连接好开发机的vscode终端中逐行执行以下代码: git clone https://github.com/KelvinIII/Tutorial.git # 修改为自己frok的仓库 cd Tutorial/ git branch -a g…