超级赞!SpringMVC中的请求参数的完美处理技巧

本篇文章我们来学习一下SpringMVC中是如何处理请求中的参数的 。
回想一下原生Servlet是如何处理请求参数的?我们需要使用HttpServletRequest调用getParameter方法进行获取,就像这样:
@WebServlet("/hello")public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取参数值String username = req.getParameter("username");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}}下面来看看SpringMVC是如何处理这一需求的 。
@RequestParam在SpringMVC中,我们可以直接在方法上声明入参获取请求参数,比如:
@Controllerpublic class HelloController {@RequestMApping("/hello")public String hello(String username) {System.out.println(username);return "success";}}那在传递参数的时候参数名就必须指定为username,这样处理方法就能够直接获取到请求参数,当然了,这样获取有一个弊端,就是参数名被固定了,只能是username,我们可以在参数前添加@RequestParam注解来解决:
@RequestMapping("/hello")public String hello(@RequestParam("user") String username) {System.out.println(username);return "success";}此时参数名就可以随意定义,转而由@RequestParam注解来指定需要接收的参数名 。
当请求中未携带user参数时,程序就会出错:
Resolved exception caused by handler execution: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'user' is not present这是因为@RequestParam默认要求参数必须携带,否则就会报错,可以通过修改注解中的required属性值来解决这一个问题:
@RequestMapping("/hello")public String hello(@RequestParam(value = https://www.isolves.com/it/cxkf/kj/2021-08-16/"user",required = false) String username) {System.out.println(username);return "success";}此时无论是否携带user参数,程序都不会出错,当未携带user参数时,username值为null 。
还可以通过配置defaultValue属性值来指定当参数未携带时的默认值:
@RequestMapping("/hello")public String hello(@RequestParam(value = https://www.isolves.com/it/cxkf/kj/2021-08-16/"user",required = false,defaultValue = "zhang") String username) {System.out.println(username);return "success";}此时当请求未携带user参数时,username值为 zhang  。
@RequestHeaderSpringMVC中也能非常方便地获取请求头中的信息,如:
@RequestMapping("/hello")public String hello(@RequestHeader("User-Agent") String userAgent) {System.out.println(userAgent);return "success";}通过@RequestHeader注解即可轻松获取请求头信息,其value值为请求头的key,和@RequestParam注解类似,当试图去获取一个不存在的请求头时,程序便会报错:
@RequestMapping("/hello")public String hello(@RequestHeader("test") String userAgent) {System.out.println(userAgent);return "success";}报错信息为:
Missing request header 'test' for method parameter of type String所以也可以在注解中添加required属性来解决:
@RequestMapping("/hello")public String hello(@RequestHeader(value = https://www.isolves.com/it/cxkf/kj/2021-08-16/"test",required = false) String userAgent) {System.out.println(userAgent);return "success";}defaultValue属性也是一样的用法 。
@RequestBody在前后端分离的项目开发中,后端接收到的往往并不是一个直接的字符参数,而是一串JSON数据,那么该如何处理JSON类型的请求参数呢?
其实很简单,先接收到JSON参数,再通过一些第三方库将JSON解析成正常的属性值即可,而在SpringMVC中,可以直接使用@RequestBody注解来解决:
@RequestMapping("/hello")public String hello(@RequestBody String json) {System.out.println(json);return "success";}通过这种方式能够获取到前端提交的JSON参数:
{"name:"张三","age":"20"}你还可以直接将请求参数中的JSON串转换为Bean对象:
@RequestMapping("/hello")public String hello(@RequestBody Person person) {System.out.println(person);return "success";}此时SpringMVC将按照参数名和Person对象中的属性名进行一一对应,并将参数值封装到Person中生成一个对象,这样便极大地方便了开发流程 。
@CookieValue通过@CookieValue注解可以很方便地获取到请求中的cookie信息:


推荐阅读