SpringBoot學習筆記(四) SpringBoot Web相關的自動配置

SpringBoot Web相關的自動配置

1、自動配置的ViewResolver

Spring MVC 中的視圖解析,在Spring MVC中,當Controller將請求處理結果放入到ModelAndView中以後,DispatcherServlet會根據ModelAndView選擇合適的視圖進行渲染。

問題:
1、如何選擇合適的View?
2、View對象是是如何創建?

解決:ViewResolver

在SpringMVC中,因爲ViewResolver是使用bean來配置的,所以容易擴展,可以根據自己的需要定製ViewResolver,然後在配置文件中進行相關的配置即可。

這裏寫圖片描述

ViewResolver接口聲明瞭resolverViewName方法,這個方法的主要功能是根據ModelAndView中給定的viewName信息,再結合相關的配置,創建出合適類型的View對象。

ViewResolver接口是在DispatcherServlet中進行調用的,當DispatcherServlet調用完Controller後,會得到一個ModelAndView對象,然後DispatcherServlet會調用render方法進行視圖渲染

這裏寫圖片描述

在DispatcherServlet類中,init方法中已經進行了相關的初始化,配置的ViewResolver信息都存放在viewResolvers中。在render方法中調用resolverViewName方法,在這個方法中逐一調用ViewResolver去取得View對象。

這裏寫圖片描述

這裏注意:因爲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

這裏寫圖片描述

二、BeanNameViewResolver
在控制器(@Controller)中的一個方法的返回值的字符串(視圖名)會根據BeanNameViewResolver去查找Bean的名稱爲返回字符串的View來渲染視圖。

這裏寫圖片描述

(1)定義一個View的Bean,名稱爲jsonView

這裏寫圖片描述

(2)在控制器中,返回值爲字符串jsonView,它會找Bean的名稱爲jsonView的視圖來渲染:

這裏寫圖片描述

而名稱爲jsonView的Bean就是我們上面第三步定義的一個View的bean。

三、InternalResourceViewResolver
這個是一個極爲常用的ViewResolver,主要通過設置前綴、後綴,以及控制器中方法來返回視圖名的字符串,以得到實際頁面。

這裏寫圖片描述

自動配置的靜態資源:
在自動配置類WebMvcAutoConfiguration中的addResourceHandlers方法中定義了以下靜態資源的自動配置。

這裏寫圖片描述

(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

這裏寫圖片描述

從上面圖片中的代碼可以看出,只要我們定義了Converter、GenericConverter和Formatter接口的實現類的Bean,這些Bean就會自動註冊到Spring MVC中。

自動配置的HttpMessageConverters

這裏寫圖片描述

這裏寫圖片描述

而HttpMessageConverters是在HttpMessageConvertersAutoConfiguration類中自動註冊的。
除了默認的StringHttpMessageConverter,還有在HttpMessageConvertersAutoConfiguration的自動配置文件裏還引入了JacksonHttpMessageConvertersConfiguration和GsonHttpMessageConverterConfiguration,使我們獲得了額外的HttpMessageConverter:

這裏寫圖片描述

StringHttpMessageConverter就是默認自動配置的HttpMessageConverter。

這裏寫圖片描述

使用@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即可。

這裏寫圖片描述

靜態首頁的支持:
把靜態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註解。

例:

這裏寫圖片描述

這裏重寫的addViewControllers方法,並不會覆蓋WebMvcAutoConfiguration中的addViewControllers(在此方法中,Spring Boot將”/”映射至index.html)。

註冊Servlet、Filter、Listener:

當使用嵌入式的Servlet容器(Tomcat、Jetty等)時,我們通過將Servlet、Filter和Listener聲明爲Spring Bean而達到註冊的效果;或者註冊ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean 的Bean。

(1)直接註冊Bean示例

這裏寫圖片描述

(2)通過註冊RegistrationBean示例

這裏寫圖片描述

Java中Filter、Servlet、Listener主要參考下面這篇博客:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章