SpringMVC中常用的几个注解@RequestBody

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<String> 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<String> 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等)使用;

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值