上篇博客我们了解了请求映射,那么在执行具体方法时,我们需要对请求进行处理,首先需要获取请求中传递过来的请求参数,那么这篇博客我们就来了解 Controller 类如何获取请求参数。
文章目录
1、获取请求参数
前端控制器在处理请求时,反射机制对目标处理方法的签名进行分析,将请求信息绑定到处理方法的形参中,所以我们可以给 Controller 中的方法设置参数用户获取到某些数据。
2、使用 ServletAPI 获取请求参数
可以通过获取web的相关对象,通过这种方式获取到请求参数等信息。
//WebRequest对象 - request对象和session对象的合体,同时提供了request和session相关的方法
@RequestMapping("/param")
public void test01(HttpServletRequest request, HttpServletResponse response, ){
//--request
Cookie[] cs = request.getCookies();
request.getParameter("username");
request.getHeader("Host");
//--response
response.setContentType("text/html;charset=utf-8");
}
3、通过控制方法的形参获取参数
可以在控制器方法的形参上使用@RequestParam
注解完成参数的获取,当请求参数的名称与形参名相同时可以省略注解。@RequestParam
注解有三个属性:
value
属性:指定形参赋值的请求参数的参数名required
属性:设置是否必须传递此参数,默认为true。当设置为 true ,且defaultValue
属性没有设置时则报错 400。defaultValue
属性:设置默认值。
-
基本类型参数:当请求参数的名称与 Controller 中的业务方法的参数名称一致时,参数值会自动映射匹配;当不一致时,我们可以通过
value
属性设置。//请求地址:http://localhost:8080/...../test01?username=zhangsan&age=12` @RequestMapping("/test01") public String test01(@RequestParam(value = "username") String name, int age){ //具体操作 System.out.println(name+age); return "user"; }
-
POJO类型参数:当请求参数的名称与某个 POJO 实体中的属性名称相同,且 Controller 中的业务方法的参数为一个POJO类型时,SpringMVC 会自动创建该 POJO 实体然后参数值会自动映射匹配。
public class User { private String username; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } //请求地址:http://localhost:8080/...../test02?username=zhangsan&age=12` @RequestMapping("/test02") public String test02(User user){ //具体操作 System.out.println(user); return "user"; }
-
数组类型参数:当数据类型为数组类型参数,请求参数的名称与 Controller 中的业务方法的参数名称一致时,SpringMVC 会将数据存放在数组中。
//请求地址:http://localhost:8080/springmvc1/test03?str=111&str=222 @RequestMapping("/test03") public String test03(String [] str){ //具体操作 System.out.println(str); return "user"; }
-
集合类型参数:当数据类型为集合类型参数时,不能直接 Controller 中的业务方法上填写参数,必须要将集合参数包装到一个POJO中才可以,当使用ajax提交时可以直接可以不需要(集合的泛型一定是类,而不是 String 等类型,因为如果是 String 等类型可以直接使用数组)。
<!--方式一:使用表单直接提交--> <form action="${pageContext.request.contextPath}/test04" method="post"> <input type="text" name="userList[0].username"><br> <input type="text" name="userList[0].age"><br> <input type="text" name="userList[1].username"><br> <input type="text" name="userList[1].age"><br> <input type="submit" value="提交"><br> </form>
public class VO { private List<User> userList; public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } } @RequestMapping("/test04") public String ss(VO vo){ //具体操作 System.out.println(vo.getUserList()); return "user.jsp"; }
//方式二:通过 Ajax 提交 //可以指定contentType为json形式 <script> //模拟数据 var userList = new Array(); userList.push({username: "zhangsan",age: "20"}); userList.push({username: "lisi",age: "20"}); $.ajax({ type: "POST", url: "/itheima_springmvc1/test05", data: JSON.stringify(userList), contentType : 'application/json;charset=utf-8' }); </script>
//在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。 @RequestMapping("/test05") public String ss(@RequestBody List<User> userList){ //具体操作 System.out.println(vo.getUserList()); return "user.jsp"; }
4、使用 @RequestHeader 和 @CookieValue 获取属性
@RequestHeader
注解是将请求头信息和控制器方法的形参创建映射方,@RequestHeader
注解也有三个属性,其属性和属性含义同 @RequestParam
注解相同。
@CookieValue
注解是将 cookie 属性和控制器方法的形参创建映射方,@CookieValue
注解也有三个属性,其属性和属性含义同 @RequestParam
注解相同。
@RequestParam
、@RequestHeader
和@CookieValue
这三个注解其实相差不大,唯一的区别是作用的对象不同,@RequestParam
主要获取请求参数,@RequestHeader
主要用于获取请求头信息,@CookieValue
主要用于获取 cookie 属性的值
5、使用 @RequestBody 和 RequestEntity
@RequestBody
可以获取请求体,需要在控制器方法设置一个形参,使用@RequestBody
进行标识,当前请求的请求体就会为当前注解所标识的形参赋值。
@RequestMapping("/test_RequestBody")
public String test_RequestBody(@RequestBody String requestBody){
System.out.println("requestBody:"+requestBody);
return "success";
}
RequestEntity 类是封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息
@RequestMapping("/test_RequestEntity")
public String test_RequestEntity(RequestEntity<String> requestEntity){
System.out.println("requestHeader:"+requestEntity.getHeaders());
System.out.println("requestBody:"+requestEntity.getBody());
return "success";
}