SpringBoot对Spring MVC都做了哪些事?(二)

开发 架构
在一个独立的web应用程序中,容器中的默认servlet也被启用,并作为备用,如果Spring决定不处理它,则从ServletContext的根提供内容。

上一篇:《​​SpringBoot对Spring MVC都做了哪些事?(一)​​》

静态内容

默认情况下,Spring Boot从类路径中名为/static(或/public或/resources或/META-INF/resources)的目录或ServletContext的根目录提供静态内容。它使用Spring MVC中的ResourceHttpRequestHandler,因此你可以通过添加自己的WebMVCConfiguer并重写addResourceHandlers方法来修改该行为。

在一个独立的web应用程序中,容器中的默认servlet也被启用,并作为备用,如果Spring决定不处理它,则从ServletContext的根提供内容。大多数情况下,这不会发生(除非你修改默认的MVC配置),因为Spring始终可以通过DispatcherServlet处理请求。

默认情况下,资源映射到/**,但你可以通过spring.mvc.static-path-pattern属性进行调整。例如,可以通过以下方式将所有资源重新定位到/resources/**中:

spring:
mvc:
static-path-pattern: "/resources/**"

你也可以通过spring.web.resources.static-locations属性执行设置静态资源的位置。Servlet的根上下文路径“/”也会自动添加为一个位置。

除了前面提到的“标准”静态资源位置之外,Webjars内容还有一种特殊情况。任何路径在/webjars/**的资源都是从jar文件中提供的,如果它们被打包成webjars格式的话。

Spring Boot还支持Spring MVC提供的高级资源处理特性,允许使用缓存破坏静态资源或为webjar使用版本无关url等用例。

要对webjar使用版本不确定的url,需要添加Webjars-locator-core依赖。然后声明你的Webjar。以jQuery为例,添加“/Webjar/jQuery/jQuery.min.js”,得到“/Webjar/jQuery/x.y.z/jQuery .min.js”,其中x.y.z是Webjar版本。

欢迎页

Spring Boot支持静态和模板欢迎页面。它首先在配置的静态内容位置中查找index.html文件。如果没有找到,它将查找索引模板。如果找到其中一个,它将自动用作应用程序的欢迎页面。

路径匹配和内容协商

Spring MVC可以通过查看请求路径并将其与应用程序中定义的映射(例如,Controller方法上的@GetMapping注释)来将传入的HTTP请求映射到处理程序。

默认情况下,Spring Boot选择禁用后缀模式匹配,这意味着像“GET /projects/spring-boot”这样的请求。json"不会匹配@GetMapping("/projects/spring-boot")映射。这被认为是Spring MVC应用程序的最佳实践。这个特性主要是在过去的HTTP客户端没有发送正确的“Accept”请求头的时候有用;我们需要确保向客户端发送正确的内容类型。如今,内容协商更加可靠。

还有其他方法来处理HTTP客户端不一致地发送正确的“Accept”请求头。不使用后缀匹配,我们可以使用查询参数来确保像“GET /projects/spring-boot?”format=json"将被映射到@GetMapping("/projects/spring-boot"):

示例:

@GetMapping("/format")
public Map<String, Object> format() {
Map<String, Object> result = new HashMap<>() ;
result.put("name", "张三") ;
return result ;
}

如上接口,在正常请求的情况下返回:

SpringBoot对Spring MVC都做了哪些事?(二)

再次测试,这次我们将Accept请求Header做下修改如下:

SpringBoot对Spring MVC都做了哪些事?(二)

请求失败了,你客户端能接收的是text/html,但是服务端生成的application/json类型,所以客户端是无法解析处理的。

对服务端做如下配置:

spring:
mvc:
contentnegotiation:
favor-parameter: true

在请求中这次添加一个format参数:

SpringBoot对Spring MVC都做了哪些事?(二)

成功,如果你将format值改成其它又会错误。

修改参数名:

spring:
mvc:
contentnegotiation:
favor-parameter: true
parameter-name: akf

通过parameter-name将默认的format修改为akf。

SpringBoot对Spring MVC都做了哪些事?(二)

自定义请求header类型

spring:
mvc:
contentnegotiation:
media-types:
cnn: app/cnn

这时候我们的Accept也是可以接收app/cnn的请求类型的。

SpringBoot对Spring MVC都做了哪些事?(二)

ConfigurableWebBindingInitializer

Spring MVC使用WebBindingInitializer为特定的请求初始化WebDataBinder。如果你创建了自己的ConfigurableWebBindingInitializer @Bean, Spring Boot会自动配置Spring MVC来使用它。

模版引擎

除了REST web服务之外,还可以使用Spring MVC来提供动态HTML内容。Spring MVC支持各种模板技术,包括thymleafFreeMarkerjsp。此外,许多其他模板引擎也包含它们自己的Spring MVC集成。

Spring Boot包括对以下模板引擎的自动配置支持:

  • FreeMarker
  • Groovy
  • Thymeleaf
  • Mustache

如果可能的话,应该避免使用jsp。当将它们与嵌入式servlet容器一起使用时,有几个已知的限制。

当你使用这些带有默认配置的模板引擎之一时,你的模板将自动从src/main/resources/templates中获取。

责任编辑:姜华 来源: 今日头条
相关推荐

2022-07-29 09:12:14

Springservlet容器

2022-08-02 07:55:28

MVCJersey

2022-07-26 07:47:09

SpringMVC

2021-01-06 08:24:38

人工智能消费领域AI

2020-12-08 09:30:25

CPU内存I

2017-11-13 15:48:36

架构Spring Clou演进

2017-11-14 09:03:36

Spring Clou架构演进

2014-08-10 14:35:23

2021-08-06 22:45:09

人工智能AI

2017-06-08 09:36:42

京东服务器

2022-05-19 07:01:34

架构

2023-06-07 08:13:46

PixiJSCanvas 库

2021-07-16 09:58:02

物联网

2019-02-24 23:45:42

5G运营商网络

2021-01-03 10:37:50

前端开发技术

2014-11-12 00:01:29

京东

2019-05-14 09:18:18

程序员PythonJava

2017-06-26 14:52:45

微软智能云合作

2014-03-26 14:23:36

Microsoft AWindows Azu微软

2020-01-08 13:40:01

戴尔
点赞
收藏

51CTO技术栈公众号