zoukankan      html  css  js  c++  java
  • SpringBoot-@PathVariable

    URL变量

    在上一个博客中,学习了如何在@Controller中创建@RequestMapping(或者响应的简写)来处理不同的URL请求。但是在Web应用中URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL:http://weibo.com/user1,http://weibo.com/user2。我们不能对于每一个用户都编写一个被@RequestMapping注解的方法来处理其请求,也就是说,对于相同模式的URL(例如不同用户的主页,它们仅仅是URL中的某一部分不同,为他们各自的用户名,我们说它们具有相同的模式)。

    定义URL变量规则

    可以在@RequestMapping注解中用{}来表明它的变量部分,例如:

    @RequestMapping("/users/{username}")

    这里{username}就是我们定义的变量规则,username是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理:

    • /users/tianmaying
    • /users/ricky
    • users/tmy1234

    需要注意的是,在默认情况下,变量中不可以包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即使你认为tianmaying/ricky是一个存在的用户名。

    获取URL变量

    在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们:

    @RequestMapping("/users/{username}")
        @ResponseBody
        public String userProfile(@PathVariable String username){
    //        return String.format("user %s", username);
            return "user" + username; 
        }

    在上述例子中,当@Controller处理HTTP请求时,userProfile的参数username会自动设置为URL中对应变量username(同名赋值)的值,例如当HTTP请求为/users/fpc

    ,URL变量username的值fpc会被赋给函数参数username,函数的返回值自然是userfpc。

    在默认的情况下,Spring会对@PathVariable注解的变量进行自动赋值,当然你也可以指定@PathVariable使用哪一个URL中的变量:

    @RequestMapping("/users/{username}")
        @ResponseBody
        public String userProfile(@PathVariable("username") String username){
    //        return String.format("user %s", username);
            return "user" + username; 
        }

    运行结果:

     定义多个URL变量

    可以定义URL路由,其中包含多个URL变量:

    @RequestMapping("/user/{username}/blog/{blogId}")
        @ResponseBody
        public String getUerBlog(@PathVariable String username , @PathVariable int blogId) {
            return "user: " + username + "blog->" + blogId;
        }

    这种情况下,Spring能够根据名字自动赋值对应的函数参数值,当然也可以在@PathVariable中显示地表明具体的URL变量值。

    在默认情况下,@PathVariable注解的参数可以是一些基本的简单类型:int,long,Date,String等,Spring能根据URL变量的具体值以及函数参数的类型来进行转换,例如/user/fpc/blog/1,会将“fpc”的值赋给username,而1赋值给int变量blogId。

    运行结果:

    匹配正则表达式

    很多时候,需要对URL变量进行更加精确的定义,例如-用户名只可能包含小写字母,数字,下划线,我们希望:

    • /user/fpc是一个合法的URL
    • /user/#$$$则不是一个合法的URL

    除了简单地定义{username}变量,还可以定义正则表达式进行更精确的控制,定义语法是{变量名:正则表达式}[a-zA-Z0-9_]+是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404Not Found。

    @RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}")

    总结

    • 在@RequestMapping注解中定义URL变量规则
    • 在@RequestMapping注解方法中获取URL变量-@PathVariable
    • @PathVariable指定URL变量名
    • 定义多个URL变量
    • 用正则表达式精确定义URL变量
  • 相关阅读:
    C# 如何比较版本号大小
    C#中复制文件夹及文件的两种方法
    C#解压和压缩文件
    C# NPOI 导入与导出Excel文档 兼容xlsx, xls
    c#使用NPOI导出到excel
    C# 把DataGridView控件数据,转成DataTable
    C# 如何为 datagridview 中增加checkbox列
    Mixed Content: The page at 'xxx' was loaded over HTTPS, but requested an insecure resource 'xxx'.
    c# Winform DataGridView 当前单元格失去焦点的有关问题
    Docker的通俗解释
  • 原文地址:https://www.cnblogs.com/fangpengchengbupter/p/7823493.html
Copyright © 2011-2022 走看看