您的位置:首页 > 编程语言 > Java开发

Spring 4.x官方参考文档中文版——第21章 Web MVC框架(7)

2016-05-27 21:09 477 查看
Consumable Media Types(消耗型媒体类型)

你能通过定义一组消耗型媒体类型来收窄主要的映射对象,request请求只匹配Content-Type报头的特定请求媒体类型,例如:



消耗型媒体类型表达式可以写成“!text/plain”来代表Content-Type中不是text/plain媒体类型的类型。也可以考虑使用在MediaType中提供的常量,比如:APPLICATION_JSON_VALUE和APPLICATION_JSON_UTF8_VALUE。

小提示:
cosumes条件可支持类级和方法级,不像大多数其他的条件那样,在类级别的时候,方法级别的消耗型类型会覆盖类级别的消耗型类型,而不是扩展类级别的消耗型类型。

Producible Media Types(生产型媒体类型)
你能通过定义一组生产型媒体类型来收窄主要的映射对象,request请求只在Accept请求报头中含有匹配值的时候才进行匹配。除此之外,运用produces条件,可以保证用来生成在produces条件下生成的response(响应)的mediatypes(媒体类型),是准确的content type(内容类型)。




小提示:
要注意,在produces条件下指定的媒体类型有时也会指定了一个字符集。例如:在上方的示例中,我们指定了与在MappingJackson2HttpMessageConverter中默认配置的媒体类型相同的媒体类型,也包括了UTF-8字符集。

就像consumes一样,生产型媒体类型表达式也可以写成“!text/plain”来代表Accept报头中不是text/plain媒体类型的类型。也可以考虑使用在MediaType中提供的常量,比如:APPLICATION_JSON_VALUE和APPLICATION_JSON_UTF8_VALUE。

小提示:
produces条件可支持类级和方法级,不像大多数其他的条件那样,在类级别的时候,方法级别的消耗型类型会覆盖类级别的消耗型类型,而不是扩展类级别的消耗型类型。

请求参数和报头值

你能够通过如”myParam”,”!myParam”或者”myParam=myValue”这样的请求参数来收窄请求的匹配。上面的三个实例里,前两个是检测请求参数是否存在的,第三个是检测参数是否是特定值的。下面是一个运用请求参数值条件的例子:



同样地,也可以检测请求的报头是否存在,或者检测请求报头里是否包含一个指定值:



