SpringMVC学习笔记(七)—— @RequestBody、@ResponseBody注解详情

1、@RequestBody

作用: 

      i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

      ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提交时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  •     multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  •     其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 必须;
  •     multipart/form-data, 不能处理;
  •     其他格式, 必须;

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

例子

<script type="text/javascript">   

    $(document).ready(function(){   

        var saveDataAry=[];   

        var data1={"userName":"test","address":"gz"};   

        var data2={"userName":"ququ","address":"gr"};   

        saveDataAry.push(data1);   

        saveDataAry.push(data2);          

        $.ajax({  

            type:"POST",  

            url:"user/saveUser",  

            dataType:"json",       

            contentType:"application/json",                

            data:JSON.stringify(saveData),  

            success:function(data){                  

            }  

         });  

    });   

</script>  

    @RequestMapping(value = "saveUser", method = {RequestMethod.POST }})  

    @ResponseBody   

    public void saveUser(@RequestBody List<User> users) {  

         userService.batchSave(users);  

    }  

这样是不可以的。因为spring MVC不会自动转换为List<User>对象。传到后台后,List中是LinkedHashMap类型。

但是使用数组就可以接受了User[] ,如下:

 

   @RequestMapping(value = "saveUser", method = {RequestMethod.POST }})  

    @ResponseBody   

    public void saveUser(@RequestBody User[] users) {  

         userService.batchSave(users);  

    }  

 

2、@ResponseBody

作用:  

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

使用时机:

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

 

例子:

$("#sub").click(function(){

        var m = {

                "account": $("#_account").val(),

                "passwords": $("#_pass").val(),

                "realname": $("#real_name").val(),

                "phonenumber": $("#phone_number").val(),

                "sex": $("input:checked").val(),

                "mailname": $("#mail_name").val()

            };

        $.ajax({

            type:"POST",

            async : false,

            url:"/demo/user/receive",

            dataType:"json",

            contentType:"application/json; charset=utf-8",

            data:JSON.stringify(m),

            success:function(data){

                alert("return map success!");

                newpage();

            },

            error:function(data){

                alert("保存失败 ")

            }

        })

/-------------------------------------------------------/

 

@RequestMapping(value="receive", method=RequestMethod.POST, consumes="application/json")

    public @ResponseBody Map<String, String> receiveData(@RequestBody RegInfo info){

        Map<String, String> reg_check = regInfoService.checkRegInfo(info);

        for(Map.Entry<String, String> entry:reg_check.entrySet()){   

             System.out.println(entry.getKey()+"--->"+entry.getValue());   

        }

        System.out.println(info);

        System.out.println(info.getRealname());

        return reg_check;

    }

 

1.如上代码中data需要为String形式的数据,由于此处m是json对象,因此需要使用JSON.stringify()转换为字符串形式的数据即“m”;

[email protected]用于接收前台传来的数据,接收到的数据为字符串的形式,但是此注解可以将字符串中的变量值注入到对象info中,要求info实体中的属性名字和m中属性一致;

[email protected]用于将后台的数据直接放在responsebody中返回,此处@responsebody注解会将map的实例转换为json对象,故在前端data接收到的是json对象;

4.consumes表示只处理格式为content-type:application/json的请求;相对的produces="application/json"表示仅处理请求中包含accept:application/json(即返回类型为application/json格式)的request;

注:ajax中

data:String

默认情况下自动转换为String类型;可用processdata属性禁止自动转换;

processData:Boolean

 

最后来张图片说明一下简单说明下