《Spring 5 官方文档》18. Web MVC 框架(十)-阿里云开发者社区

开发者社区> 开发与运维> 正文

《Spring 5 官方文档》18. Web MVC 框架(十)

简介:

18.16配置Spring MVC

第18.2.1节“WebApplicationContext中的特殊Bean类型”第18.2.2节“默认DispatcherServlet配置”解释了Spring MVC的特殊bean以及该使用的默认实现DispatcherServlet。在本节中,您将了解配置Spring MVC的两种其他方法。即MVC Java配置和MVC XML命名空间。

MVC Java配置和MVC命名空间提供了类似的默认配置,可以覆盖DispatcherServlet默认配置。目标是使大多数应用程序不必创建相同的配置,并提供更高级别的构造,用于配置作为简单起始点的Spring MVC,并且需要很少或根本没有底层配置的知识。

您可以根据自己的喜好选择MVC Java配置或MVC命名空间。另外,您将在下面进一步看到,使用MVC Java配置,可以更容易地查看底层配置,以及直接对创建的Spring MVC bean进行细粒度的自定义。但是让我们从一开始就开始。

18.16.1启用MVC Java Config或MVC XML命名空间

要启用MVC Java配置,请将注释添加@EnableWebMvc到您的一个 @Configuration类中:

@Configuration 
@EnableWebMvc
 public  class WebConfig {

}

要在XML中实现相同的使用mvc:annotation-drivenDispatcherServlet上下文中的元素(如果您没有定义DispatcherServlet上下文,则在根上下文中):

<?xml version =“1.0”encoding =“UTF-8”?> 
<beans  xmlns = “http://www.springframework.org/schema/beans” 
	xmlns:mvc = “http://www.springframework.org / schema / mvc“ 
	xmlns:xsi = ”http://www.w3.org/2001/XMLSchema-instance“ 
	xsi:schemaLocation = ”
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd“ >

	<MVC:注释驱动/>

</豆>

在上述寄存器一RequestMappingHandlerMapping,一个RequestMappingHandlerAdapter,和ExceptionHandlerExceptionResolver在支持带注释控制器方法的处理请求(等等)使用注释诸如@RequestMapping, @ExceptionHandler和其他。

它还支持以下功能:

  1. 除了用于数据绑定的JavaBeans PropertyEditor之外,还可以 通过ConversionService实例进行Spring 3样式类型转换。
  2. 支持格式使用数字字段@NumberFormat通过注释ConversionService
  3. 支持的格式 DateCalendarLong,和乔达时间使用的字段 @DateTimeFormat注解。
  4. 支持验证 @Controller输入@Valid,如果JSR-303提供程序存在于类路径中。
  5. HttpMessageConverter支持@RequestBody方法参数和@ResponseBody 方法返回值@RequestMapping@ExceptionHandler方法。

    这是由mvc设计的HttpMessageConverters的完整列表:annotation-driven:

    1. ByteArrayHttpMessageConverter 转换字节数组。
    2. StringHttpMessageConverter 转换字符串。
    3. ResourceHttpMessageConverter转换为/从 org.springframework.core.io.Resource为所有媒体类型。
    4. SourceHttpMessageConverter转换到/从a javax.xml.transform.Source
    5. FormHttpMessageConverter将表单数据转换为/从a转换MultiValueMap<String, String>
    6. Jaxb2RootElementHttpMessageConverter 将Java对象转换为/从XML中添加 – 如果存在JAXB2,并且类别路径中不存在Jackson 2 XML扩展名。
    7. MappingJackson2HttpMessageConverter 转换为/从JSON中添加,如果杰克逊2存在于类路径。
    8. MappingJackson2XmlHttpMessageConverter转换为/从XML中添加,如果 Jackson 2 XML扩展存在于类路径中。
    9. MappingJackson2SmileHttpMessageConverter转换为/从微笑(二进制JSON) – 添加如果 杰克逊2微笑扩展 存在于类路径。
    10. MappingJackson2CborHttpMessageConverter转换为/从CBOR – 添加如果 杰克逊2 CBOR扩展 存在于类路径。
    11. AtomFeedHttpMessageConverter 转换Atom Feed – 如果罗马存在于类路径中则添加。
    12. RssChannelHttpMessageConverter 转换RSS提要 – 如果罗马存在于类路径中,则会添加。

有关如何自定义这些默认转换器的更多信息,请参见第18.16.12节“消息转换器”

[注意]
使用ObjectMapper创建的实例创建 Jackson JSON和XML转换器Jackson2ObjectMapperBuilder ,以提供更好的默认配置。此构建器使用以下命令自定义Jackson的默认属性:

如果在类路径中检测到它们,它也会自动注册以下众所周知的模块:

  1. jackson-datatype-jdk7:支持Java 7类型java.nio.file.Path
  2. jackson-datatype-joda:支持Joda-Time类型。
  3. jackson-datatype-jsr310:支持Java 8 Date&Time API类型。
  4. jackson-datatype-jdk8:支持其他Java 8类型Optional

18.16.2定制提供的配置

要定制Java中的默认配置,您只需实现该 WebMvcConfigurer接口,或者更有可能扩展该类WebMvcConfigurerAdapter 并覆盖所需的方法:

