本章介绍的是基本的web相关配置,涉及了springboot自动配置,注册servlet、filter、listener等等,配置起来很简单。
(1).自动配置的ViewResolver
ContentNegotiatingViewResolver,MVC提供的一个特殊的ViewResolver,它不会自己处理view,而是代理给不同的ViewResolver来处理不同的View,有最高的优先级。
BeanNameViewResolver,在控制器中的一个方法返回的字符串会根据BeanNameViewResolver去查找Bean的名称为返回字符串的View来渲染视图。例如:
在配置文件中配置BeanNameViewResolver
//自动配置
@Bean
public BeanNameViewResolver beanNameViewResolver(){
BeanNameViewResolver beanNameViewResolver=new BeanNameViewResolver();
return beanNameViewResolver;
}
@Bean
public MappingJackson2JsonView jsonView() {
MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
return jsonView;
}
在控制层返回BeanName字符串
/**
* 返回jsonView,他会找bean名称为jsonView的视图来渲染
*/
@RequestMapping(value = "/json",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String json(Model model){
Person single=new Person("二狗子",28);
model.addAttribute("single",single);
return "jsonView";
}
InternalResourceViewResolver,极为常见的ViewResolver,配置前缀,后缀以及控制器中的方法来返回视图名的字符串,有两个构造方法:
public InternalResourceViewResolver() {
Class> viewClass = this.requiredViewClass();
if (InternalResourceView.class == viewClass && jstlPresent) {
viewClass = JstlView.class;
}
this.setViewClass(viewClass);
}
public InternalResourceViewResolver(String prefix, String suffix) {
this();
this.setPrefix(prefix);
this.setSuffix(suffix);
}
(2).自动配置的静态资源
在自动配置类WebMvcAutoConfiguration,我们可以看到,在这个方法中自动配置了静态资源的默认路径配置,
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
if (!registry.hasMappingForPattern("/webjars/**")) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
}
将/static、/public、/resources和/META-INF/resources下的静态文件直接映射为/**,使我们可以直接http://localhost:8080/**来访问静态资源
webjar映射到/webjar/
(3).自动配置的Formatter和Converter
自动配置类中的定义:
public void addFormatters(FormatterRegistry registry) {
Iterator var2 = this.delegates.iterator();
while(var2.hasNext()) {
WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next();
delegate.addFormatters(registry);
}
}
只要我们定义了Converter、GenericConverter和Formatter接口的实现类的Bean,就会自动注册到Spring MVC中。
(4).自定义配置的HttpMessageConverter
/**
* 直接注入了HttpMessageConverters的bean
* 引入了spring mvc的各种HttpMessageConverter以及其他的HttpMessageConverter
*/
@Override
public void configureMessageConverters(List> converters) {
converters.addAll(httpMessageConverters.getConverters());
}
增加额外配置,不想使用自动配置的时候可以定义一个配置类继承WebMvcConfigurerAdapter,使用MVC的配置方法。这里也可以用Spring Boot2版本的时候实现WebMvcConfigurer。
我们可以将Servlet、FIlter、Listener直接声明为Bean,或者注册ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean,简单的就直接声明为bean就好。