关于java:SpringMVC-解析五MVC配置

通过后面的介绍,咱们晓得Spring MVC是一个以DispatcherServlet为核心,泛滥组件协同工作的Servlet服务。Spring中容许用户灵便的配置MVC中的各个组件,这就是Spring MVC配置的意义。本文会对Spring提供的各个MVC配置进行具体的介绍,本文次要参考了Spring的官网文档。

MVC配置

启用MVC配置

应用MVC配置的第一步必定是开启MVC配置,Spring提供了@EnableWebMvc注解来启用MVC配置,该注解会引入解析MVC配置的组件。

@Configuration
@EnableWebMvc
public class WebConfig {
}

WebMvcConfigurer

MVC的组件比拟多,构造比较复杂,用户在不理解源码的状况下很难间接进行配置,所以Spring提供了WebMvcConfigurer用于通知用户有哪些属性能够配置。下文咱们会一一介绍接口中的办法。

类型转换服务

咱们能够通过FormatterRegistry向配置中注册类型转换和格式化等服务,如下就配置了MVC日期与String类型之间的转换逻辑。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
        registrar.setUseIsoFormat(true);
        registrar.registerFormatters(registry);
    }
}

校验服务

Spring容器默认提供了参数校验服务Validator,Controller中的参数会由Validator进行校验,MVC配置容许用户自定义校验逻辑,接口定义如下所示:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public Validator getValidator() {
        // ...
    }
}

拦截器

Spring容许用户对所有的申请进行对立解决,如权限校验、时区参数设置等等,解决逻辑能够放在申请解决前、申请解决后和申请解决实现,配置的逻辑如下所示。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
}

音讯转换服务

下面咱们介绍了FormatterRegistry,FormatterRegistry次要提供了简略类型之间的转换,如String转int等,然而对于简单申请体的转换,如@RequestBody中的JSON反序列化为对象等操作,就须要HttpMessageConverter的参加了。Spring默认提供了很多常见的转换服务如Jackson转换和货币日期等的转换。

@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
                .indentOutput(true)
                .dateFormat(new SimpleDateFormat("yyyy-MM-dd"))
                .modulesToInstall(new ParameterNamesModule());
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
        converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
    }
}

View配置

Spring运行依据申请门路间接返回View视图,用户能够通过配置ViewControllerRegistry实现这个性能。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}

Spring还容许用户自定以视图解析逻辑并通过ViewResolverRegistry注册到MVC中:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

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

    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setTemplateLoaderPath("/freemarker");
        return configurer;
    }
}

动态资源配置

如果用户某次申请的数据是动态资源,那么这次申请不应该由Controller逻辑进行解决。Spring提供了ResourceHandlerRegistry让用户配置动态资源匹配规定。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
            .addResourceLocations("/public", "classpath:/static/")
            .setCacheControl(CacheControl.maxAge(Duration.ofDays(365)));
    }
}

当DispatcherServlet映射到”/”门路后,咱们依然能够配置解决动态资源的默认Servlet,动态资源的映射门路是”/**”,优先级比”/”低。个别状况下动态资源的Servlet应该是最低的,启用动态资源的servelt的示例如下所示:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable("myCustomDefaultServlet");
    }
}

门路匹配规定

咱们都晓得在Controller上增加@RequestMapping办法之后,Spring会把申请映射到对应的Controller办法上,那么咱们可不可以管制这个门路匹配过程呢?Spring提供了PathMatchConfigurer让用户能够配置门路匹配规定:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer
            .setPatternParser(new PathPatternParser())
            .addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RestController.class));
    }

    private PathPatternParser patternParser() {
        // ...
    }
}

高级配置

@EnableWebMvc注解的原理就是向容器中注入类名为DelegatingWebMvcConfiguration,该类会读取各个WebMvcConfigurer并对MVC进行配置。所以咱们也能够不应用@EnableWebMvc,通过自定义DelegatingWebMvcConfiguration的模式对MVC进行更灵便的配置。

@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {

    // ...
}

我是御狐神,欢送大家关注我的微信公众号:wzm2zsd

本文最先公布至微信公众号,版权所有,禁止转载!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理