资讯专栏INFORMATION COLUMN

3.3、URI 模板模式(Template Pattern)

caiyongji / 2508人阅读

摘要:模板可以很方便地用于访问一个方法中的的被选择的部分。为模板拟定的文档定义了一个是怎样被参数化的。为了处理注解,需要按名找到匹配模板的变量。在定义模板变量时,你需要更高的精确度。语法的第一部分定义了变量名,第二部分是一个正则表达式。

    这一部分是对 Spring 5 文档的直接翻译,连接是这个。这一部分的示例不再贴代码,请到这个项目的 mvc 分支下查看,本篇示例的控制器名称是 URITemplateController。

    URI 模板可以很方便地用于访问一个 @RequestMapping 方法中的 URL 的被选择的部分。
    URI 模板是一个像URI的字符串,它包含一个或多个变量名。当你用值来替代这些变量时,这个模板就会变成一个 URI。为 URI 模板拟定的 RFC 文档定义了一个 URI 是怎样被参数化的。比如,URI 模板 http://www.example.com/users/{userId} 包含一个变量 userId。把值 fred 赋到这个变量中就产生了 http://www.example.com/users/...。
    在 Spring MVC 中,你可是在一个方法参数上使用注解 @PathVariable,来把这个参数绑定到一个URI模板变量上:

@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable String ownerId, Model model) 
{
    Owner owner = ownerService.findOwner(ownerId);
    model.addAttribute("owner", owner);
    return "displayOwner";
}

    URI 模板 “/owners/{ownerId}” 指定了一个名叫 ownerId 的变量。当控制器处理这个请求时,ownerId 的值被设置为从 URI 中解析出来的合适的部分。比如,当请求 /owners/fred 进来时,fred 就是 ownerId 的值。

    为了处理注解 @PathVariable,Spring MVC 需要按名找到匹配URI模板的变量。你可以在这个注解中指定:

@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable("ownerId") String theOwner, Model model) 
{
    // implementation omitted
}

    如果 URI 模板变量名匹配方法参数名,那么你可以省略详细配置。只要你的代码在编译时带有调试信息或者在使用 Java 8 编译时使用参数 -parameters,Spring MVC 就会匹配方法参数名到 URI 模板变量名:

@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable String ownerId, Model model) 
{
    // implementation omitted
}

    一个方法可以有任何数量的注解 @PathVariable:

@GetMapping("/owners/{ownerId}/pets/{petId}")
public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) 
{
    Owner owner = ownerService.findOwner(ownerId);
    Pet pet = owner.getPet(petId);
    model.addAttribute("pet", pet);
    return "displayPet";
}

    当在一个Map参数上使用 @PathVariable 注解时,这个 Map 会被填上所有的 URI 模板变量。

    一个 URI 模板可以被集成到类和方法级别的@RequestMapping 注解上。方法 findPet() 可以被一个 /owners/42/pets/21 这样的 URI 调用。

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController 
{
    @RequestMapping("/pets/{petId}")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) 
{
        // implementation omitted
    }
}

    一个 @PathVariable 参数可以是任何简单类型,比如 int,long,Date 等。Spring 自动转换到合适的类型,如果转换失败,就抛出一个 TypeMismatchException 异常。你也可以注册自己的数据类型转换支持。参见“方法参数和类型转换”和“自定义 WebDataBinder 初始化”。

    在定义URI模板变量时,你需要更高的精确度。考虑 URL“/spring-web/spring-web-3.0.5.jar”。你怎么把它分成几部分呢?
    注解 @RequestMapping 支持在 URI 模板变量中使用正则表达式。语法 {varName:regex} 的第一部分定义了变量名,第二部分是一个正则表达式。例如:

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:d.d.d}{extension:.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) 
{
    // ...
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65118.html

相关文章

  • Notification通知栏

    摘要:当向系统发出通知时,它将先以图标的形式显示在通知栏中。通知栏和抽屉式通知栏均是由系统控制,用户可以随时查看。更新通知跟发送通知使用相同的方式。创建返回栈添加返回栈代码默认情况下,从通知启动一个,按返回键会回到主屏幕。 目录介绍 1.Notification简单概述 2.Notification通知用途 3.Notification的基本操作 3.1 Notification创建必要的...

    FWHeart 评论0 收藏0
  • vue开发项目完全指南

    摘要:有两种方法,一种是在开发环境中设置通过的,另一种是在服务器上修改的配置设置。这样我们以后使用访问接口就可以不加了,打包后访问也不用手动去除统一管理在项目开发过程中,会涉及到很多接口的处理,当项目足够大时,就需要统一管理接口。 这篇文章总结了vue项目的所遇到的问题,包括跨域、用户认证、接口统一管理、路由配置、兼容性处理,性能优化等内容。 项目github地址 : 前端 https:...

    leoperfect 评论0 收藏0
  • Play framework源码解析 Part3:Play的初始化与启动

    摘要:使用自建的类加载器主要是为了便于处理预编译后的字节码以及方便在模式下进行即时的热更新。 注:本系列文章所用play版本为1.2.6 在上一篇中,我们分析了play的2种启动方式,这一篇,我们来看看Play类的初始化过程 Play类 无论是Server还是ServletWrapper方式运行,在他们的入口中都会运行Play.init()来对Play类进行初始化。那在解析初始化之前,我们先...

    xuxueli 评论0 收藏0
  • PostgreSQL的实践一:初识

    摘要:每个服务由多个进程组成,为首的进程名为。服务使用字节长的内部事务标识符,即时发生重叠后仍然继续使用,这会导致问题,所以需要定期进行操作。操作被认为是紧跟操作后的操作。在涉及高比例插入删除的表中,会造成索引膨胀,这时候可以重建索引。 简介和认知 发音 post-gres-q-l 服务(server) 一个操作系统中可以启动多个postgres服务。每个服务由多个进程组成,为首的进程名为p...

    yibinnn 评论0 收藏0
  • 设计模式

    摘要:设计模式目的为了代码可重用性让代码更容易被他人理解保证代码可靠性设计原则设计原则是设计模式为了达到其目的,所实现的一些准则。 设计模式简介 1.什么是设计模式 设计模式对是经验的总结,是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。代表了最佳的实战。 2.提出及GOF 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnso...

    enrecul101 评论0 收藏0

发表评论

0条评论

caiyongji

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<