栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring框架学习 - Spring MVC 之 MVC 配置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring框架学习 - Spring MVC 之 MVC 配置

接上一篇博客:https://blog.csdn.net/qq_43605444/article/details/122150147?spm=1001.2014.3001.5502

11、MVC 配置

MVC Java 配置和 MVC XML 命名空间提供适用于大多数应用程序的默认配置和一个配置 API 来自定义它。

有关配置 API 中不可用的更高级自定义,请参阅高级 Java 配置和高级 XML 配置。

您不需要了解由 MVC Java 配置和 MVC 命名空间创建的底层 bean。 如果您想了解更多信息,请参阅特殊 Bean 类型和 Web MVC 配置。

11.1 启用 MVC 配置

在 Java 配置中,您可以使用 @EnableWebMvc 注解来启用 MVC 配置,如下例所示:

@Configuration
@EnableWebMvc
public class WebConfig {
}

在 XML 配置中,您可以使用 元素来启用 MVC 配置,如下例所示:




    


前面的示例注册了许多 Spring MVC 基础设施 bean 并适应类路径上可用的依赖项(例如,JSON、XML 等的有效负载转换器)。

11.2 MVC 配置 API

在 Java 配置中,您可以实现 WebMvcConfigurer 接口,如下例所示:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    // Implement configuration methods...
}

在 XML 中,您可以检查 的属性和子元素。 您可以查看 Spring MVC XML 模式或使用 IDE 的代码完成功能来发现哪些属性和子元素可用。

11.3 类型转换

默认情况下,安装了各种数字和日期类型的格式化程序,并支持通过 @NumberFormat 和 @DateTimeFormat 对字段进行自定义。

要在 Java 配置中注册自定义格式化程序和转换器,请使用以下命令:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // ...
    }
}

要在 XML 配置中执行相同操作,请使用以下命令:




    

    
        
            
                
            
        
        
            
                
                
            
        
        
            
                
            
        
    


默认情况下,Spring MVC 在解析和格式化日期值时会考虑请求区域设置。 这适用于将日期表示为带有“输入”表单字段的字符串的表单。 但是,对于“日期”和“时间”表单字段,浏览器使用 HTML 规范中定义的固定格式。 对于这种情况,可以按如下方式自定义日期和时间格式:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

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

有关何时使用 FormatterRegistrar 实现的更多信息,请参阅 FormatterRegistrar SPI 和 FormattingConversionServiceFactoryBean。

11.4 验证

默认情况下,如果类路径上存在 Bean 验证(例如,Hibernate Validator),则 LocalValidatorFactoryBean 被注册为全局验证器,以与控制器方法参数上的 @Valid 和 Validated 一起使用。

在 Java 配置中,您可以自定义全局 Validator 实例,如下例所示:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

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

下面的例子展示了如何在 XML 中实现相同的配置:




    


请注意,您还可以在本地注册 Validator 实现,如以下示例所示:

