欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring中的PathVariable注释解析

程序员文章站 2022-03-19 08:41:10
目录spring的pathvariable注释例子多个@pathvariable批注@pathvariable vs @requestparam结论使用@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' 请求参数

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