配置Spring MVC2

        通过MVC java config或者MVC XML namespace,还可以完成下面的事情:

        除了被用于Data Binding的JavaBeans PropertyEditors,还通过一个ConversionService实例进行类型转换

        通过ConversionService使用@NumberFormat注解来支持数字格式化

        使用@DateTimeFormat注解来支持Date,Calendar,Long和Joda Time等fields的格式化    

        如果类路径中存在JSR-303 Provider,支持通过@Valid注解来验证@Controller

        为@RequestBody方法参数和@RequestMapping或@ExceptionHandler方法的@ResponseBody返回值提供HttpMessageConverter支持。

        通过<mvc:annotation-driven>设置的HttpMessageConverter有如下这些:

  • ByteArrayHttpMessageConverter:用来转换字节数组

  • StringHttpMessageConverter:用来转换字符串

  • ResourceHttpMessageConverter:将所有的media types转换为org.springframework.core.io.Resource

  • RourceHttpMessageConverter:将所有的media types转换为javax.xml.transform.Source

  • FormHttpMessageConverter:将数据转换为MultiValueMap<String, String>

  • Jaxb2RootElementHttpMessageConverter:将java对象转换为XML(如果类路径中有JAXB2)

  • MappingJackson2HttpMessageConverter(MappingJacksonHttpMessageConverter):将java对象转换为XML(如果类路径中有Jackson2或者Jackson)

  • AtomFeedHttpMessageConverter:转换Atom feeds(如果类路径中有Rome)

  • RssChannelHttpMessageConverter:转换Rss feeds(如果类路径中有Rome)


        如果想要定制Java中默认配置,你仅需要实现WebMvConfigurer接口,或者继承WebMvConfigurerAdapter类并重写你需要的方法。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    
    @Override
    protected void addFormatters(FormatterRegistry registry) {
        //Add formatters or/and converters
    }
    
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //Configure the list of HttpMessageConverters to use
    }
}


        <mvc:annotation-driven>的默认配置也可以定制化,这时你需要检查它支持什么属性或者子元素。


        配置拦截器

        你可以配置HandlerInterceptors或者WebRequestInterceptors并将其应用在所有的请求或者仅限于指定URL path patterns的请求。同样的,在Java代码中或是XML配置文件中各有其配置方式:Java中是通过继承WebMvcConfigurerAdapter并重写其addInterceptors(InterceptorRegistry registry)方法实现的,而在XML配置文件中是通过<mvc:interceptors>标签来配置的。


         配置内容协商(Content Negotiation)

        从Spring3.2开始,可以配置如何让Spring MVC测定请求的媒体类型(为了映射请求和内容协商)。可行的选择有:检查请求URI中的文件后缀、“Accept”请求头、请求参数,默认的内容类型。默认情况下会先检查请求URI,再检查、“Accept”请求头。对于请求URI中的文件后缀,MVC java config或者MVC XML namespace会自动注册诸如.json,.xml,.rss,和.atom的后缀(如果类路径中存在相关的依赖),其他的扩展,如果能够被ServletContext.getMimeType(String)或者Java Activation Framework找到的话,就不需要进行显示地注册。

        在MVC java config中,可以通过重写抽象类WebMvConfigurerAdapter中的configureContentNegotiation方法来定制内容协商的选项。在MVC XML namespace中,<mvc:annotation-driven>元素有一个content-negotiation-manager属性,它能通过ContentNegotiationManagerFactoryBean来创建一个ContentNegotiationManager。

        如果不使用MVC java config或者MVC XML namespace,你就需要自己创建一个ContentNegotiationManager实例,并使用它配置RequestMappingHandlerMapping(为了request mapping),或者RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver(为了content negotiation)。注意:ContentNegotiatingViewResolver同样可以被配置,这样在Spring MVC中就可以只使用它的一个实例。


         配置视图控制器(View Controllers)

        这是定义一个ParameterizableViewController的捷径(激活时,能立即转发到一个视图),在视图生成响应之前没有控制器逻辑执行的情况下,可以使用它。同样可以重写抽象类WebMvConfigurerAdapter的addViewControllers方法,或者在XML中使用<mvc:view-controller>元素。


         配置资源服务(Serving of Resources)

        这个选项能够允许紧跟着一个特定URL模式的静态资源请求被ResourceHttpRequestHandler从任一资源位置列表中提供服务。这提供了一种从位置而非应用根目录(包括类路径中的位置)来为静态资源提供服务的便捷方式。cache-period属性可以用来设置未来失效时间,这样,静态资源就能够被客户端更有效的利用。ResourceHttpRequestHandler也会正确的评估Last-Modified头部信息,这样就能适当的返回304状态码而避免不必要的重复加载。在java和XML中配置如下:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter{
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry){
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/publicresources/")
                .setCachePeriod(31556926);
    }
}
<mvc:resources mapping="/resources/**" location="/public-resources/" cacheperiod="31556926"/>

        mapping属性必须是能够被SimpleUrlHandlerMapping,使用的Ant模式,而location属性必须指定一个或多个有效的资源目录位置(多个位置用逗号分隔)。对于任何给定的请求,会根据指定的顺序检查指定位置的资源是否存在。

        对于那些在新版本的应用被部署后可能出现变化的资源,建议在mapping pattern中加一个version string,这样就能让用户访问到新部署的资源。这个version string能够通过SpEL参数化并被访问,这样当部署新版本时,它就能在一个独立的地方被管理。


        <mvc:default-servlet-handler/>标签:此标签允许将DispatcherServlet映射到“/”,然而同时还允许静态资源请求被容器的默认Servlet处理。它配置了一个DefaultServletHttpRequestHandler,带有一个指向“/**”的URL映射并相对其他的URL映射有着最低的优先级。这个Handler将转发所有的请求到默认的Servlet,因此它排在所有其他URL HandlerMappings后面很重要。如果你使用<mvc:annotation-driven>或者你设置你自己的HandlerMapping实例,确保将它的顺序优先级设置的比DefaultServletHttpRequestHandler的(为:Integer.MAX_VALUE)低。

        重写“/”Servlet mapping的理由是默认Servlet的RequestDispatcher必须通过名字而非路径取回。DefaultServletHttpRequestHandler将尝试在启动时自动探测默认的Servlet,如果这个Servlet被自定义成了不同的名字,或者使用的是另一个默认Servlet的名字未知的Servlet容器,那么,默认Servlet的名字必须被显式提供。


        

你可能感兴趣的:(配置Spring MVC2)