05_SpringBoot_Web
[TOC]
Web开发
创建SpringBoot应用,选中我们需要的模块
SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
自己编写业务代码
自动配置原理
这个场景 Spring Boot 帮我们配置了什么?能不能修改?能修改哪些配置?能不能扩展?xxx
xxxxAutoAonfiguration:帮我们给容器中自动配置组件xxxxProperties:配置类来封装配置文件的内容web自动配置规则
WebMvcAutoConfiguration
WebMvcProperties
ViewResolver自动配置
静态资源自动映射
Formatter与Converter自动配置
HttpMessageConverter自动配置
静态首页
favicon
错误处理
SpringBoot对静态资源的映射规则
WebMvcAutoConfiguration类的addResourceHandlers方法:(添加资源映射)
所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源
webjars:以jar包的方式引入静态资源;

例如:添加jquery的webjars

访问地址对应就是:http://localhost:8080/webjars/jquery/3.4.1/jquery.js
非webjars,自己的静态资源怎么访问
资源配置类:

上图中添加的映射访问路径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
欢迎页映射

location就是静态资源路径,所以欢迎页的页面就是上面静态资源下的index.html,被/**映射,因此直接访问项目就是访问欢迎页
网站图标映射(favicon.ico)
所有的 favicon.ico 都是在静态资源文件下找;
模板引擎
常见的模板引擎有JSP、Velocity、Freemarker、Thymeleaf
==SpringBoot推荐使用Thymeleaf==
Thymeleaf 语法更简单,功能更强大

引入thymeleaf
如需切换thymeleaf版本:
Thymeleaf使用
默认只要我们把HTML页面放在classpath:/templates/,thymeleaf就能自动渲染;
创建模板文件
t1.html,并导入thymeleaf的名称空间使用模板
在controller中准备数据
语法规则
th:text --> 改变当前元素里面的文本内容;
th:任意html属性 --> 来替换原生属性的值

All these features can be combined and nested:
SpringMVC自动配置
Spring Boot为Spring MVC提供了自动配置,可与大多数应用程序完美配合。
以下是SpringBoot对SpringMVC的默认配置
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
自动配置在Spring的默认值之上添加了以下功能:
包含
ContentNegotiatingViewResolver和BeanNameViewResolver--> 视图解析器自动配置了
ViewResolver(视图解析:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发、重定向))ContentNegotiatingViewResolver:组合所有的视图解析的
如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来
支持服务静态资源,包括对WebJars的支持(官方文档中有介绍-2.2.1) --> 静态资源文件夹路径, webjars
自动注册 of
Converter,GenericConverter和Formatterbeans --> 转换器,格式化器Converter:转换器public String hello(User user):类型转换使用 ConverterFormatter格式化器2017-12-17===Date
2017/12/17===Date
2017.12.17===Date
支持
HttpMessageConverters(官方文档中有介绍) --> SpringMVC用来转换Http请求和响应的;User---Json;HttpMessageConverter:SpringMVC 用来转换 Http 请求和响应的;User --> JsonHttpMessageConverters是从容器中确定,HttpMessageConverter自己给容器中添加
HttpMessageConverters,只需要将自己的组件注册在容器中(@Bean,@Component)
自动注册
MessageCodesResolver(官方文档中有介绍) --> 定义错误代码生成规则静态
index.html支持 --> 静态首页访问定制
Favicon支持(官方文档中有介绍) --> 网站图标自动使用
ConfigurableWebBindingInitializerbean(官方文档中有介绍)我们可以配置一个
ConfigurableWebBindingInitializer来替换默认的(添加到容器)
初始化
WebDataBinder请求数据 ==== JavaBean
org.springframework.boot.autoconfigure.web: web的所有自动场景
如果您想保留 Spring Boot MVC 的功能,并且需要添加其他 MVC 配置(拦截器,格式化程序和视图控制器等),可以添加自己的 WebMvcConfigurer 类型的 @Configuration 类,但不能带 @EnableWebMvc 注解。如果您想自定义 RequestMappingHandlerMapping、RequestMappingHandlerAdapter 或者 ExceptionHandlerExceptionResolver 实例,可以声明一个 WebMvcRegistrationsAdapter 实例来提供这些组件。
如果您想完全掌控 Spring MVC,可以添加自定义注解了 @EnableWebMvc 的 @Configuration 配置类。
视图解析器
视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)
自动配置了ViewResolver
ContentNegotiatingViewResolver:组合所有的视图解析器的;

视图解析器从哪里来的?

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

转换器、格式化器
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
原理:
我们知道WebMvcAutoConfiguration是SpringMVC的自动配置类
下面这个类是WebMvcAutoConfiguration中的一个内部类

看一下@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})中的这个类,
这个类依旧是WebMvcAutoConfiguration中的一个内部类

重点看一下这个类继承的父类DelegatingWebMvcConfiguration
容器中所有的WebMvcConfigurer都会一起起作用;
我们的配置类也会被调用;
效果:SpringMVC的自动配置和我们的扩展配置都会起作用;

全面接管SpringMVC
SpringBoot对SpringMVC的自动配置不需要了,所有都是由我们自己来配置;所有的SpringMVC的自动配置都失效了
我们只需要在配置类中添加 @EnableWebMvc 即可;

原理:
为什么 @EnableWebMvc 自动配置就失效了;
我们看一下 EnableWebMvc 注解类
重点在于@Import({DelegatingWebMvcConfiguration.class})
DelegatingWebMvcConfiguration是WebMvcConfigurationSupport的子类
我们再来看一下springmvc的自动配置类WebMvcAutoConfiguration
@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;
如何修改SpringBoot的默认配置
模式
SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(
@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;扩展配置
在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置
最后更新于
这有帮助吗?