package config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//将DispatchServlet映射到"/"
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//指定配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
}
首先需要知道扩展**AbstractAnnotationConfigDispatcherServletInitializer
**的任意类都会自动地配置DispatcherServlet
和Spring应用上下文。
使用AbstractAnnotationConfigDispatcherServletInitializer
非常简单,AbstractAnnotationConfigDispatcherServletInitializer
子类重写了三个方法:
1.第一个方法:
getServletMappings()
,他会将一个或多个路径映射到DispatcherServlet
上。2.当
DispatcherServlet
启动时,会创建Spring应用上下文,并加载配置文件或配置类中所声明的bean。
第二个方法:getServletConfigClasses()
,指定当DispatcherServlet
加载应用上下文时,使用在WebConfig配置类(使用java配置)中的定义的关于web组件的bean,如控制器、视图解析器以及处理器映射bean。3.在spring web应用中,通常还会有另外一个应用上下文。由
ContextLoadListener
创建。
第三个方法:getRootConfigClasses()
指定了创建ContextLoaderListener
应用上下文bean的配置类。这些bean通常是驱动应用后端的中间层和数据层组件。
总的来说:AbstractAnnotationConfigDispatcherServletInitializer
会同时创建DispatcherServlet
和ContextLoaderListener
。getServletConfigClasses()
方法返回的带有@Configuration
注解的类将会用来定义DispatcherServlet
应用上下文中的bean。getRootConfigClasses()
方法返回的带有@Configuration
注解的类会用来配置ContextLieaderListener
创建的应用上下文中bean。
创建一个带有@EnableWebMvc注解的类。因此在WebConfig类中。。。
package config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
public class WebConfig {
}
这可以运行起来,它的确能够启用Spring MVC,但还有不少问题要解决:
BeanNameViewResolver
,这个视图解析器会查找ID与视图名称匹配的bean,并且查找的bean要实现View接口,它以这样的方式来解析视图。一个完整的WebConfig类:
package config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("web")
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
//配置jsp视图解析器
public ViewResolver viewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
//配置静态资源的处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
我们添加了一个ViewResolver
bean。更具体来讲是InternalResourceViewResolver
。它会更具逻辑视图名查找Jsp文件,在查找的时候会在逻辑视图名上加一个特定的前缀和后缀。
新的WebConfig类还扩展了WebMvcConfigurerAdapter
并重写了其configureDefaultServletHandling()
方法。过调用DefaultServletHandlerConfigurer
的enable()
方法,我们要求DispatcherServlet
将对静态资源的请求转发到Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理此类请求。
WebConfig已经就绪,那RootConfig呢?
package spitter.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(basePackages = {"spitter"},
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,value = EnableWebMvc.class)
})
public class RootConfig {
}
excludeFilters
:指定不适合组件扫描的类型。这段代码的含义就是除开使用了@EnableWebMvc
注解的WebConfig
配置类扫描的bean。
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,value = EnableWebMvc.class)
}