在此之前,一直使用的是XML的方式配置SpringMVC,现在为了适应Servlert3.0以及JavaConfig的Spring配置方式,在这里记录一下使用Java代码配置SpringMVC。首先,来回顾一下使用XML配置的过程:
1.在web.xml中配置DispatcherServlet
2.在SpringMVC配置文件中配置viewResolver(视图解析器)
3.在SpringMVC配置文件中配置两个基本配置
- <mvc:annotation-driven/>
- <mvc:default-servlet-handler/>
4.在SpringMVC配置文件中配置组件扫描Controller(注意与Spring的组件扫描分开,形成父子容器,这也是Spring建议的)
这几步下来,SpringMVC基本上已经配置完成。我们使用Java配置的过程也大致如此。
配置DispatcherServlet
因为不再使用web.xml,那么去哪里配置DispatcherServlet ?
我们需要使用一个类继承 AbstractAnnotationConfigDispatcherServletInitializer ,继承之后这个类就相当于前端控制器了:
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() { return new String[] {"/"}; } }
getRootConfigClasses()方法用于获取根容器的配置类;(Spring的配置文件),相当于父容器配置,这里使用的是名为RootConfig的类
getServletConfigClasses()方法用于获取web容器的配置类(SpringMVC配置文件),相当于子容器配置,这里使用的是名为WebConfig的类
SpringMVC的配置
)
@Configuration
@EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter{ @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/view/"); viewResolver.setSuffix(".jsp");return viewResolver; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
在这里我是将视图解析器配置为一个Bean,还可以直接重写WebMvcConfigurerAdapter 类的 configureViewResolvers方法,效果是一样的
@Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/view/", ".jsp"); }
@EnableWebMvc 注解就相当于应用了<mvc:annotation-driven/> ,启用了SpringMVC的高级特性
重写 configureDefaultServletHandling 方法就是将SpringMVC不能处理的静态资源交给Tomcat处理,相当于<mvc:default-servlet-handler/>
Spring的配置
因为要使用父子容器的方式,所以还需要配置Spring,在这里不用配置太复杂,直接扫描除了Controller层的其他组件即可
@Configuration @ComponentScan(value="cn.lynu",excludeFilters={ @Filter(type=FilterType.ANNOTATION,classes={Controller.class}) }) public class RootConfig { }
因为这里只是简单的处理Web层,所以不需要太复杂,在这个Spring配置类中就没有任何方法