小提示:
虽然你可以使用媒体类型的通配符来匹配Content-Type和Accept报头值,(比如: “content-type=text/*”会匹配到“text/plain”和”text/html”),但是还是推荐分别使用consumes和produces条件来进行匹配。因为它们就是为了实现这些特定目的而生的。

定义@RequestMapping处理器方法
@RequestMapping处理器方法拥有非常灵活的特征,它所支持的方法参数和返回值将会在接下来的章节进行介绍。除了BindingResult参数外,大多数参数都能以任意的规则使用,这将会在下一章节详述。

小提示:
Spring 3.1介绍了@RequestMapping方法中新的支持类,分别称为RequestMappingHandlerMapping和RequestMappingHandlerAdapter。为了使用SpringMVC 3.1以上版本的新特性,它们是必须要使用的。这些新支持类在MVC 命名空间或者MVC Java配置中是默认被启用的,如果两者都不使用时,需要显式配置。

支持的方法参数类型
以下是支持的方法参数:

请求,或者响应的对象(Servlet API),可以选择任意的请求,响应类型,比如:ServletRequest或者HttpServletRequest。
在HttpSession下的Session对象(Servlet API),session参数不能为null。

小提示:
Session的访问不是线程安全的,特别是在Servlet环境下。如果需要同时访问多个请求下的session,需要把RequestMappingHandlerAdapter的synchronizeOnsession设置为true。

org.springframework.web.contet.request.WebRequest或org.springframework.web.context.request.NativeWebRequest。允许一般的请求参数和request/session属性的访问,而不需要与本地的Servlet/PortletAPI绑定。
为请求的地区服务的java.util.Locale,这个Locale可以被大多数地区解析器检测到,通过在MVC环境下配置LocaleResolver或LocaleContextResolver来生效。
为请求的时区服务的Java.util.TimeZone(Java6+)或java.time.ZoneId(Java 8),它们可以被LocaleContextResolver检测到。
为访问请求内容服务的java.io.InputStream或java.io.Reader,这些值就是Servlet API中原生的InputStream或Reader对象。
为生成响应内容服务的java.io.OutputStream或java.io.Writer,这些值就是Servlet API中原生的OutputStream或Writer对象。
为HTTP请求方法服务的org.springframework.http.HttpMethod。
包含了当前已验证用户的java.security.Principal。
为了访问URI模板变量的@PathVariable注解的参数,详见”URI模板模式”。
为了访问在URI路径中 名称-值 对的矩阵变量的@MatrixVariable注解参数。
为了访问特定的Servlet请求参数的@RequestParam注解参数。这些参数值会被转化为声明的方法参数类型。详见”利用@RequestParam绑定请求参数到方法参数中”这一章节。
为了访问特定Servlet请求HTTP报头的@RequestHeader注解参数。这些参数值会被转化为声明的方法参数类型,详见”利用@RequestHeader注解映射请求报头属性”。
为访问HTTP请求主体的@RequestBody注释参数,这些参数值使用HttpMessageConverters,转化为声明的方法参数类型。详见”使用@RequestBody注释映射请求主体”部分章节。
为访问一个”multipart/form-data”的请求部分内容的@RequestPart注解参数,详见”从编程式客户端处理文件上传请求”部分章节。
为访问Servlet请求的HTTP报头和内容的HttpEntity<?>参数。这些请求数据流使用HttpMessageConverters,转化为实体主体。详见”使用HttpEntity”部分章节。
为了充实在web视图的model模型部分而使用的java.util.Map/org.springframework.ui.Model/org.springframework.ui.ModelMap。
为了在重定向后使用特定的一组属性,或者添加flash attributes(flash属性)(在服务器端暂存的一组属性,以便在重定向后使用)的org.springframework.web.servlet.mvc.support.RedirectAttributes。详见”把数据传递给重定向目标”和”21.6 使用flash属性”部分章节。
使用自定义的类型转换,依靠@InitBinder方法与/或 HandlerAdapter(处理器适配器)命令或组织对象,把请求的参数绑定到bean属性上(通过setter)或者直接绑定到字段。见RequestMappingHandlerAdapter下的webBindingInitializer属性。默认情况下,这些命令对象和他们的验证结果会被看作模型属性,使用命令类的类名(比如:模型属性”orderAddress”会被作为“some.package.OrderAddress”类型的命令对象),ModelAttribute注解能在方法参数中使用,来自定义所使用的模型属性名。
为前面的命令或表单对象提供验证结果(先前的方法参数)的org.springframework.validation.Errors/org.springframework.validation.BindingResult
org.springframework.web.bind.support.SessionStatus:标记表单处理是否完成的状态,类级别的处理器@SessionAttributes注解检测到的session属性,能根据SessionStatus,触发session属性的清理行为。
org.springframework.web.util.UriComponentsBuilder:能够根据现有请求的host,port(端口),scheme(计划),context路径,和servlet映射中的字节部分来组装URL。

Error或者BindingResult参数必须跟随被绑定的模型对象之后。方法签名里,可能含有不止一个模型对象,Spring会为每个模型对象分开创建BindingResult实例,所以,下面的例子是不能正常工作的:(我也是醉了,官方文档里一段话里一个标点符号都没有!而且还有拼写错误!)
无效的BindingResult和@ModelAttribute顺序.





注意,在Pet和BindingResult之间有一个Model参数,要让这个参数正常运作需要重新调整参数顺序,如下:



小提示:
JDK 1.8的java.util.Optional支持一个拥有required属性的注解的方法参数。(例如:@RequestParam. @RequestHeader等等,在这种情况下,同等于”required = false“)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: