博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC中常用的几个注解@RequestBody
阅读量:3962 次
发布时间:2019-05-24

本文共 5597 字,大约阅读时间需要 18 分钟。

SpringMVC @RequestBody 接收Json对象字符串

@RequestBody

作用:

1.该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上   2.再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

GET、POST方式提时, 根据request header Content-Type的值来判断:  1. application/x-www-form-urlencoded. 不能用 @RequestBody来处理。

可以用 @RequestParam注解来处理,或者调用 HttpServletRequest.getParameter(“name”)这样的方式来去参数数据。

如下所示:

private RequestForUser getRequestForUser(HttpServletRequest request) {        RequestForUser requestForUser= new RequestForUser();        requestForUser.setUserId(request.getParameter("userId"));}

@RequestParam

1. @RequestParam是传递参数的.    @RequestParam用于将请求参数区数据映射到功能处理方法的参数上。        public String queryUserName(@RequestParam String userName)    在url中输入:localhost:8080/***/?userName=zhangsan    请求中包含username参数(如/requestParam1?userName=zhang),则自动传入。    接下来我们看一下@RequestParam注解主要有哪些参数:        value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;        required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;        defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。            表示请求中可以没有名字为username的参数,如果没有默认为null,此处需要注意如下几点:    public String queryUserName(@RequestParam(value="userName" ,required =false ) String userName)     	原子类型:必须有值,否则抛出异常,如果允许空值请使用包装类代替。    	Boolean包装类型类型:默认Boolean.FALSE,其他引用类型默认为null。    	    public String requestParam5(@RequestParam(value="username", required=true, defaultValue="zhang") String username)         如果没有传入参数,则默认是"zhangsan".      但是在传递参数的时候如果是url?userName=zhangsan&userName=wangwu时怎么办呢?      其实在实际roleList参数入参的数据为“zhangsan,wangwu”,即多个数据之间使用“,”分割;我们应该使用如下方式来接收多个请求参数:            public String requestParam8(@RequestParam(value="userName") String []  userNames)                 或者是:            public String requestParam8(@RequestParam(value="list") List
list) 2. multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据.3. 其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理.4. @PathVariable绑定URI模板变量值 @RequestMapping(value="/users/{userId}/grader/{grader}") public String test( @PathVariable(value="userId") int userId, @PathVariable(value="grader") int grader) 如请求的URL为“控制器URL/users/123/grader/456”,则自动将URL中模板变量{userId}和{grader}绑定到通过@PathVariable注解的同名参数上 即入参后userId=123、grader=456 5. @CookieValue绑定Cookie数据值 @CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上。 public String testCookieValue(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId) 如上配置将自动将JSESSIONID值入参到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。 public String testCookieValue2(@CookieValue(value="JSESSIONID", defaultValue="") Cookie sessionId) 传入参数类型也可以是javax.servlet.http.Cookie类型 @CookieValue也拥有和@RequestParam相同的三个参数,含义一样。 6. @RequestHeader绑定请求头数据 @RequestHeader用于将请求的头信息区数据映射到功能处理方法的参数上。 @RequestMapping(value="/header") public String test(@RequestHeader("User-Agent") String userAgent,@RequestHeader(value="Accept") String[] accepts) 如上配置将自动将请求头“User-Agent”值入参到userAgent参数上,并将“Accept”请求头值入参到accepts参数上。 @RequestHeader也拥有和@RequestParam相同的三个参数,含义一样。 7. @ModelAttribute绑定请求参数到命令对象 @ModelAttribute一个具有如下三个作用: public String test1(@ModelAttribute("user") UserModel user) 1.绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用; @ModelAttribute("cityList") public List
cityList() {return Arrays.asList("西安", "郑州");} 2.暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用; public @ModelAttribute("users") UsersModel testUsersModel(@ModelAttribute("users") UserModel users) 3.暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

那么问题7中的3个问题,在Spring Web MVC内部是如何处理上边的情况的呢:

