1.什么是参数解析器
@RequstBody、@RequstParam 这些注解是不是很熟悉?
我们在开发Controller接口时经常会用到此类参数注解,那这些注解的作用是什么?我们真的了解吗?
简单来说,这些注解就是帮我们将前端传递的参数直接解析成直接可以在代码逻辑中使用的javaBean,例如@RequstBody接收json参数,转换成java对象,如下所示:
前台传参 | 参数格式 |
---|---|
application/json |
正常代码书写如下:
@RequestMapping(value = "/getUserInfo")
public String getUserInfo(@RequestBody UserInfo userInfo){
//***
return userInfo.getName();
}
但如果是服务接收参数的方式改变了,如下代码,参数就不能成功接收了,这个是为什么呢?
@RequestMapping(value = "/getUserInfo")
public String getUserInfo(@RequestBody String userName, @RequestBody Integer userId){
//***
return userName;
}
如果上面的代码稍微改动一下注解的使用并且前台更改一下传参格式,就可以正常解析了。
前台传参 | 参数格式 |
---|---|
http://***?userName=Alex&userId=1 | 无 |
@RequestMapping(value = "/getUserInfo")
public String getUserInfo(@RequestParam String userName, @RequestParam Integer userId){
//***
return userName;
}
这些这里就不得不引出这些注解背后都对应的内容—Spring提供的参数解析器,这些参数解析器帮助我们解析前台传递过来的参数,绑定到我们定义的Controller入参上,不通类型格式的传递参数,需要不同的参数解析器,有时候一些特殊的参数格式,甚至需要我们自定义一个参数解析器。
不论是在SpringBoot还是在Spring MVC中,一个HTTP请求会被DispatcherServlet类接收(本质是一个Servlet,继承自HttpServlet)。Spring负责从HttpServlet中获取并解析请求,将请求uri匹配到Controller类方法,并解析参数并执行方法,最后处理返回值并渲染视图。
参数解析器的作用就是将http请求提交的参数转化为我们controller处理单元的入参。原始的Servlet获取参数的方式如下,需要手动从HttpServletRequest中获取所需信息。
@WebServlet(urlPatterns="/getResource")
public class resourceServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
/**获取参数开始*/
String resourceId = req.getParameter("resourceId");
String resourceType = req.getHeader("resourceType");
/**获取参数结束*/
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("resourceId " + resourceId + " resourceType " + resourceType);
}
}
Spring为了帮助开发者解放生产力,提供了一些特定格式(header中content-type对应的类型)入参的参数解析器,我们在接口参数上只要加上特定的注解(当然不加注解也有默认解析器),就可以直接获取到想要的参数,不需要我们自己去HttpServletRequest中手动获取原始入参,如下所示:
@RestController
public class resourceController {
@RequestMapping("/resource")
public String getResource(@RequestParam("resourceId") String resourceId,
@RequestParam("resourceType") String resourceType,
@RequestHeader("token") String token) {
return "resourceId" + resourceId + " token " + token;
}
}
常用的注解类参数解析器使用方式以及与注解的对应关系对应关系如下:
注解命名 | 放置位置 | 用途 |
---|---|---|
@PathVariable | 放置在参数前 | 允许request的参数在url路径中 |
@RequestParam | 放置在参数前 | 允许request的参数直接连接在url地址后面,也是Spring默认的参数解析器 |
@RequestHeader | 放置在参数前 | 从请求header中获取参数 |
@RequestBody | 放置在参数前 | 允许request的参数在参数体中,而不是直接连接在地址后面 |
注解命名 | 对应的解析器 |
---|