SpringMvc环境搭建
package com.mcs.Sgin.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import com.mcs.Sgin.config.web.WebConfig; public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { RootConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { WebConfig.class }; } @Override protected String[] getServletMappings() { // 将DispatcherServlet映射到"/" return new String[] { "/" }; } }
1.配置DispatcherServlet
借助Servlet 3 规范,可以使用JAVA配置DispatcherServlet到Servlet容器中。
下面是所需要的JAVA类。
扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动配置DispatcherServlet和Spring应用上下文,Spring应用上下文会位于应用程序的Servlet上下文中。
细节:Servlet3.0中,容器会自动查找 实现了javax.servlet.ServletContainerInitialize接口的类,如果可以发现的话,就用它泪配置Servlet容器。Spring提供了实现,名为SpringServletContainerInitializer,这个类会查找实现了WebApionInitializer的类,并将配置任务交给它来完成。Spring提供了便利的WebApionInitializer实现,名为AbstractAnnotationConfigDispatcherServletInitializer。所以只要继承这个便利类,Spring会用它配置Servlet上下文。
两个应用上下文的关系
当DispatcherServlet启动的时候,它创建了Spring应用上下文,并加载配置文件或类所声明的bean。getServletConfigClasses()中,我们要求DispatcherServlet加载应用上下文时,使用定义在WebConfig中的bean。
SpringWeb中,还有另一个应用上下文,他是有ContextLoaderListener创建的。
通常DispatcherServlet加载包含Web组件的bean,如控制器,视图解析器及处理器映射,ContextLoaderListener加载其他的bean,例如中间层,数据库层组件。
实际上,AbstractAnnotationConfigDispatcherServletInitializer会同时创建DispatcherServlet和ContextLoaderListener。getServletConfigClasses()返回的带有@Configuration的类会用来定义DispatcherServlet应用上下文中的bean。
getRootConfigClasses()返回的带有@Configuration的类会用来配置ContextLoaderListener创建的应用上下文中的bean。
开启SpringMVC
最简配置
只要添加一个 @EnableWebMvc 注解。
@Configuration @EnableWebMvc public class WebConfig { }
他可以运行但还存在一些问题。
- 没有配置试图解析器。Spring默认使用BeanNameViewResolver,它会查找ID与名称匹配的bean,并且bean要实现View接口。
- 没有启动自动扫描。
- 静态资源的请求也会被它处理。
循序渐进
@Configuration @EnableWebMvc @ComponentScan("com.mcs.Sgin.web") // 启用自动扫描 public class WebConfig extends WebMvcConfigurerAdapter { //配置JSP视图解析器 @Bean 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(); } }
WebConfig扩展屏重写WebMvcConfigurerAdapter的configureDefaultServletHandling()方法,通过调用DefaultServletHandlerConfigurer的enable()方法,我们要求DispatcherServlet将对静态资源的请求转发到Servlet容器默认的Servlet上。