欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMVC接收与响应json数据的几种方式

程序员文章站 2024-02-13 09:39:04
前言 前后端的数据交互,除了通过form表单进行提交外,也可以通过ajax向后端传递和接收json格式数据(这种方式可以实现请求数据和页面分离)。本文将总结一下在spri...

前言

前后端的数据交互,除了通过form表单进行提交外,也可以通过ajax向后端传递和接收json格式数据(这种方式可以实现请求数据和页面分离)。本文将总结一下在spring mvc中接收和响应json数据的几种方式。

话不多说了,来一起看看详细的介绍吧

准备步骤:

1.导入json相关框架的依赖(比如jackson)。

2.spring mvc的controller方法正常写,如果需要响应json,增加@responsebody注解。

3.在接受json对应的输入参数前,加上@requestbody注解。

服务端接收json数据还原为java对象,称为反序列化,反之,将java对象作为响应转换为json数据发回给客户端,称为序列化。

注意:因为要使用ajax,所有一定要引入jquery,切记!

jackson maven依赖:

  <!-- jackson依赖 -->
  <dependency>
   <groupid>com.fasterxml.jackson.core</groupid>
   <artifactid>jackson-core</artifactid>
   <version>2.7.0</version>
  </dependency>
  <dependency>
   <groupid>com.fasterxml.jackson.core</groupid>
   <artifactid>jackson-databind</artifactid>
   <version>2.7.0</version>
  </dependency>
  <dependency>
   <groupid>com.fasterxml.jackson.core</groupid>
   <artifactid>jackson-annotations</artifactid>
   <version>2.7.0</version>
  </dependency>

一、以实体类接收

背景:当ajax传递的参数较多时,采用参数名匹配的方法不太方便。如果后台有对应的实体类,这时可以选择在客户端将数据封装为json格式传递给后台,后台用对应的实体类进行接收。

客户端:

<button onclick="clickme()">点我</button>
<script>
 function clickme() {
  $.ajax({
   type : 'post',
   url : "acceptjsonbyentity",
   contenttype : "application/json;charset=utf-8",
   // 如果想以json格式把数据提交到后台的话,json.stringify()必须有,否则只会当做表单提交
   data : json.stringify({
    "bookid" : 1,
    "author" : "jack"
   }),
   // 期待返回的数据类型
   datatype : "json",
   success : function(data) {
    var bookid = data.bookid;
    var author = data.author;
    alert("success:" + bookid+','+author);
   },
   error : function(data) {
    alert("error" + data);
   }
  });
</script>

@responsebody注解是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回json数据或者是xml。

@requestbody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容。一般情况下来说常用其来处理application/json类型。

controller:

@controller
public class passjsonparam {
 @requestmapping(value="acceptjsonbyentity",method = requestmethod.post)
 @responsebody
 public book acceptjsonbyentity(@requestbody book book, httpservletrequest request){
  system.out.println("当前http请求方式为:"+request.getmethod());
  system.out.println("bookid="+book.getbookid()+", author="+book.getauthor());
  return book;
 }
}

控制台输出:当前http请求方式为:post bookid=1, author=jack

客户端(弹窗):success:1,jack

如果controller中的所有方法都需要返回json格式数据,可以使用@restcontroller注解。
@restcontroller = @controller + @responsebody

controller(上面的controller可以用下面的替换):

@restcontroller
public class passjsonparam {
 @requestmapping(value="acceptjsonbyentity",method = requestmethod.post)
 public book acceptjsonbyentity(@requestbody book book, httpservletrequest request){
  system.out.println("当前http请求方式为:"+request.getmethod());
  system.out.println("bookid="+book.getbookid()+", author="+book.getauthor());
  return book;
 }
}

注意:使用了@restcontroller注解后,controller的方法无法再返回jsp页面或者html,配置的视图解析器也不会起作用。

二、以map方式接收

背景:前台向后台发送ajax请求并且携带很多参数,而后台并没有对应的实体类进行接收又该如何处理呢?最常见的就是表单,这里可以考虑使用map来解决。因为map的数据结构为key-value形式,所以我们可以遍历搜索框表单,将表单的name作为map的key,表单的value作为map的value。

客户端:

<form id="bookform">
 <input type="text" name="bookname" id="bookname">
 <input type="text" name="author" id="author" >
 <button onclick="submitform(event)">提交</button>
</form>

<script>
 function submitform(event) {
  //阻止form默认事件
  event.preventdefault();
  //得到搜索框数据
  var map = new map();
  $("#bookform input").each(function () {
   var value = $(this).val();  //input 值
   var name = $(this).attr('name');
   map.set(name,value);
  })

  //map转为json的方法
  var obj= object.create(null);
  for (var [k,v] of map) {
   obj[k] = v;
  }

  $.ajax({
   type: 'post',
   contenttype:'application/json',
   url: "acceptjsonbymap",
   data: json.stringify(obj),
   datatype: 'json',
   success: function (data) {
    var bookname = data.bookname;
    var author = data.author;
    alert("bookname ="+bookname+"; author="+author);
   },
   error: function (data) {
    alert("失败啦");
   }
  });
 }
</script>

controller:

 @requestmapping(value="acceptjsonbymap")
 @responsebody
 public map<string,object> acceptjsonbymap(@requestbody map<string,object> paramsmap, httpservletrequest request){
  system.out.println("当前http请求方式为:"+request.getmethod());
  system.out.println(paramsmap);
  return paramsmap;
 }

控制台输出:当前http请求方式为:post {bookname=love, author=frank}

客户端(弹窗):bookname =love; author=frank

三、以list方式接收(以json数组形式传递)

客户端:

<button onclick="clickhere()">clickhere</button>
<script>
 function clickhere() {
  var params1 = {
   "bookid":"123",
   "author":"rose"
  };
  var params2 = {
   "bookid":"321",
   "author":"jack"
  };
  var list = [];
  list.push(params1);
  list.push(params2);

  $.ajax({
   type: 'post',
   contenttype:'application/json',
   url: "acceptjsonbylist",
   data: json.stringify(list),
   datatype: 'json',
   success: function (data) {
    for (let i = 0; i < data.length; i++) {
     var bookid = data[i].bookid;
     var author = data[i].author;
     alert("bookid ="+bookid+"; author="+author);
    }
   },
   error: function (data) {
    alert("失败啦");
   }
  });
 }
</script>

注意:传递到后端时,list应为[ { key1 : value1}{ key2 : value2} ]的json格式数据,否则可能会出现json parse error错误。

controller:

 @requestmapping(value="acceptjsonbylist")
 @responsebody
 public list<book> acceptjsonbylist(@requestbody list<book> book, httpservletrequest request){
  system.out.println("当前http请求方式为:"+request.getmethod());
  system.out.println(book);
  return book;
 }

注意:这里需要book实体类进行接收。

控制台输出:当前http请求方式为:post [entity.book@1138a75c, entity.book@22d1cbcf]

客户端(弹窗):bookid =123; author=rose bookid =321; author=jack

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。