springmvc中@PathVariable和@RequestParam的区别

我的url;
http://localhost:8080/Springmvc/user/page.do?pageSize=3&pageNow=2
在controller中这么写:
@RequestMapping(value="/page.do/{pageSize}/{pageNow}")
public String page(@PathVariable int pageSize,@PathVariable int pageNow){}
这个好像有问题。求解

4个回答

http://localhost:8080/Springmvc/user/page.do?pageSize=3&pageNow=2

你可以把这地址分开理解,其中[color=darkred]问号前半部分[/color]:http://localhost:8080/Springmvc/user/page.do 这个就是路径,是你的请求url,而如果这个路径上有数据匹配,用的就是@PathVariable 如
@RequestMapping(value="/page{pageNo}.do")
public String page(@PathVariable int pageNo){}
【注意:看下这地方的@RequestMapping的地址,对照我上面说的路径】

而[color=darkred]问号的后面部分就是请求参数部分[/color],是要向请求路径提交的参数信息,用的就是@RequestParam ,对于这种参数,如果你要用的话,代码应该如下:
@RequestMapping(value="/page.do")
public String page(@RequestParam int pageSize,@RequestParam int pageNow){}

【注意:这个代码的RequestMapping地址只需要/page.do就行】

[color=darkred]其实你只要把什么叫请求路径,什么叫请求参数分清楚,也就能理解@PathVariable和@RequestParam[/color]

我再举个例子,就拿你这个问题在iteye上的地址为例,http://www.iteye.com/problems/101566 这个如果对应sprimgmvc里面,想获取问题编号101566,因为这个地址直接就是请求路径,是一个url,所以代码中用的应该是@PathVariable,如下:
@RequestMapping(value="/problems/{problemId}")
public String showProblem(@PathVariable int problemId){}

Test11ABBV
Test11ABBV 彻底明白了,非常感谢您的耐心解答!太感谢了!!!
5 年多之前 回复
iteye_7115
iteye_7115 而你如果你是想斜杠的样式,就是类似你想http://localhost8080/Springmvc/user/page/3/2 那你的请求路径url-pattern就不能有.do后缀,得改为/*,这样就可以处理/*类型的路径,也就能处理http://localhost8080/Springmvc/user/page/3/2 (这地方没必要再要.do后缀了) 然后对应@RequestMapping(value="/page/{pageSize}/{pageNo}")
5 年多之前 回复
iteye_7115
iteye_7115 如果你想用@PathVariable,就是把请求路径改为http://localhost8080/Springmvc/user/page_3_2.do 对应@RequestMapping就是 @RequestMapping(value="/page_{pageSize}_{pageNo}") public String page(@PathVariable int pageSize,@PathVariable int pageNo)
5 年多之前 回复
iteye_7115
iteye_7115 不对的,你的路径是有.do后缀的,也就是说你的请求路径最后必须以.do结尾,http://localhost8080/Springmvc/user/page.do/3/2 而你这个根本不是以.do结尾,根本过不了你的web.xml里配置的servlet中url-pattern
5 年多之前 回复
Test11ABBV
Test11ABBV 我现在的请求路径是:http://localhost8080/Springmvc/user/page.do/3/2 @RequestMapping(value="/page.do/{x}/{y}") public String page(@PathVariable int x,@PathVariable int y){}z 这样写有什么问题?这样写貌似不对
5 年多之前 回复
iteye_7115
iteye_7115 @RequestMapping(value="/page{pageNo}.do") 这种路径的请求url应该是类似/page1100.do 对照你的请求路径,用的格式应该是这个: @RequestMapping(value="/page.do") public String page(@RequestParam int pageSize,@RequestParam int pageNow){}
5 年多之前 回复
Test11ABBV
Test11ABBV @RequestMapping(value="/page{pageNo}.do") public String page(@PathVariable int pageNo){} 这个对应的请求的url是什么?上面那个@RequestMapping里面的格式怎么写?
5 年多之前 回复

两者的作用都是将request里的参数的值绑定到contorl里的方法参数里的,区别在于,url不同

@PathVariable的url是这样的:http://host:port/.../path/参数值

@RequestMapping("/bookings/{booking}")
public String getBooking(@PathVariable Long booking) {

}

而@RequestParam的url是这样的:http://host:port/.../path?参数名=参数值

@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";

}
zhuxiaojaun
猪呢 我看这个了,在开源中国里面给的这个解释,看了我也没太明白
5 年多之前 回复

顾名思义, @PathVariable和@RequestParam,分别是从路径里面去获取变量,也就是把路径当做变量,后者是从请求里面获取参数。

从你的请求来看:

/Springmvc/user/page.do?pageSize=3&pageNow=2

pageSize和pageNow应该是属于参数而不是路径,所以应该添加@RequestParam的注解。

如果做成如下URL,则可以使用@PathVariable

/Springmvc/user/page/2/3.do

但这样的话语义就不明确的,所以一般来说分页参数都用参数传递。

zhuxiaojaun
猪呢 我也不懂,什么样的算是参数传递,什么样的算是路径中获取?静态url是怎么样的?
5 年多之前 回复

http://localhost:8080/Springmvc/user/page.do/3/2

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!