您的位置:首页 > 编程语言 > Java开发

springMVC的一个controller方法怎么处理多个请求地址

2017-05-14 11:32 671 查看
写这篇博客的想法是前一阵子在csdn的问答中遇到有人问这个问题(传送门:http://ask.csdn.net/questions/382662),当时我也很懵逼,因为确实没有具体研究过,所以趁这次机会记录一下,如果有什么不对滴,请大家多多斧正,始めましょう。。。

先放代码

/**
* Created by xyc on 2017/5/14 0014.
*/
@Controller
@RequestMapping("/path")
public class PathController {
/**
* 测试发现/methodA/{param1}/{param2}可以通过,/methodA/{param1}则报错
* @param param1
* @param param2
* @return
*/
@ResponseBody
@GetMapping(value={"/methodA/{param1}","/methodA/{param1}/{param2}"})
public String methodA(@PathVariable("param1") Integer param1,@PathVariable("param2") Integer param2){
return "methodA success:param1="+param1+",param2="+param2;
}

/**
* 测试发现/methodB/{param1}/{param2}和/methodB/{param1}都可以通过
* @param param1
* @param param2
* @return
*/
@ResponseBody
@GetMapping(value={"/methodB/{param1}","/methodB/{param1}/{param2}"})
public String methodB(@PathVariable(value = "param1",required = true) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){
return "methodB success:param1="+param1+",param2="+param2;
}

/**
* 测试发现/methodC/{param1}/{param2}可以通过,/methodC/{param1}则报错
* @param param1
* @param param2
* @return
*/
@ResponseBody
@GetMapping(value="/methodC/{param1}/{param2}")
public String methodC(@PathVariable(value = "param1",required = false) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){
return "methodC success:param1="+param1+",param2="+param2;
}

/**
* 测试发现/methodD/{param1}/{param2}可以通过,/methodD/{param1}则报错
* @param param1
* @param param2
* @return
*/
@ResponseBody
@GetMapping(value="/methodD/{param1}/{param2}")
public String methodD(@PathVariable(value = "param1",required = true) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){
return "methodD success:param1="+param1+",param2="+param2;
}

/**
* 测试发现/methodE/{param1}/{param2}/suffix可以通过,/methodC/{param1}/suffix和/methodC/suffix则报错
* @param param1
* @param param2
* @return
*/
@ResponseBody
@GetMapping(value="/methodE/{param1}/{param2}/suffix")
public String methodE(@PathVariable(value = "param1",required = false) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){
return "methodE success:param1="+param1+",param2="+param2;
}

/**
* 测试发现/methodF/{param1}/{param2}/suffix可以通过,/methodD/{param1}/suffix和/methodD/suffix则报错
* @param param1
* @param param2
* @return
*/
@ResponseBody
@GetMapping(value="/methodF/{param1}/{param2}/suffix")
public String methodF(@PathVariable(value = "param1",required = true) Integer param1,@PathVariable(value = "param2",required = false) Integer param2){
return "methodF success:param1="+param1+",param2="+param2;
}
}


好,这篇博客就到这里,大家下次见……

哈哈,开个小玩谑,接下来解释一下(背景音药走起,动词大慈…),first,让我们看一下methodA和methodB

对于methodA,我的注释已经写了,/methodA/{param1}/{param2}可以通过,/methodA/{param1}则报错,因为@PathVariable的required默认值是true(这里注意不要把required默认值误以为是false),所以理所当然你的param1和param2都要提供,不然就报错;

对于methodB,我通过将param1设置为必须,而param2设置为非必须,那么我就可以通过判断有木有param2来映射路径,所以/methodB/{param1}/{param2}和/methodB/{param1}都可以通过;当然你如果把param1和param2都设置为非必须的捏,其实这种情况和methodB产生的结果一毛一样;

刚开始测试完methodA和methodB后我就想/method/{param1}/{param2}其实是隐含包括/method/{param1}的,就是param2不输入呗,但是测试了methodC和methodD后我发现我被打脸了(难道我滴想法不对么)

如methodC所示,我只提供了/methodC/{param1}/{param2}这一种匹配路径,同时将param1和param2都设置为非必须,然后测试发现/methodC/{param1}/{param2}可以通过,/methodC/{param1}则报错,本来按照我的想法/methodC/{param1}报错是可以理解的,因为在param1和param2都可以为空的情况下你只传一个参数,他不知道这到底是param1还是param2,但是按照顺序来讲的话,如果你的参数紧接着methodC,例如methodC/1的话,那么他就代表着1会匹配param1,因为param1也是紧接着methodC,当然没有methodC//1这种写法,不然的话1可能会匹配param2,呵呵呵…

mehtodD也没什么好讲的,因为它的结果和methodC一样,尽管它的param1是必须,而param2是非必须,然鹅这并没有什么卵用,看来还是param1太寂寞了,没有param2就不行;

接下来我又开始开脑洞,是不是给匹配路径加一个后缀就好了,因为在我的想法中后缀起到一个定位功能,有了起点和终点,应该可以了吧,但是又一次被现实无情的打脸,methodE和methodF就不细讲了。

本篇博客的结论就是如果你想让一个controller方法处理多个请求,那么就按methodB的套路来,不要想太多,如果博客有什么错误的地方,欢迎请大家指正……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc controller
相关文章推荐