最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Spring中的PathVariable注释代码解析
时间:2022-06-29 02:07:08 编辑:袖梨 来源:一聚教程网
本篇文章小编给大家分享一下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)(@PathVariable id) { }
从上面的代码片段可以看到,现在“ 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' 请求参数
相关文章
- 《无限暖暖》天星之羽获得位置介绍 12-20
- 《流放之路2》重铸台解锁方法介绍 12-20
- 《无限暖暖》瞄准那个亮亮的成就怎么做 12-20
- 《无限暖暖》魔气怪终结者完成方法 12-20
- 《无限暖暖》曙光毛团获得位置介绍 12-20
- 《无限暖暖》日光果获得位置介绍 12-20