与SpringSecurity的配置类似,spring同样为我们提供了一个实现类WebMvcConfigurationSupport和一个注解@EnableWebMvc以帮助我们减少bean的声明。
applicationContext-MvcConfig.xml
<!-- 启用注解,并定义组件查找规则 ,mvc层只负责扫描@Controller --> <context:component-scan base-package="web.function" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- 视图处理器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/jsp/function/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 定义国际化资源文件查找规则 ,各种messages.properties --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="config.messages.messages"> </bean> <!-- servlet适配器,这里必须明确声明,因为spring默认没有初始化该适配器 --> <bean id="servletHandlerAdapter" class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter" /> <!-- 定义文件上传处理器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" /> <!-- 异常处理器 --> <bean id="exceptionResolver" class="web.core.CP_SimpleMappingExceptionResolver"> <property name="defaultErrorView" value="common_error" /> <property name="exceptionAttribute" value="exception" /> <property name="exceptionMappings"> <props> <prop key="java.lang.RuntimeException">common_error</prop> </props> </property> </bean> <!-- 定义公共参数初始化拦截器 --> <bean id="initInterceptor" class="web.core.CP_InitializingInterceptor" /> <!-- 本地化资源处理器 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" /> <!-- 定义本地化变更拦截器 --> <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> <!-- 请求拦截器,每一个用户请求都会被拦截 --> <mvc:interceptors> <ref bean="localeChangeInterceptor" /> <ref bean="initInterceptor" /> </mvc:interceptors> <!-- 定义注解驱动Controller方法处理适配器 ,注:该适配器必须声明在<mvc:annotation-driven />之前,否则不能正常处理参数类型的转换 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="webBindingInitializer"> <bean class="web.core.CP_PropertyEditorRegistrar"> <property name="format" value="yyyy-MM-dd"></property> </bean> </property> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> </list> </property> </bean> <!-- 会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。 并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson) --> <mvc:annotation-driven /> <!-- 资源访问处理器 --> <mvc:resources mapping="/static/**" location="/WEB-INF/static/" />
MvcConfig.java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "web.function", useDefaultFilters = false, includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class})
})
public class MvcConfig extends WebMvcConfigurationSupport {
private static final Logger logger = Logger
.getLogger(MvcConfig.class);
/**
* 描述 : <注册试图处理器>. <br>
*<p>
<使用方法说明>
</p>
* @return
*/
@Bean
public ViewResolver viewResolver() {
logger.info("ViewResolver");
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/jsp/function/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
/**
* 描述 : <注册消息资源处理器>. <br>
*<p>
<使用方法说明>
</p>
* @return
*/
@Bean
public MessageSource messageSource() {
logger.info("MessageSource");
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("config.messages.messages");
return messageSource;
}
/**
* 描述 : <注册servlet适配器>. <br>
*<p>
<只需要在自定义的servlet上用@Controller("映射路径")标注即可>
</p>
* @return
*/
@Bean
public HandlerAdapter servletHandlerAdapter(){
logger.info("HandlerAdapter");
return new SimpleServletHandlerAdapter();
}
/**
* 描述 : <本地化拦截器>. <br>
*<p>
<使用方法说明>
</p>
* @return
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor(){
logger.info("LocaleChangeInterceptor");
return new LocaleChangeInterceptor();
}
/**
* 描述 : <基于cookie的本地化资源处理器>. <br>
*<p>
<使用方法说明>
</p>
* @return
*/
@Bean(name="localeResolver")
public CookieLocaleResolver cookieLocaleResolver(){
logger.info("CookieLocaleResolver");
return new CookieLocaleResolver();
}
/**
* 描述 : <注册自定义拦截器>. <br>
*<p>
<使用方法说明>
</p>
* @return
*/
@Bean
public CP_InitializingInterceptor initializingInterceptor(){
logger.info("CP_InitializingInterceptor");
return new CP_InitializingInterceptor();
}
/**
* 描述 : <RequestMappingHandlerMapping需要显示声明,否则不能注册自定义的拦截器>. <br>
*<p>
<这个比较奇怪,理论上应该是不需要的>
</p>
* @return
*/
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
logger.info("RequestMappingHandlerMapping");
return super.requestMappingHandlerMapping();
}
/**
* 描述 : <添加拦截器>. <br>
*<p>
<使用方法说明>
</p>
* @param registry
*/
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
logger.info("addInterceptors start");
registry.addInterceptor(localeChangeInterceptor());
registry.addInterceptor(initializingInterceptor());
logger.info("addInterceptors end");
}
/**
* 描述 : <HandlerMapping需要显示声明,否则不能注册资源访问处理器>. <br>
*<p>
<这个比较奇怪,理论上应该是不需要的>
</p>
* @return
*/
@Bean
public HandlerMapping resourceHandlerMapping() {
logger.info("HandlerMapping");
return super.resourceHandlerMapping();
}
/**
* 描述 : <资源访问处理器>. <br>
*<p>
<可以在jsp中使用/static/**的方式访问/WEB-INF/static/下的内容>
</p>
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
logger.info("addResourceHandlers");
registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/");
}
/**
* 描述 : <文件上传处理器>. <br>
*<p>
<使用方法说明>
</p>
* @return
*/
@Bean(name="multipartResolver")
public CommonsMultipartResolver commonsMultipartResolver(){
logger.info("CommonsMultipartResolver");
return new CommonsMultipartResolver();
}
/**
* 描述 : <异常处理器>. <br>
*<p>
<系统运行时遇到指定的异常将会跳转到指定的页面>
</p>
* @return
*/
@Bean(name="exceptionResolver")
public CP_SimpleMappingExceptionResolver simpleMappingExceptionResolver(){
logger.info("CP_SimpleMappingExceptionResolver");
CP_SimpleMappingExceptionResolver simpleMappingExceptionResolver= new CP_SimpleMappingExceptionResolver();
simpleMappingExceptionResolver.setDefaultErrorView("common_error");
simpleMappingExceptionResolver.setExceptionAttribute("exception");
Properties properties = new Properties();
properties.setProperty("java.lang.RuntimeException", "common_error");
simpleMappingExceptionResolver.setExceptionMappings(properties);
return simpleMappingExceptionResolver;
}
/**
* 描述 : <RequestMappingHandlerAdapter需要显示声明,否则不能注册通用属性编辑器>. <br>
*<p>
<这个比较奇怪,理论上应该是不需要的>
</p>
* @return
*/
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
logger.info("RequestMappingHandlerAdapter");
return super.requestMappingHandlerAdapter();
}
/**
* 描述 : <注册通用属性编辑器>. <br>
*<p>
<这里只增加了字符串转日期和字符串两边去空格的处理>
</p>
* @return
*/
@Override
protected ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer() {
logger.info("ConfigurableWebBindingInitializer");
ConfigurableWebBindingInitializer initializer = super.getConfigurableWebBindingInitializer();
CP_PropertyEditorRegistrar register = new CP_PropertyEditorRegistrar();
register.setFormat("yyyy-MM-dd");
initializer.setPropertyEditorRegistrar(register);
return initializer;
}
}