本篇文章我们来学习一下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信息:
推荐阅读
- 记一次springmvc设置aop切面失败到解决
- 重学SpringMVC:框架原理解读 + 简单入门程序+组件分析.
- 超级冷的段子简短又爆笑
- 乐基儿|41岁乐基儿近照难掩丰腴,却被赞胖美人,穿对衣服比瘦身还重要?
- 网友热议|北京一男子得知自己密接 独守车内:网友齐赞好邻居
- 赞美普洱茶句子,喝茶发朋友圈的精美句子
- 应届生|超一半受访应届生直言求职最大难题是招聘信息不透明,你赞同吗?
- 发型|爱美女士都在剪的发型,优雅时尚还显瘦,超级有魅力
- 春季养肝试试蜂蜜泡蒜 推荐4款超级养肝粥
- 日本|大阪关西世博会开启吉祥物征名 网友点赞“邪神”