SpringMvc Controller请求传参方式总结
1. 请求的值绑定在request中
- 方法参数中使用request,通过request.getParameter("参数名")的方式获取参数
参数拼接在url后面,以Get方式传参
GET url= http://localhost:8080/geturlp?name=zhangsan
或者
以POST的表单提交的方式 x-www-form-urlencoded
POST url=http://localhost:8080/geturlp
curl -d "name=zhangsan" http://localhost:8080/geturlp
1 @RequestMapping(value = "/geturlp") 2 @ResponseBody 3 public String getParameterOfBasic(HttpServletRequest request){ 4 String name = request.getParameter("name"); 5 return name; 6 }
2.简单类型参数和RequestParam注解
- 如果请求参数和Controller方法的形参同名,可以直接接收(这种方式包含2个方式,以get请求的参数形式和POST的表单类型[x-www-form-urlencoded])
GET url=http://localhost:8080/getdefaultParam?username=zhangsan&password=1223
或者
POST url=http://localhost:8080/getdefaultParam
curl -d "username=zhangsan&password=1223"
1 @RequestMapping(value = "/getdefaultParam") 2 @ResponseBody 3 public String getdefaultParam(String username,String password){ 4 return username +":" + password; 5 }
- 如果请求参数和Controller方法的形参不同名,可以使用@RequestParam注解贴在形参前,设置对应的参数名称
@RequestParam不能传递空值,如果需要传递空值,可以设置默认值defaultValue或者required=fals
GET url=http://localhost:8080/getParam?username=zhangsan&password=123123
或者
POST url=http://localhost:8080/getParam
curl -d "username=zhangsan&password=123123"
1 @RequestMapping(value = "/getParam") 2 @ResponseBody 3 public String getParam(@RequestParam(value = "username",required = false) String name, 4 @RequestParam(value = "password",defaultValue = "12312312") String pwd){ 5 return name +":" + pwd; 6 }
3. 对象传参
此时能够自动把参数封装到形参的对象上
注意:
- 请求参数必须和对象的属性同名
- 此时对象会直接放入request作用域中,名称为类型首字母小写
- @ModelAttribute设置请求参数绑定到对象中并传到视图页面,设置key值
GET url=http://localhost:8080/getObj?name=zhangsan&age=12&score=12
或者
POST url=http://localhost:8090/mbank/test/param/getObj
curl -d "name=zhangsan&age=12&score=12" http://localhost:8090/mbank/test/param/getObj
1 @RequestMapping(value = "/getObj") 2 @ResponseBody 3 public String getObjBindObj(Student student){ 4 return student.toString(); 5 }
1 @RequestMapping(value = "/getObj") 2 @ResponseBody 3 public String getObjBindObj(@ModelAttribute("stu") Student student){ 4 return student.toString(); 5 }
- 如果前端使用json的格式传递数据,则可以使用注解@RequestBody
注意:
- header中content-type:application/json
- body中使用json传递数据
1 @Data 2 @ToString 3 class Student{ 4 private String name; 5 private int age; 6 private String score; 7 } 8 9 @RequestMapping(value = "/getObj") 10 @ResponseBody 11 public String getObjBindObj(@RequestBody Student student){ 12 return student.toString(); 13 }
4. 数组和List集合类型参数
注意: 直接摘抄,没有做实验
当前台页面传来的参数是参数名相同,参数值不同的多个参数时,可以直接封装到方法的数组类型的形参中,也可以直接封装到对象的集合属性中。
比如批量删除时传来的参数。
1 RequestMapping("/test04") 2 public ModelAndView test04(String id[]){ 3 /*对于参数名相同的多个请求参数,可以直接使用数组作为方法的形参接收 4 可以使用对象中的集合属性接收*/ 5 for (String i : id) { 6 System.out.println(i); 7 } 8 return null; 9 }
1 @RequestMapping("/test05") 2 public ModelAndView test05(Student student){ 3 System.out.println(student.getId().size()); 4 for (String i : student.getId()) { 5 System.out.println(i); 6 } 7 return null; 8 }
5. 路径参数,常用于restful风格
Restful是一种软件架构风格,严格上说是一种编码风格,其充分利用 HTTP 协议本身语义从而提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,该风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
在后台,RequestMapping标签后,可以用{参数名}方式传参,同时需要在形参前加注解@PathVarible,假如前台的请求地址为localhost:8080/delete/3
GET url=http://localhost:8080/resultful/zhangsan/query
1 @RequestMapping("/resultful/{name}/query") 2 @ResponseBody 3 public String getRestFul(@PathVariable String name){ 4 return name; 5 }
当然也可以定义不同的名字
@RequestMapping("/resultful/{username}/query") @ResponseBody public String getRestFul(@PathVariable("username") String name){ return name; }
注意:
@PathVariable默认可以省略参数名字的,但是在Feign调用的时候最好带上,不然会出问题。记录下,以前好像碰到过这样的问题。(@PathVariable("name") String name)
说明:
以上的传参方式还和HttpMessageConverter有这密切的关系,后面再分析这部分的内容的时候会专门提到