@Controller
public class MyController {

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

如果您需要在某处注入 LocalValidatorFactoryBean,请创建一个 bean 并使用 @Primary 对其进行标记,以避免与 MVC 配置中声明的 bean 发生冲突。

11.5 拦截器

在 Java 配置中,您可以注册拦截器以应用于传入请求,如下例所示:

@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/*");
    }
}

下面的例子展示了如何在 XML 中实现相同的配置:


    
    
        
        
        
    
    
        
        
    

11.5 内容类型

您可以配置 Spring MVC 如何从请求中确定请求的媒体类型(例如,Accept 标头、URL 路径扩展、查询参数等)。

默认情况下,仅检查 Accept 标头。

如果您必须使用基于 URL 的内容类型解析,请考虑对路径扩展使用查询参数策略。 有关更多详细信息,请参阅后缀匹配和后缀匹配和 RFD。

在 Java 配置中,您可以自定义请求的内容类型解析,如下例所示:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.mediaType("json", MediaType.APPLICATION_JSON);
        configurer.mediaType("xml", MediaType.APPLICATION_XML);
    }
}

下面的例子展示了如何在 XML 中实现相同的配置:




    
        
            json=application/json
            xml=application/xml
        
    

11.6 消息转换器

您可以通过覆盖 configureMessageConverters()(替换 Spring MVC 创建的默认转换器)或通过覆盖 extendMessageConverters()(自定义默认转换器或向默认转换器添加其他转换器)来自定义 Java 配置中的 HttpMessageConverter。

以下示例使用自定义的 ObjectMapper 而不是默认的来添加 XML 和 Jackson JSON 转换器:

@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List> 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()));
    }
}

在前面的示例中,Jackson2ObjectMapperBuilder 用于为启用缩进的 MappingJackson2HttpMessageConverter 和 MappingJackson2XmlHttpMessageConverter 创建通用配置,自定义日期格式,以及 jackson-module-parameter-names 的注册,这增加了对访问参数名称的支持(Java 8 中添加的功能)。

此构建器自定义 Jackson 的默认属性如下:

  • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 已禁用。
  • MapperFeature.DEFAULT_VIEW_INCLUSION 已禁用。

如果在类路径中检测到以下知名模块,它还会自动注册:

  • jackson-datatype-joda:支持 Joda-Time 类型。
  • jackson-datatype-jsr310:支持 Java 8 日期和时间 API 类型。
  • jackson-datatype-jdk8:支持其他 Java 8 类型,例如 Optional。
  • jackson-module-kotlin:支持 Kotlin 类和数据类。

除了jackson-dataformat-xml之外,使用 Jackson XML 支持启用缩进还需要 woodstox-core-asl 依赖项。

其他有趣的 Jackson 模块可用:

  • jackson-datatype-money:支持 javax.money 类型(非官方模块)。
  • jackson-datatype-hibernate:支持特定于 Hibernate 的类型和属性(包括延迟加载方面)。

下面的例子展示了如何在 XML 中实现相同的配置:


    
        
            
        
        
            
        
    





11.7 视图控制器

这是定义 ParameterizableViewController 的快捷方式,该控制器在调用时立即转发到视图。 当在视图生成响应之前没有 Java 控制器逻辑要运行时,您可以在静态情况下使用它。

以下 Java 配置示例将对/ 的请求转发到名为 home 的视图:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

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

下面的示例通过使用 元素实现与前面的示例相同的事情,但使用 XML:


如果 @RequestMapping 方法映射到任何 HTTP 方法的 URL,则视图控制器不能用于处理相同的 URL。 这是因为 URL 与带注解的控制器的匹配被认为是端点所有权的足够强的指示,因此可以将 405 (METHOD_NOT_ALLOWED)、415 (UNSUPPORTED_MEDIA_TYPE) 或类似的响应发送到客户端以帮助调试。 出于这个原因,建议避免在带注解的控制器和视图控制器之间拆分 URL 处理。

11.8 视图解析器

MVC 配置简化了视图解析器的注册。

以下 Java 配置示例通过使用 JSP 和 Jackson 作为 JSON 渲染的默认视图来配置内容协商视图解析:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

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

下面的例子展示了如何在 XML 中实现相同的配置:


    
        
            
        
    
    

但是请注意,FreeMarker、Tiles、Groovy Markup 和脚本模板也需要底层视图技术的配置。

MVC 命名空间提供专用元素。 以下示例适用于 FreeMarker:


    
        
            
        
    
    



    

在 Java 配置中,您可以添加相应的配置器 bean,如以下示例所示:

@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;
    }
}
11.9 静态资源

此选项提供了一种从基于资源的位置列表提供静态资源的便捷方法。

在下一个示例中,给定以 /resources 开头的请求,相对路径用于查找和提供相对于 Web 应用程序根目录下的 /public 或 /static 下的类路径上的静态资源。 这些资源在未来一年内到期,以确保最大限度地使用浏览器缓存并减少浏览器发出的 HTTP 请求。 Last-Modified 信息是从 Resource#lastModified 推导出来的,因此“Last-Modified”标头支持 HTTP 条件请求。

以下清单显示了如何使用 Java 配置执行此操作:

@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)));
    }
}

下面的例子展示了如何在 XML 中实现相同的配置:


另请参阅静态资源的 HTTP 缓存支持。

资源处理程序还支持一系列 ResourceResolver 实现和 ResourceTransformer 实现,您可以使用它们来创建用于处理优化资源的工具链。

您可以将 VersionResourceResolver 用于基于从内容、固定应用程序版本或其他计算出的 MD5 哈希的版本化资源 URL。 ContentVersionStrategy (MD5 hash) 是一个不错的选择 — 有一些明显的例外,例如与模块加载器一起使用的 Javascript 资源。

以下示例显示了如何在 Java 配置中使用 VersionResourceResolver:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public/")
                .resourceChain(true)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }
}

下面的例子展示了如何在 XML 中实现相同的配置:


    
        
            
                
            
        
    

然后,您可以使用 ResourceUrlProvider 来重写 URL 并应用完整的解析器和转换器链 —例如,插入版本。 MVC 配置提供了一个 ResourceUrlProvider bean,以便它可以注入其他人。 您还可以使用 ResourceUrlEncodingFilter 为 Thymeleaf、JSP、FreeMarker 和其他具有依赖于 HttpServletResponse#encodeURL 的 URL 标记的重写透明化。

请注意,当同时使用 EncodedResourceResolver(例如,用于提供 gzip 或 brotli 编码的资源)和 VersionResourceResolver 时,您必须按此顺序注册它们。 这确保基于未编码的文件始终可靠地计算基于内容的版本。

WebJars 也通过 WebJarsResourceResolver 得到支持,当 org.webjars:webjars-locator-core 库出现在类路径上时,它会自动注册。 解析器可以重写 URL 以包含 jar 的版本,也可以匹配没有版本的传入 URL — 例如,从 /jquery/jquery.min.js 到 /jquery/1.2.0/jquery.min.js。

基于 ResourceHandlerRegistry 的 Java 配置为细粒度控制提供了更多选项,例如 最后修改的行为和优化的资源解析。

11.10 默认 Servlet

Spring MVC 允许将 DispatcherServlet 映射到 /(从而覆盖容器默认 Servlet 的映射),同时仍然允许静态资源请求由容器的默认 Servlet 处理。 它使用 /** 的 URL 映射和相对于其他 URL 映射的最低优先级配置 DefaultServletHttpRequestHandler。

此处理程序将所有请求转发到默认 Servlet。 因此,它必须在所有其他 URL HandlerMappings 的顺序中保持最后。 如果您使用 ,就是这种情况。 或者,如果您设置自己的自定义 HandlerMapping 实例,请确保将其 order 属性设置为低于 DefaultServletHttpRequestHandler 的值,即 Integer.MAX_VALUE。

以下示例显示如何使用默认设置启用该功能:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

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

下面的例子展示了如何在 XML 中实现相同的配置:


覆盖 / Servlet 映射的警告是默认 Servlet 的 RequestDispatcher 必须通过名称而不是路径来检索。 DefaultServletHttpRequestHandler 尝试在启动时自动检测容器的默认 Servlet,使用大多数主要 Servlet 容器(包括 Tomcat、Jetty、GlassFish、JBoss、Resin、WebLogic 和 WebSphere)的已知名称列表。 如果默认 Servlet 已使用不同的名称进行自定义配置,或者如果在默认 Servlet 名称未知的情况下使用了不同的 Servlet 容器,则必须明确提供默认 Servlet 的名称,如以下示例所示:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

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

下面的例子展示了如何在 XML 中实现相同的配置:


11.11 路径匹配

您可以自定义与路径匹配和 URL 处理相关的选项。 有关各个选项的详细信息,请参阅 PathMatchConfigurer javadoc。

以下示例显示了如何在 Java 配置中自定义路径匹配:

@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() {
        // ...
    }
}

下面的例子展示了如何在 XML 中实现相同的配置:


    




11.12 高级 Java 配置

@EnableWebMvc 导入 DelegatingWebMvcConfiguration,其中:

  • 为 Spring MVC 应用程序提供默认的 Spring 配置
  • 检测并委托给 WebMvcConfigurer 实现以自定义该配置。

对于高级模式,您可以删除 @EnableWebMvc 并直接从 DelegatingWebMvcConfiguration 扩展,而不是实现 WebMvcConfigurer,如下例所示:

@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {

    // ...
}

您可以在 WebConfig 中保留现有方法,但现在您还可以覆盖基类中的 bean 声明,并且您仍然可以在类路径上拥有任意数量的其他 WebMvcConfigurer 实现。

11.13 高级 XML 配置

MVC 命名空间没有高级模式。 如果您需要在 bean 上自定义一个您无法更改的属性,您可以使用 Spring ApplicationContext 的 BeanPostProcessor 生命周期钩子,如以下示例所示:

@Component
public class MyPostProcessor implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {
        // ...
    }
}

请注意,您需要将 MyPostProcessor 声明为 bean,无论是在 XML 中显式地还是通过 声明来检测它。

文章参考:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-config

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/681631.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号