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

来源:互联网 发布:java 多线程 csdn 编辑:程序博客网 时间:2024/05/22 15:27

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

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 锁子里面卡东西怎么办 东西卡在锁里怎么办 开车门碰到旁边车门怎么办 美团退款后 物品怎么办 倒车影像是反的怎么办 荒野行动cp版玩着玩着关机怎么办 王者荣耀点击开始游戏就闪退怎么办 电脑遥控游玩ps4画面抖动怎么办 ps4特典不能用了怎么办 苹果x出现的分屏怎么办 电脑注册表文件丢失或损坏怎么办 cad绘图反应很慢怎么办 拍到货商家下架怎么办 电动车头太活了怎么办 快捷方式在根目录找不到了怎么办 神秘海域4卡bug了怎么办 地下城老是闪退怎么办 强制关机后电脑打不开了怎么办 文明5地中海的海军怎么办 文明5被贸易禁运怎么办 文明5海里的食物怎么办 文明5遗址没了怎么办 ⅰpad屏幕动不了怎么办 苹果6plus满了怎么办 cf的fps低怎么办win7 游戏倒闭冲的钱怎么办 一闭眼就做噩梦怎么办 吃鸡游戏上瘾了怎么办 使命召唤7很卡怎么办 w10升级系统卡死怎么办 答题卡写错位置怎么办 高考答错区域该怎么办 荒野行动画面中间有条横怎么办 荒野行动pc闪退怎么办 幽灵行动荒野子弹没了怎么办 看门狗2枪没子弹怎么办 爱奇艺不小心删除了本地视频怎么办 80岁老太太就爱闹肚子怎么办? 皇牌空战5弹药不够怎么办 辐射4玩着头晕怎么办 官司打赢了法院不给钱怎么办