前言
在HTTP请求时,参数传递是及获取,是非常重要的一项功能。
SpringMVC提供了很多种方式,具体采用哪种,可以根据实际需求选择。
这里按照常用级别列出几种。
1. 通过方法形参获取
可以在控制器方法的形参位置,设置当前请求的参数。
当访问映射到该方法时,DispatcherServlet会将请求中的参数赋值给相同名字的形参。
@RequestMapping(value = {"getUser"}, method = {RequestMethod.GET})
public Object getUser(String username, String password) {
return username + password;
}
以上代码,会将请求中的username及password的值赋值给控制器形参,该方法接受到参数后进行后续逻辑处理。
注意事项:
- 请求参数和控制器参数名称必须一致
- 参数很多时,不建议使用此方式,三个以上建议封装为java bean传递
2. 通过POJO类获取
可以将多个请求参数封装为对象,需确保对象的属性和请求参数名一致。
请求时,框架会将请求参数封装到形参对象的属性中。
@RequestMapping(value = {"getUser"}, method = {RequestMethod.GET})
public Object getUser(User user) {
return user;
}
请求后返回的数据:
{"username":"1111","password":"afasfsa","age":null,"name":null,"userId":null}
3. 通过HttpServletRequest 获取
将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。
@RequestMapping(value = {"getUser"}, method = {RequestMethod.GET})
public Object getUser(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:" + username + ",password:" + password);
return "user";
}
4. 使用@RequestParam注解
@RequestParam主要用于将请求参数中的数据映射到控制层方法的形参。
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
@RequestParam的属性解释:
- value
请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。 - required
该参数是否为必传项,默认是true。 为ture时,未传递参数会抛出MissingServletRequestParameterException异常。 为false时,未传递参数参数,引用及包装类型的参数获取到的值为null,基本类型比如int,会抛出IllegalStateException异常。 - defaultValue
参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。 默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}"
以下代码表示,该请求接口接受name和id参数,其中id为必传项,name参数未传递时,将使用默认值。
@RequestMapping(value = "/test001")
public Object test001(@RequestParam(required = false,value = "name",defaultValue = "#{systemProperties['java.vm.version']}") String name,@RequestParam(required = true)int id) {
return name+id;
}
5. 使用@RequestHeader
@RequestHeader 是获取请求头中的数据,传递给形参。将请求头信息和控制器方法的形参创建映射关系。
@RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam。
以下代码表示将请求头中的“User-Agent”属性值赋值给形参agent。
@GetMapping("/getHeader")
public String getRequestHeader(@RequestHeader("User-Agent") String agent) {
System.out.println(agent);
return "success";
}
6. 使用@CookieValue
@CookieValue是将cookie数据和控制器方法的形参创建映射关系。
@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam。
以下代码表示将Cookie中JSESSIONID参数的值,传递给形参jId
@GetMapping("/getCookie")
public String getCookieValue(@CookieValue(value = "JSESSIONID",required = false) String jId) {
return jId;
}
7. 使用@PathVariable
@PathVariable可以使用获取URL占位符中的参数和控制器方法的形参创建映射关系。
@PathVariable注解一共有三个属性:name,value、required,用法同@RequestParam。
以下代码表示将URL中的name及id位置的参数值传递给形参name和id。
@RequestMapping(value = "/test003/{name}/{id}")
public Object test003(@PathVariable String name,@PathVariable Integer id) {
return "test003";
}
|