Spring-webmvc

spring mvc配置

2019-07-12  本文已影响0人  xzz4632

1. 启用mvc配置

<mvc:annotation-driven/>

2. 使用mvc配置API

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    // 实现各种方法
}

3. 添加类型转换

默认情况下,会安装NumberDate类型的格式化程序,包括对@NumberFormat@DateTimeFormat注释的支持。如果类路径上存在Joda-Time,则还安装了对Joda-Time格式化库的完全支持。

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // FormatterRegistry 对象提供了一系列的addxxx方法, 添加各种转换器
    }
    <mvc:annotation-driven conversion-service="conversionService"/>

    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="org.example.MyConverter"/>
            </set>
        </property>
        <property name="formatters">
            <set>
                <bean class="org.example.MyFormatter"/>
                <bean class="org.example.MyAnnotationFormatterFactory"/>
            </set>
        </property>
        <property name="formatterRegistrars">
            <set>
                <bean class="org.example.MyFormatterRegistrar"/>
            </set>
        </property>
    </bean>

4. 添加验证器

默认情况下,如果类路径上存在Bean验证器(例如Hibernate Validator),LocalValidatorFactory Bean将注册为全局验证器,可以使用@Valid@Validated注解验证控制器方法参数。

    @Override
    public Validator getValidator() {
        // 返回一个实现了Validator接口的验证器
    }
<mvc:annotation-driven validator="globalValidator"/>

注:还可以在controller类中通过@InitBinder方法注册本地验证器.

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(new FooValidator());
    }

5. 配置拦截器

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/admin/**"/>
        <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/secure/*"/>
        <bean class="org.example.SecurityInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

6. 配置Content Type

spring如何根据accept请求头或路径的扩展名或某个参数来确定请求的content-type. 默认先检查路径的扩展名, 再检查accept请求头.

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.mediaType("json", MediaType.APPLICATION_JSON);
        configurer.mediaType("xml", MediaType.APPLICATION_XML);
    }
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>

7. 配置Message转换器

您可以通过覆盖configureMessageConverters()(替换Spring MVC创建的默认转换器)或覆盖extendMessageConverters()(定制默认转换器或向默认转换器添加额外的转换器)来定制HttpMessageConverter。

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 
    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //
    }
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
        <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter"></bean>
    </mvc:message-converters>
</mvc:annotation-driven>

8. 配置视图控制器

例如: 定义ParameterizableViewController的快捷方式,它在调用时立即转发到视图。当视图生成响应之前没有Java控制器逻辑可执行时,可以在静态情况下使用它。例如: 将一个请求转发给一个名为home的视图:

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
<mvc:view-controller path="/" view-name="home"/>

9. 配置视图解析器

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.enableContentNegotiation(new MappingJackson2JsonView());
        registry.freeMarker().cache(false);
    }

<mvc:view-resolvers>
    <mvc:content-negotiation>
        <mvc:default-views>
            <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
        </mvc:default-views>
    </mvc:content-negotiation>
    <mvc:freemarker cache="false"/>
</mvc:view-resolvers>

10. 静态资源配置

给定一个以/resources开头的请求,相对路径用于查找web应用程序根目录下的/public或类路径下的/static的静态资源。这些资源将在未来一年到期,以确保最大限度地使用浏览器缓存:

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
            .addResourceLocations("/public", "classpath:/static/")
            .setCachePeriod(31556926);
    }
<mvc:resources mapping="/resources/**" location="/public, classpath:/static/"
    cache-period="31556926" />
上一篇 下一篇

猜你喜欢

热点阅读