要把什么叫请求路径,什么叫请求参数分清楚,也就能理解@PathVariable和@RequestParam。
在此要注意:代码中的RequestMapping地址是SpringMVC注解匹配的同名称请求,如果在类仅仅是注明 @Controller 那么此RequestMapping下的方法将会解析所有传给服务后台的page.do操作;
如果声明类前先@Controller 并又注明了一个@RequestMapping,那么本类仅仅是对类声明之前的@RequestMapping的匹配路径有效。
URL示例1:http://localhost:8080/Springmvc/user/page.do?pageSize=3&pageNow=2
可以把这地址分开理解,其中问号前半部分:
http://localhost:8080/Springmvc/user/page.do 这个就是路径,即为请求url;
而问号的后面部分就是请求参数部分,是要向请求路径提交的参数信息,用的就是@RequestParam ,对于这种参数,如果你要用的话,代码应该如下:
@RequestMapping(value="/page.do")
public String page(@RequestParam int pageSize,@RequestParam int pageNow){
//方法参数名称必须和URL中参数部分的参数名称对应。
//方法体
}
URL示例2:http://www.iteye.com/problems/101566?Key=123
这个URL里面,服务器想获取问题编号101566,因为这个参数直接包含在请求路径部分中,所以代码中用的应该是@PathVariable;对于参数部分Key=123,如果想获取到该参数那么应该用参数获取的注解@RequestParam。实现代码如下:
@RequestMapping(value="/problems/{problemId}")
public String showProblem(@PathVariable int problemId, @RequestParam int Key){
; //方法体
}
URL示例3: http://szkingdom.com/service/callback/8888/1111/1.0.0/3333/1023
该URL中包含有多层级的路径参数,callback是在service后的一级请求地址(目录),callback后的都是数字都是对应服务器要获取的参数,那么获取这些请求路径部分里的参数则应该列顺序表示层次关系,请求的RequestMapping的形式依旧是参照路径样式设置,具体的获取参数方法类如下:
@Controller
@Scope("prototype")
@RequestMapping("/service")
public class FrontGateController {
@RequestMapping(value = { "/callback/{appId}/{chnId}/{chnVer}/{bankId}/{bizId}" },
method = { RequestMethod.POST, RequestMethod.GET } )
//注意:编码拦截器 Spring AOP 按照入参顺序取值,请不要修改入参顺序
public ModelAndView doCallback(
@PathVariable("appId") String appId,
@PathVariable("chnId") String chnId,
@PathVariable("chnVer") String chnVer,
@PathVariable("bizId") String bizId,
@PathVariable("bankId") String bankId,
HttpServletRequest request,
HttpServletResponse response) {
; //方法体
}
//其它方法定义
}