Spring中的PathVariable注释解析

 更新时间:2021年10月25日 14:46:51   作者:zenglintao  
这篇文章主要介绍了Spring中的PathVariable注释用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Spring的PathVariable注释

就像@RequestParam一样,@PathVariable批注用于从HTTP request中提取数据。但是,它们略有不同。区别在于@RequestParam从URL获取参数,而@PathVariable只是从URI中提取参数。

例子

让我们假设你有一个以下 URL 的网站:

http://www.yourwebsite.net/employee/1

上面 URL 中的1表示雇员的 ID。 到目前为止一切ok。 但是现在,从 Spring 控制器看,路径看起来是这样的(取决于您给 id 的名称) :

/employee/{id}

上面的 URL 路径对我们有什么帮助? 因为这个{}语法(碰巧被称为 URI 模板) ,你现在可以把它传递给一个使用@pathvariable 的方法,你的方法和注释看起来如下所示:

@RequestMapping(value="/employee/{id}", method=RequestMethod.GET)
<Access Modifier> <Return Type> <Method Name> (@PathVariable <Type> id) { <body> }

从上面的代码片段可以看到,现在“ id”将从路径中引用{ id }。 让我们用一个真实的例子来尝试:

@Controller
@SpringBootApplication
public class EmployeeManager {
   @RequestMapping(value=" /employee/{id}")
   public String pathVariableDemo(Model model, @PathVariable int id) {
      model.addAttribute("id", id);
      return "demo";
   }
}

现在,Spring查看输出id参数,并将其与模板变量“ id”进行匹配。

请记住,如果我的代码使用“ id”(参数)命名为其他名称,那么它将无法工作。 然而,如果你不想对参数和模板变量使用相同的名字,你可以像这样命名 PathVariable 注释的名字:

@Controller
@SpringBootApplication
public class EmployeeManager {
   @RequestMapping(value=" /employee/{id}")
   public String pathVariableDemo(Model model, @PathVariable("id") int someRandomName) {
      model.addAttribute("id", someRandomName);
      return "demo";
   }
}

从上面的示例中可以看到,我将参数的名称更改为 _someRandomName,_但还添加了@PathVariable (“ id”),它再次指定了我们要引用的模板变量。

最终您有两个选择:

  • 1.为方法参数使用相同的名称
  • 2.在@PathVariable批注中指定模板变量的名称

多个@PathVariable批注

如果你可以有多个@pathvariable 会怎么样? 我们能做到吗? 是的,我们可以! 事实上,这和添加一个@pathvariable 非常相似。

我们来演示一下:

@Controller
@SpringBootApplication
public class EmployeeManager {
   @RequestMapping(value="/{company}/employee/{id}", method=RequestMethod.GET)
   public String pathVariableDemo(@PathVariable("company") String companyName, @PathVariable("id") int employeeId) {
      // handle the code
      return "demo";
   }
}

从上面的代码片段中可以看到,我们有两个模板变量:

  • company
  • id

然后,我们提取每个模板变量,然后通过指定方法参数所引用的临时变量将它们“分配”给方法参数。

@PathVariable vs @RequestParam结论

尽管@PathVariable和@RequestParam都用于从URL提取值,但是可以根据URL的设计使用它们。

通常,@PathVariable通常用于RESTful Web服务中,而@RequestParam用于从查询参数中提取数据。

使用@PathVariable的坑

发现问题

前端路径拼接用户名,因为用户名中是带'.‘这个字符的。类似'Oliver.wang'。前端浏览器F12,发现路径正常拼接'xxxxxx/Oliver.wang?xxx=xxx',后端代码发现,controller层的参数,接收到只有'Oliver'。

解决过程

在方法中多加了一个参数(xxx,HttpServletRequest request){},输出request.ServletPath(),发现路径正常'/xxx/xxx/Oliver.wang'。

解决方案

  • 第一种:加上 {:.+} ,比如 @getMapping(“xxx/{name:.+}”)
  • 第二种:UrlEncode
  • 第三种:request.ServletPath() 拿到路径截取字符串
  • 第四种:不拼接路径,改成'xxxxx?name=Oliver.wang' 请求参数

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot增加注解缓存@Cacheable的实现

    springboot增加注解缓存@Cacheable的实现

    这篇文章主要介绍了springboot增加注解缓存@Cacheable的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java跳出当前的多重嵌套循环的五种方法

    Java跳出当前的多重嵌套循环的五种方法

    在Java编程中,跳出多重嵌套循环可以使用break语句、标号与break组合、return语句、标志变量和异常处理五种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • 浅谈什么是SpringBoot异常处理自动配置的原理

    浅谈什么是SpringBoot异常处理自动配置的原理

    今天给大家带来的是关于Java的相关知识,文章围绕着SpringBoot异常处理自动配置展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • idea指定启动参数、环境变量的过程

    idea指定启动参数、环境变量的过程

    这篇文章主要介绍了idea指定启动参数、环境变量的操作过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Java线程生命周期的终止与复位

    Java线程生命周期的终止与复位

    这篇文章主要介绍了Java线程生命周期的终止与复位,Java的线程状态描述放在Thread类里面的枚举类State中.总共包含了6中状态,具体详情需要的小伙伴可以参考一下文章描述
    2022-07-07
  • 如何两步解决maven依赖导入失败的问题

    如何两步解决maven依赖导入失败的问题

    这篇文章主要介绍了如何两步解决maven依赖导入失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • SpringBoot2零基础到精通之profile功能与自定义starter

    SpringBoot2零基础到精通之profile功能与自定义starter

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇让我们一起学习profile功能与自定义starter
    2022-03-03
  • Java版的7种单例模式写法示例

    Java版的7种单例模式写法示例

    这篇文章主要给大家介绍了关于Java版的7种单例模式写法,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • 详解使用IntelliJ IDEA 配置Maven(入门)

    详解使用IntelliJ IDEA 配置Maven(入门)

    本篇文章主要介绍了详解使用IntelliJ IDEA 配置Maven(入门),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Java策略模式实现简单购物车功能

    Java策略模式实现简单购物车功能

    这篇文章主要介绍了Java策略模式实现简单地购物车,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论