SpringBoot笔记(3)-Web开发基本功能

利用SpringBoot,我们可以快速开发一个Web项目。不过SpringBoot本身的功能主要在于简化配置,Web项目中一些核心功能还是由SpringMVC来提供。下面的介绍中有很多是对SpringMVC的复习,可以结合SpringMVC的笔记一起学习。

静态资源

静态资源存放与访问

在SpringBoot中,静态资源有默认的存放位置,可选的位置有/static/public/resources/META-INF/resources。注意这里的resources路径是指定名称,而不是IDEA项目下的resources。将静态资源放置在对应位置上后,前端访问需要通过项目根路径名/静态资源名称,而不需要在意默认的存放位置。

上面是默认的存放位置,当然我们也可以在配置文件中指定对应属性来改变静态资源存放的位置。设置之后,原来默认的位置将会失效。

1
2
3
4
spring:
web:
resources:
static-locations: [classpath:/haha/]

实际上,上面的属性对应一个String数组,它的默认值如下:

1
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

默认的访问路径是项目根路径+静态资源名称。这个属性也是能够修改的,对应属性值如下:

1
2
3
spring:
mvc:
static-path-pattern: /haha/**

上面属性对应一个String类型的值,默认值为/**

这里静态资源的处理模式就是SpringMVC中的模式。

在SpringMVC中,我们需要在配置文件中开启<mvc:default-servlet-handler>以及<mvc:annotation-driven>,之后所有的请求会先交给DispatcherServlet进行处理,如果无法处理如静态资源,再交给DefaultServlet处理,如果仍然无法处理则响应404页面。

由于SpringBoot帮助我们简化了配置,因此可以直接使用。

对于一些css和js资源文件,我们可以使用jar的形式引入,我们称之为webjar(WebJars - Web Libraries in Jars)。例如我们可以通过下面的方式来引入jquery:

1
2
3
4
5
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.5.1</version>
</dependency>

这些资源也是作为静态资源引入的,可以通过前端访问得到。需要注意,对应的访问地址需要参照依赖jar包中的包路径。

欢迎页与图标

在SpringBoot中,可以设置index.html欢迎页。有两种方式,第一种是静态资源路径下的index.html,不过此时不能配置静态资源的访问路径,否则会导致index.html不能被默认访问。第二种方式是配置一个Controller能够处理/index的请求,因为欢迎页对应的地址就是项目访问路径+/index。

另一方面,SpringBoot中能够定义网页图标,只需要将图标名称修改为favicon.ico并将其放在静态资源目录下即可。

请求处理

请求映射

请求处理即通过@RequestMapping注解来设置访问路径与处理器对象之间的映射。在这个注解中可以指定method属性来设置访问方法,也可以使用封装了访问属性的注解,包括@GetMapping@PostMapping@PutMapping@DeleteMapping,用于匹配不同的访问方式。

SpringMVC笔记(4)-SpringMVC中的RESTful与Ajax - EverNorif中我们学习过,如果想要在SpringMVC中发送put和delete方式的请求,需要利用到提供的HiddenHttpMethodFilter类,当时我们使用的方式是在web.xml中进行配置。而在SpringBoot中,默认没有开启该功能,我们需要在配置文件中配置开启:

1
2
3
4
5
spring:
mvc:
hiddenmethod:
filter:
enabled: true

这种方式是通过在SpringMVC中发送put和delete方式的请求。不过在前后端分离的场景下,有其他方式能够发送对应请求,那么也无需使用到这里的配置。

参数获取

参数获取使用的大都是SpringMVC中的注解,详细可以参考SpringMVC的相关笔记,这里只是进行一个小总结:

  • @PathVariable:获取路径变量,即在路径占位符中出现的变量,举例来说对应的映射路径为@RequestMapping("/testRest/{id}/{username}")

  • @RequestParam:获取请求参数,即出现在url中?后面的参数

  • @RequestHeader:获取请求头

  • @CookieValue:获取Cookie数据

  • @RequestBody:获取请求体数据

  • @RequestAttribute:获取Request域的数据

  • @MatrixVariable:获取矩阵变量数据

这里需要介绍一下矩阵变量。在url中,我们可以在路径中使用;拼接一些参数,例如/cat;name=haha;age=18,这里出现在分号后面的name和age就是矩阵变量,注解@MatrixVariable就是用来获取这些变量的。

在SpringBoot中默认禁用了矩阵变量的功能,默认会忽略这部分参数。在SpringBoot中,url解析的功能是由类UrlPathHelper来完成的,在自动配置的IOC容器中也会配置该类。矩阵变量的处理对应其中的removeSemicolonContent,将其设置为true表示忽略参数,设置为false则不忽略。不过需要注意的是,矩阵变量必须有url中路径变量才能被解析。

由于在SpringBoot的自动配置中,如果对应的类已经由用户配置了,那么SpringBoot就不会自动配置而是会使用用户配置的类,因此我们可以利用这一特性来提供一个UrlPathHelper,开启矩阵变量之后,手动配置到IOC容器中。

有两种方式,第一种是让配置类实现WebMvcConfigurer接口,在其中设置对应的类:

1
2
3
4
5
6
7
8
9
10
11
@Configuration(proxyBeanMethods = false)
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {

UrlPathHelper urlPathHelper = new UrlPathHelper();
// 不移除;后面的内容。矩阵变量功能就可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}

第二种方式是直接在配置类中返回WebMvcConfigurerBean对象,当然也需要在其中设置对应的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration(proxyBeanMethods = false)
public class WebConfig{
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
// 不移除;后面的内容。矩阵变量功能就可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
}
}

响应处理

返回json数据

在SpringMVC中,一个处理器方法可以返回json数据,这也是在前后端分离场景下最常用的做法。在之前的SpringMVC中,返回json数据需要先导入jackson的依赖,开启mvc的注解驱动,之后使用@ResponseBody注解,声明该处理器方法返回的是json数据。

在SpringBoot中已经帮助我们完成了自动配置,只需要使用对应注解即可。同时返回值可以是String,也可以是对象,系统会自动将其转换为json的格式。

模板引擎Thymeleaf

在SpringMVC中,我们还可以返回一个视图名称,用来表示页面跳转的关系。之前的学习中我们使用的是Thymeleaf模板引擎,我们需要自己配置Thymeleaf视图解析器,在其中指定视图前缀,视图后缀等。

在SpringBoot中,如果我们想要使用Thymeleaf,非常简单,只需要引入Starter即可:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

通过启动器,SpringBoot帮助我们完成了自动配置。其中Thymeleaf的所有配置都在ThymeleafProperties中,配置好了ThymeleafViewResolver,配置好了SpringTemplateEngine,并且默认的视图前缀为classpath:/templates/,视图后缀为.html。所有配置都自动完成,我们只需要直接开发页面即可。

拦截器

在SpringMVC中,我们实现拦截器,需要实现HandlerInterceptor接口,重写其中的方法,之后将拦截器注册到IOC容器当中。我们可以在配置文件中使用<mvc:interceptors>标签来注册拦截类,同时可以指定拦截规则。

在SpringBoot中实现拦截器也是同样的流程,只是其中将拦截器注册到IOC容器中这一过程,我们通过实现WebMvcConfigurer的配置类来完成,实现接口的addInterceptors方法,在其中增加拦截器,并用链式调用指定拦截规则。

1
2
3
4
5
6
7
8
9
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()) // 注册拦截器
.addPathPatterns("/**") // 拦截请求路径
.excludePathPatterns("/login", "/pet"); // 放行请求路径
}
}

注意这里/**表示拦截所有请求,包括静态资源。

错误处理

SpringBoot中有默认的错误处理机制。如果是浏览器错误访问,则会返回一个Whitelabel Error Page,如果是客户端错误访问,则会返回一个Json响应,其中包含错误、Http状态、异常消息等。默认情况下,提供一个/error路径的视图来作为所有错误的映射。

同时我们可以自定义错误页,将错误页放在/templates/error/目录下,命名为404.html4xx.html或者5xx.html。这些错误页将会被自动解析有精确的错误状态码页面就匹配精确,没有就找xx匹配,如果都没有就触发白页。

文件上传

SpringMVC中的文件上传和下载可以参考:SpringMVC笔记(5)-SpringMVC中文件上传和下载 - EverNorif。其中文件下载有着固定的套路,需要指定返回值为ResponseEntity<byte[]>,然后按照固定流程即可。

而对于文件上传,上传的文件需要先封装成MultipartFile对象,之后才能进行处理。之前我们需要添加相关依赖commons-fileupload,并且需要在配置文件中配置MultipartFileBean对象,不过在SpringBoot中,这些同样被自动配置完成了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@PostMapping("/upload")
public String upload(@RequestPart("headerImg") MultipartFile headerImg,
@RequestPart("photos") MultipartFile[] photos) throws IOException {
// 单文件
if(!headerImg.isEmpty()){
//保存到文件服务器,OSS服务器
String originalFilename = headerImg.getOriginalFilename();
headerImg.transferTo(new File("/files/"+originalFilename));
}

// 多文件
for (MultipartFile photo : photos) {
if(!photo.isEmpty()){
String originalFilename = photo.getOriginalFilename();
photo.transferTo(new File("/files/"+originalFilename));
}
}


return "success";
}

文件上传相关的配置类有:

  • org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
  • org.springframework.boot.autoconfigure.web.servlet.MultipartProperties

我们可以在配置类中查看有哪些配置项,也可以查看官方文档。例如文件大小相关的配置项如下:

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

SpringBoot笔记(3)-Web开发基本功能
http://example.com/2022/11/03/SpringBoot笔记-3-Web开发基本功能/
作者
EverNorif
发布于
2022年11月3日
许可协议