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

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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Web MVC 框架中,URI Builder 是一个用于构建 URI 的工具类。它可以让你在构建 URI 时更加方便和灵活。 下面我们通过一个例子来演示如何使用 URI Builder。 假设我们有一个控制器方法,它的访问路径为 `/users/{id}`,其中 `{id}` 是一个路径变量,表示用户 ID。我们想要构建这个路径的 URI,同时还想为这个 URI 添加一些查询参数,比如 `name` 和 `age`。我们可以使用 URI Builder 来完成这个任务,代码如下: ```java import org.springframework.web.util.UriComponentsBuilder; ... @RequestMapping("/users/{id}") public String getUser(@PathVariable int id, @RequestParam String name, @RequestParam int age) { UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/users/{id}") .queryParam("name", name) .queryParam("age", age); String uri = builder.buildAndExpand(id).toUriString(); // ... return "user"; } ``` 在上面的代码中,我们首先使用 `UriComponentsBuilder.fromPath()` 方法创建一个 URI Builder 对象,并指定路径为 `/users/{id}`,这里的 `{id}` 是一个路径变量。接着,我们使用 `queryParam()` 方法添加查询参数。最后,我们调用 `buildAndExpand()` 方法来替换路径变量,并构建最终的 URI。 需要注意的是,在使用 `buildAndExpand()` 方法时,我们将用户 ID 作为参数传递给了这个方法。这是因为我们在 URI 中使用了路径变量 `{id}`,需要将其替换为实际的值。 最终,我们调用 `toUriString()` 方法将 URI Builder 对象转换为字符串形式,返回给浏览器。 除了上面的例子,URI Builder 还提供了很多其他的方法,可以让你更加灵活地构建 URI。如果你想要了解更多信息,可以查看 Spring 官方文档中关于 URI Builder 的介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值