本文主要介绍SpringMVC中@PathVariable、@RequestParam、@RequestBody、@RequestHeader、@CookieValue的用法
@PathVariable
@PathVariable可以用来接收:Get,Post,Put,Delete等请求URL中的参数,如:
@RequestMapping(value = "/test1/{name}/{id}")
@ResponseBody
public String demoPathVariable(@PathVariable String name, @PathVariable Long id) {
logger.debug("name={}", name);
logger.debug("id={}", id);
return "SUCCESS";
}
以上方式可以响应:URL:http://127.0.0.1:8080/demo/test1/zmx/123 获取结果:name=zmx,id=123
@RequestParam
@RequestParam用来接收通过HttpServletRequest.getParameter()获取的参数,这包括以下情况:
- 以任何请求方式,在URL中传送的参数
- 以application/x-www-form-urlencoded或multipart/form-data请求中HTTP请求体中的参数
@RequestMapping(value = "/test2")
@ResponseBody
public String demoRequestParam(@RequestParam("name") String name) {
logger.debug("name={}", name);
return "name=" + name;
}
以上代码可以响应:
- (GET,POST,PUT,DELETE等)http://127.0.0.1:8080/demo/test2?name=zmx
- (POST请求,Content-Type: multipart/form-data或application/x-www-form-urlencoded)http://127.0.0.1:8080/demo/test2
注意:POST请求Content-Type不是multipart/form-dat或application/x-www-form-urlencoded是接收不到的
@RequestBody
@RequestBody用来接收Content-Type=application/json的请求体中的参数
@RequestMapping(value = "/test3")
@ResponseBody
public String demoRequestBody(@RequestBody Map argParamMap) {
logger.debug(JSON.toJSONString(argParamMap));
return JSON.toJSONString(argParamMap);
}
以上代码可以响应以下http报文:
POST /demo/test3 HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.24.0
Accept: */*
Cache-Control: no-cache
Postman-Token: d14c2160-f7e2-4fc2-9365-86a8140c0927
Host: 127.0.0.1:8080
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 23
{"name":"zmx","age":20}
HTTP/1.1 200 OK
Content-Type: text/plain;charset=UTF-8
Content-Length: 30
Date: Sun, 12 Apr 2020 12:43:34 GMT
结果={"name":"zmx","age":20}
注意上面的Content-Type:application/json。RequestBody是不支持Content-Type为application/x-www-form-urlencoded或multipart/form-data的,但是经过本人简单测试发现application/xml也不支持,后面待补充原因
@RequestHeader
@RequestHeader用来获取Header信息
@CookieValue
@CookieValue 可以获取Request Header中关于cookie的值
直接用Controller的形参接收参数
直接用Controller的形参接收参数即为Controller的方法名上没有添加以上任何一个注解如:public String test6(String name, Integer age, String remark)。这种等价于@RequestParam直接从HttpServletRequest.getParameter()获取的参数。
- 可以直接获取任何方式请求中URL参数(URL没有对应的参数获取空值),如:http://127.0.0.1:8080/demo/test6?name=张三&age=18
- 可以直接获取以application/x-www-form-urlencoded或multipart/form-data请求中HTTP请求体中的参数
@RequestMapping(value = "/test6")
public String test6(String name, Integer age, String remark) {
logger.debug("remark={}", remark);
return name + "_" + age;
}
总结:直接用Controller的形参接收参数等价于直接从HttpServletRequest.getParameter()获取的参数。在java中,反射的调用对于方法参数的赋值是根据参数数组的顺序进行赋值的,而在JDK1.8之前的反射调用是无法获取到形参的名称的,只能得到arg0,arg1,argx 之类的名称,那么想要在没有配置参数信息的情况下,获取到形参与请求参数之前的对应关系,势必需要进行一次解析。如果是低于JDK1.8的版本,在springmvc中是通过ASM框架对于class文件进行解析.在JDK1.8之后 Java支持通过在javac生产class文件过程中添加额外的命令行参数-parameters,便可以通过之前反射获取参数的方式获取到方法形参的参数名.
网友评论