@Configuration 
@EnableWebMvc
 public  class WebConfig extends WebMvcConfigurerAdapter {

	//覆盖配置方法...

}

要自定义默认配置,<mvc:annotation-driven/>检查它支持哪些属性和子元素。您可以查看 Spring MVC XML模式或使用IDE的代码完成功能来发现哪些属性和子元素可用。

18.16.3转换和格式化

默认情况下,已安装格式化程序NumberDate类型,包括对@NumberFormat@DateTimeFormat注释的支持。如果Joda时间存在于类路径上,则还将完全支持Joda Time格式化库。要注册自定义格式化程序和转换器,请覆盖该addFormatters方法:

@Configuration 
@EnableWebMvc
 public  class WebConfig extends WebMvcConfigurerAdapter {

	@Override
	 public  void addFormatters(FormatterRegistry registry){
		 //添加格式化程序和/或转换器
	}

}

在MVC命名空间<mvc:annotation-driven>中,添加相同的默认值。注册自定义格式化器和转换器只需提供一个ConversionService

<?xml version =“1.0”encoding =“UTF-8”?> 
<beans  xmlns = “http://www.springframework.org/schema/beans” 
	xmlns:mvc = “http://www.springframework.org / schema / mvc“ 
	xmlns:xsi = ”http://www.w3.org/2001/XMLSchema-instance“ 
	xsi:schemaLocation = ”
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd“ >

	<mvc:annotation-driven  conversion-service = “conversionService” />

	<豆 ID = “conversionService” 
			 = “org.springframework.format.support.FormattingConversionServiceFactoryBean” > 
		<属性  = “转换器” > 
			<设定> 
				<豆  = “org.example.MyConverter” /> 
			</设定> 
		< / 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>

</豆>
[注意]
参见5.6.4节,“FormatterRegistrar SPI”FormattingConversionServiceFactoryBean 关于何时使用FormatterRegistrars更多的信息。

18.16.4验证

Spring提供了一个验证器接口,可用于在应用程序的所有层中进行验证。在Spring MVC中,您可以将其配置为用作全局Validator实例,以在遇到@Valid@Validated控制器方法参数时使用,和/或Validator通过@InitBinder方法作为控制器中的本地 使用。可以组合全局和本地验证器实例以提供复合验证。

Spring还支持JSR-303 / JSR-349 Bean验证,通过LocalValidatorFactoryBean它可以将Spring org.springframework.validation.Validator 界面适应Bean验证javax.validation.Validator合同。这个类可以插入Spring MVC作为下面描述的全局验证器。

默认情况下,通过在类路径中检测到一个Bean验证提供程序(如Hibernate Validator)时,可以在Spring MVC中使用@EnableWebMvc<mvc:annotation-driven>自动注册Bean验证支持LocalValidatorFactoryBean

[注意]
有时,将LocalValidatorFactoryBean注入到控制器或其他类中是很方便的。最简单的方法是声明自己的@Bean,并且标记它,@Primary以避免与MVC Java配置提供的冲突。如果你喜欢使用MVC的Java的配置之一,你需要重写 mvcValidator的方法WebMvcConfigurationSupport,并声明明确回报的方法LocalValidatorFactory,而不是Validator。有关 如何切换扩展提供的配置的信息,请参见第18.16.13节“使用MVC Java Config进行高级定制”

或者,您可以配置自己的全局Validator实例:

@Configuration 
@EnableWebMvc
 public  class WebConfig extends WebMvcConfigurerAdapter {

	@Override
	 public Validator getValidator(); {
		 //返回“全局”验证器
	}

}

和XML:

<?xml version =“1.0”encoding =“UTF-8”?> 
<beans  xmlns = “http://www.springframework.org/schema/beans” 
	xmlns:mvc = “http://www.springframework.org / schema / mvc“ 
	xmlns:xsi = ”http://www.w3.org/2001/XMLSchema-instance“ 
	xsi:schemaLocation = ”
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd“ >

	<mvc:annotation-driven  validator = “globalValidator” />

</豆>

要将全局和本地验证结合起来,只需添加一个或多个本地验证器:

@Controller
 public  class MyController {

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

}

使用这个最小配置,任何时候遇到一个@Valid@Validated方法参数,它将被配置的验证器验证。任何验证违规将自动BindingResult作为方法参数可访问的错误公开,并且也可以在Spring MVC HTML视图中呈现。

18.16.5拦截器

您可以配置HandlerInterceptorsWebRequestInterceptors应用于所有传入的请求或限制在特定的URL路径模式。

在Java中注册拦截器的示例:

@Configuration 
@EnableWebMvc
 public  class WebConfig extends WebMvcConfigurerAdapter {

	@Override
	 public  void addInterceptors(InterceptorRegistry registry){
		registry.addInterceptor(new LocaleInterceptor());
		registry.addInterceptor(new ThemeInterceptor())。addPathPatterns(“/ **”).excludePathPatterns(“/ admin / **”);
		registry.addInterceptor(new SecurityInterceptor())。addPathPatterns(“/ secure / *”);
	}

}

而在XML中使用<mvc:interceptors>元素:

<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>

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章