1、首先执行@ModelAttribute注解的方法,准备视图展示时所需要的模型数据;@ModelAttribute注解方法形式参数规则和@RequestMapping规则一样,如可以有@RequestParam等;	2、执行@RequestMapping注解方法,进行模型绑定时首先查找模型数据中是否含有同名对象,如果有直接使用,如果没有通过反射创建一个,因此2处的users将使用1处返回的命令对象。即2处的users等于1处的user。	 此时又有问题了,@RequestMapping注解方法的入参user暴露到模型数据中的名字也是user2,其实我们能猜到:	3、@ModelAttribute注解的返回值会覆盖@RequestMapping注解方法中的@ModelAttribute注解的同名命令对象。	8. @SessionAttributes绑定命令对象到session    有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。Spring Web MVC提供了@SessionAttributes进行请求间透明的存取会话数据。    @SessionAttributes(value = {"user"})含义:    @SessionAttributes(value = {"user"}) 标识将模型数据中的名字为“user” 的对象存储到会话中(默认HttpSession),此处value指定将模型数据中的哪些数据(名字进行匹配)存储到会话中,此外还有一个types属性表示模型数据中的哪些类型的对象存储到会话范围内,如果同时指定value和types属性则那些名字和类型都匹配的对象才能存储到会话范围内。    包含@SessionAttributes的执行流程如下所示:    1、 首先根据@SessionAttributes注解信息查找会话内的对象放入到模型数据中;    2、 执行@ModelAttribute注解的方法:如果模型数据中包含同名的数据,则不执行@ModelAttribute注解方法进行准备表单引用数据,而是使用①步骤中的会话数据;如果模型数据中不包含同名的数据,执行@ModelAttribute注解的方法并将返回值添加到模型数据中;    3、 执行@RequestMapping方法,绑定@ModelAttribute注解的参数:查找模型数据中是否有@ModelAttribute注解的同名对象,如果有直接使用,否则通过反射创建一个;并将请求参数绑定到该命令对象;    此处需要注意:如果使用@SessionAttributes注解控制器类之后,③步骤一定是从模型对象中取得同名的命令对象,如果模型数据中不存在将抛出    HttpSessionRequiredException Expected session attribute ‘user’(Spring3.1) 或  	HttpSessionRequiredException Session attribute ‘user’ required - not found in session(Spring3.0)异常。    4、 如果会话可以销毁了,如多步骤提交表单的最后一步,此时可以调用SessionStatus对象的setComplete()标识当前会话的@SessionAttributes指定的数据可以清理了,此时当@RequestMapping功能处理方法执行完毕会进行清理会话数据。 9. @Value绑定SpEL表示式    @Value用于将一个SpEL表达式结果映射到到功能处理方法的参数上。    public String testValue(@Value("#{systemProperties['java.vm.version']}") String jvmVersion)

@ResponseBody

作用:

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:

返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

不以己悲,断他人之路。不以阳光,断昧明日晴朗。

转载地址:http://mngzi.baihongyu.com/

你可能感兴趣的文章
感 冒
查看>>
职业瓶颈
查看>>
有些问题不一定要一次完成,有时候可以增加中间步骤
查看>>
Eclipse 常用快捷键
查看>>
DB2 系列文章目录
查看>>
DB2 认证路线图
查看>>
在FedaroCore4下安装DB2 Express-C
查看>>
DB2 目录结构
查看>>
DB2 配置
查看>>
DB2 CHNGPGS_THRES 参数
查看>>
DB2安全性概述
查看>>
DB2 用户管理
查看>>
DB2 脚本
查看>>
DB2 锁升级失败将引起死锁
查看>>
遇到问题该如何解决
查看>>
[第21课] 二项分布3
查看>>
[第22课] 二项分布4
查看>>
Pandas 筛选数据
查看>>
Pandas 复合索引
查看>>
[第23课] 期望值E(X)
查看>>