05_SpringBoot_Web

[TOC]

Web开发

  1. 创建SpringBoot应用,选中我们需要的模块

  2. SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来

  3. 自己编写业务代码

自动配置原理

这个场景 Spring Boot 帮我们配置了什么?能不能修改?能修改哪些配置?能不能扩展?xxx

xxxxAutoAonfiguration:帮我们给容器中自动配置组件xxxxProperties:配置类来封装配置文件的内容

web自动配置规则

  1. WebMvcAutoConfiguration

  2. WebMvcProperties

  3. ViewResolver自动配置

  4. 静态资源自动映射

  5. Formatter与Converter自动配置

  6. HttpMessageConverter自动配置

  7. 静态首页

  8. favicon

  9. 错误处理

SpringBoot对静态资源的映射规则

WebMvcAutoConfiguration类的addResourceHandlers方法:(添加资源映射)

所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源

webjars:以jar包的方式引入静态资源;

webjars官网

1573815091111

例如:添加jquery的webjars

1573815506777

访问地址对应就是:http://localhost:8080/webjars/jquery/3.4.1/jquery.js

非webjars,自己的静态资源怎么访问

资源配置类:

1573817274649

上图中添加的映射访问路径staticPathPattern值是/**,对应的资源文件夹就是上面配置类ResourceProperties中的CLASSPATH_RESOURCE_LOCATIONS数组中的文件夹:

数组中的值

在项目中的位置

classpath:/META-INF/resources/

src/main/resources/META-INF/resources/

classpath:/resources/

src/main/resources/resources/

classpath:/static/

src/main/resources/static/

classpath:/public/

src/main/resources/public/

"/" 当前项目的根路径

localhost:8080/abc ---> 去静态资源文件夹里面找abc

欢迎页映射

1573819949494

location就是静态资源路径,所以欢迎页的页面就是上面静态资源下的index.html,被/**映射,因此直接访问项目就是访问欢迎页

网站图标映射(favicon.ico)

所有的 favicon.ico 都是在静态资源文件下找;

模板引擎

常见的模板引擎有JSPVelocityFreemarkerThymeleaf

==SpringBoot推荐使用Thymeleaf==

Thymeleaf 语法更简单,功能更强大

image-20200619010433951

引入thymeleaf

如需切换thymeleaf版本:

Thymeleaf使用

默认只要我们把HTML页面放在classpath:/templates/,thymeleaf就能自动渲染;

  1. 创建模板文件t1.html,并导入thymeleaf的名称空间

  2. 使用模板

  3. 在controller中准备数据

语法规则

th:text --> 改变当前元素里面的文本内容;

th:任意html属性 --> 来替换原生属性的值

thymeleaf

官方配置参考文档

中文参考书册

All these features can be combined and nested:

SpringMVC自动配置

Spring Boot为Spring MVC提供了自动配置,可与大多数应用程序完美配合。

官方参考文档-1.5.10

以下是SpringBoot对SpringMVC的默认配置

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

自动配置在Spring的默认值之上添加了以下功能:

  • 包含 ContentNegotiatingViewResolverBeanNameViewResolver --> 视图解析器

    • 自动配置了 ViewResolver (视图解析:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发、重定向))

    • ContentNegotiatingViewResolver:组合所有的视图解析的

    • 如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来

  • 支持服务静态资源,包括对WebJars的支持(官方文档中有介绍-2.2.1) --> 静态资源文件夹路径, webjars

  • 自动注册 of ConverterGenericConverterFormatter beans --> 转换器,格式化器

    • Converter:转换器 public String hello(User user):类型转换使用 Converter

    • Formatter 格式化器

      • 2017-12-17===Date

      • 2017/12/17===Date

      • 2017.12.17===Date

  • 支持 HttpMessageConverters官方文档中有介绍) --> SpringMVC用来转换Http请求和响应的;User---Json;

    • HttpMessageConverter:SpringMVC 用来转换 Http 请求和响应的;User --> Json

    • HttpMessageConverters 是从容器中确定,HttpMessageConverter

      自己给容器中添加 HttpMessageConverters,只需要将自己的组件注册在容器中(@Bean, @Component

  • 自动注册 MessageCodesResolver官方文档中有介绍) --> 定义错误代码生成规则

  • 静态 index.html 支持 --> 静态首页访问

  • 定制 Favicon 支持(官方文档中有介绍) --> 网站图标

  • 自动使用 ConfigurableWebBindingInitializer bean(官方文档中有介绍

    • 我们可以配置一个 ConfigurableWebBindingInitializer 来替换默认的(添加到容器)

    初始化 WebDataBinder

    请求数据 ==== JavaBean

    org.springframework.boot.autoconfigure.web: web的所有自动场景

如果您想保留 Spring Boot MVC 的功能,并且需要添加其他 MVC 配置(拦截器,格式化程序和视图控制器等),可以添加自己的 WebMvcConfigurer 类型的 @Configuration 类,但不能@EnableWebMvc 注解。如果您想自定义 RequestMappingHandlerMappingRequestMappingHandlerAdapter 或者 ExceptionHandlerExceptionResolver 实例,可以声明一个 WebMvcRegistrationsAdapter 实例来提供这些组件。

如果您想完全掌控 Spring MVC,可以添加自定义注解了 @EnableWebMvc 的 @Configuration 配置类。

视图解析器

视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)

  • 自动配置了ViewResolver

  • ContentNegotiatingViewResolver:组合所有的视图解析器的;

1573873741438

视图解析器从哪里来的?

1573874365778

所以我们可以自己给容器中添加一个视图解析器;自动的将其组合进来

1573875409759

转换器、格式化器

  • Converter:转换器; public String hello(User user):类型转换使用Converter(表单数据转为user)

  • Formatter 格式化器; 2017.12.17===Date;

自己添加的格式化器转换器,我们只需要放在容器中即可

HttpMessageConverters

  • HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User---Json;

  • HttpMessageConverters 是从容器中确定;获取所有的HttpMessageConverter;

自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component)

MessageCodesResolver

我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器)

扩展SpringMVC

以前的配置文件中的配置

现在,编写一个配置类(@Configuration),是 WebMvcConfigurer 类型;不能标注 @EnableWebMvc

访问:http://localhost:8080/hi

原理:

我们知道WebMvcAutoConfiguration是SpringMVC的自动配置类

下面这个类是WebMvcAutoConfiguration中的一个内部类

1573891167026

看一下@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})中的这个类,

这个类依旧是WebMvcAutoConfiguration中的一个内部类

1573891478014

重点看一下这个类继承的父类DelegatingWebMvcConfiguration

容器中所有的WebMvcConfigurer都会一起起作用;

我们的配置类也会被调用;

​ 效果:SpringMVC的自动配置和我们的扩展配置都会起作用;

1573892805539

全面接管SpringMVC

SpringBoot对SpringMVC的自动配置不需要了,所有都是由我们自己来配置;所有的SpringMVC的自动配置都失效了

我们只需要在配置类中添加 @EnableWebMvc 即可;

1573892899452

原理:

为什么 @EnableWebMvc 自动配置就失效了;

我们看一下 EnableWebMvc 注解类

重点在于@Import({DelegatingWebMvcConfiguration.class})

DelegatingWebMvcConfigurationWebMvcConfigurationSupport的子类

我们再来看一下springmvc的自动配置类WebMvcAutoConfiguration

  1. @EnableWebMvc将WebMvcConfigurationSupport组件导入进来;

  2. 导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;

如何修改SpringBoot的默认配置

模式

  1. SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;

  2. 扩展配置

    1. 在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置

    2. 在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

最后更新于

这有帮助吗?