與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;
- }
- }