SpringBoot学习笔记(四) SpringBoot Web相关的自动配置

SpringBoot Web相关的自动配置

1、自动配置的ViewResolver

Spring MVC 中的视图解析,在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。

问题:
1、如何选择合适的View?
2、View对象是是如何创建?

解决:ViewResolver

在SpringMVC中,因为ViewResolver是使用bean来配置的,所以容易扩展,可以根据自己的需要定制ViewResolver,然后在配置文件中进行相关的配置即可。

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第1张图片

ViewResolver接口声明了resolverViewName方法,这个方法的主要功能是根据ModelAndView中给定的viewName信息,再结合相关的配置,创建出合适类型的View对象。

ViewResolver接口是在DispatcherServlet中进行调用的,当DispatcherServlet调用完Controller后,会得到一个ModelAndView对象,然后DispatcherServlet会调用render方法进行视图渲染

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第2张图片

在DispatcherServlet类中,init方法中已经进行了相关的初始化,配置的ViewResolver信息都存放在viewResolvers中。在render方法中调用resolverViewName方法,在这个方法中逐一调用ViewResolver去取得View对象。

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第3张图片

这里注意:因为ViewResolver的选择是通过循环进行的,只选择第一个符合要求的,因此在定义ViewResolver时,需要注意定义其优先级。

参考:http://blog.csdn.net/prince2270/article/details/5891085

SpringMVC 4.2之后:

Spring MVC提供了一个特殊的ViewResolver,ContentNegotiatingViewResolver,它不是自己处理View,而是代理给不同的ViewResolver来处理不同的View,所以它有最高的优先级。

SpringBoot Web相关配置的第一步自动配置的ViewResolver是ContentNegotiatingViewResolver:

一、ContentNegotiatingViewResolver

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第4张图片

二、BeanNameViewResolver
在控制器(@Controller)中的一个方法的返回值的字符串(视图名)会根据BeanNameViewResolver去查找Bean的名称为返回字符串的View来渲染视图。

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第5张图片

(1)定义一个View的Bean,名称为jsonView

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第6张图片

(2)在控制器中,返回值为字符串jsonView,它会找Bean的名称为jsonView的视图来渲染:

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第7张图片

而名称为jsonView的Bean就是我们上面第三步定义的一个View的bean。

三、InternalResourceViewResolver
这个是一个极为常用的ViewResolver,主要通过设置前缀、后缀,以及控制器中方法来返回视图名的字符串,以得到实际页面。

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第8张图片

自动配置的静态资源:
在自动配置类WebMvcAutoConfiguration中的addResourceHandlers方法中定义了以下静态资源的自动配置。

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第9张图片

(1)类路径文件
把类路径下的/static、/public、/resources和/META-INF/resources文件夹的静态文件直接映射为/**,
可以通过http://localhost:8080/**来访问

(2)webjar
webjar就是将我们常用的脚本框架封装在jar包中的jar包,把webjar的/META-INF/resources/webjars/下的静态文件映射为/webjar/,可以通过http://localhost:8080/webjar/来访问。

自动配置的Formatter和Converter

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第10张图片

从上面图片中的代码可以看出,只要我们定义了Converter、GenericConverter和Formatter接口的实现类的Bean,这些Bean就会自动注册到Spring MVC中。

自动配置的HttpMessageConverters

这里写图片描述

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第11张图片

而HttpMessageConverters是在HttpMessageConvertersAutoConfiguration类中自动注册的。
除了默认的StringHttpMessageConverter,还有在HttpMessageConvertersAutoConfiguration的自动配置文件里还引入了JacksonHttpMessageConvertersConfiguration和GsonHttpMessageConverterConfiguration,使我们获得了额外的HttpMessageConverter:

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第12张图片

StringHttpMessageConverter就是默认自动配置的HttpMessageConverter。

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第13张图片

使用@Import注解,在HttpMessageConvertersAutoConfiguration的自动配置文件里还引入了JacksonHttpMessageConvertersConfiguration和GsonHttpMessageConverterConfiguration。

(1)若jackson的jar包在类路径上,则Spring Boot通过JacksonHttpMessageConverterConfiguration增加MappingJackson2HttpMessage Converter和MappingJackson2XmlHttpMessageConverter

(2)若gson的jar包在类路径上,则Spring Boot通过GsonHttpMessageConverterConfiguration增加GsonHttpMessageConverter

在Spring Boot中,如果要新增自定义的HttpMessageConverter,则只需定义一个你自己的HttpMessageConverters的Bean,然后在此Bean中注册自定义HttpMessageConverter即可。

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第14张图片

静态首页的支持:
把静态index.html文件放置在如下目录。
classpath:/META-INF/resources/index.html
classpath:/resources/index.html
classpath:/static/index.html
classpath:/public/index.html
当我们访问应用根目录http://localhost:8080/时,会直接映射。

接管Spring Boot的Web配置:

如果Spring Boot 提供的Spring MVC 不符合要求,则可以通过一个配置类(注解有@Configuration的类),加上@EnableWebMvc注解来实现完全自己控制的MVC配置。

既需要保留Spring Boot提供的便利,又需要增加自己的额外的配置的时候,可以定义一个配置类并继承WebMvcConfigureAdapter,不用使用@EnableWebMvc注解。

例:

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第15张图片

这里重写的addViewControllers方法,并不会覆盖WebMvcAutoConfiguration中的addViewControllers(在此方法中,Spring Boot将”/”映射至index.html)。

注册Servlet、Filter、Listener:

当使用嵌入式的Servlet容器(Tomcat、Jetty等)时,我们通过将Servlet、Filter和Listener声明为Spring Bean而达到注册的效果;或者注册ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean 的Bean。

(1)直接注册Bean示例

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第16张图片

(2)通过注册RegistrationBean示例

SpringBoot学习笔记(四) SpringBoot Web相关的自动配置_第17张图片

Java中Filter、Servlet、Listener主要参考下面这篇博客:

http://blog.csdn.net/agileclipse/article/details/9014683

你可能感兴趣的:(SpringBoot)