@PathVariable
定义URL变量规则
如图所示
类似的url,可以在@RequestMapping注解中用{ }来表明它的变量部分,例如:
这里的{username}就是我们定义的变量规则,id是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理:
/employee/1545654545
/employee/8485645415
/employee/8974845116
注意:不能同时匹配多个变量,例如:
/employee/1545654545/44553554554
/employee/8485645415/45451234564
但可以定义URL路由包含多个URL变量:
这种情况下,Spring能够根据名字自动赋值对应的函数参数值,当然也可以在@PathVariable中显示地表明具体的URL变量值。
匹配正则表达式(不常用)
很多时候,需要对URL变量进行更加精确的定义。例如,用户名只可能包含大小写字母,数字,下划线,我们希望:
/user/fpc是一个合法的URL
/user/#$$$则是一个不合法的URL
除了简单地定义{username}变量,还可以定义正则表达式进行更精确地控制,定义语法是{变量名: 正则表达式}。[a-zA-Z0-9_]+是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404NotFound。
@RequestMapping(value = "/user/{username: [a-zA-Z0-9]+}/blog/{blogId}")
@RequestParam
在访问各种各样的网站时,经常会发现网站的URL的最后一部分形如:?xx=yy&zz=ww。这就是HTTP协议中的Request参数,它有什么用呢?先看一个例子:
在知乎中搜索web
浏览器跳转到新页面后,URL变为https://www.zhihu.com/search?type=content&q=web
在知乎中搜索java
浏览器跳转到新页面后,URL变为https://www.zhihu.com/search?type=content&q=java
自己遇到的,诸如此类
这里的type=content&q=web就是搜索请求的参数,不同参数之间用&分隔,每个参数形如name=value的形式,分别表示参数名字和参数值。在这个例子中,我们输入不同的搜索关键词,在搜索结果页面的URL的q参数是不同的。也就是说,HTTP参数实际上可以认为是一种用户的输入,根据不同的用户输入,服务器经过处理后返回不同的输出(例如搜索spring和搜索java,显示结果是不一样的)。
在SpringMVC框架中,可以通过定义@RequestMapping来处理URL请求。和@PathVariable一样,需要在处理URL的函数中获取URL中的参数,也就是?key1=value1&key2=value2这样的参数列表。通过注解@RequestParam可以轻松地将URL中的参数绑定到处理函数方法的变量中
例如:
二者的相同点:
@RequestParam和@PathVariable都能够完成类似的功能——因为本质上,它们都是用户的输入,只不过输入的部分不同,一个在URL路径部分,另一个在参数部分。要访问一篇博客文章,这两种URL设计都是可以的:
通过@PathVariable,例如/employee/1
通过@RequestParam,例如employee?id=1
建议:
1、当URL指向的是某一具体业务资源(或资源列表),例如博客,用户时,使用@PathVariable
2、当URL需要对资源或者资源列表进行过滤,筛选时,用@RequestParam