关于SSM使用Ajax传输JSON的问题

2 篇文章 0 订阅
1 篇文章 0 订阅

这两天在尝试使用Ajax来传输JSON格式的数据,但一直会出现一些问题,传到后台的数据要么接收不到,要么接收到了却无法取出。查阅了很多网上的文章之后我找到了一些方法。

首先是后台无法接收到前台发过去的JSON,一开始我在Controller里使用一个String类型的参数来接收,但是并不能接收到数据,这时候的Ajax是这样的,Controller只有一个参数,但输出控制台看到并没有数据。

$.ajax({
    type: "POST", 
    url: "/student/editable",
    data: curRow,    //需要传输的JSON数据
    dataType: 'JSON', 
    success: function (data, textStatus,jqXHR) {
        alert("save successfully!");
    },
    error: function () {
        alert("error!");
    }
});

之后我查到了后台那里有一个@RequestBody的注解,可以用来接收前台传输过来的JSON字符串,这时Ajax里的data那一行就要改为data: JSON.stringify(curRow)了,这是为了将JSON转化为JSON字符串传送给后台。如果只是这样的话也会报错

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

因为@RequestBody只能接受类型为"application/json"的数据,而默认的contentType是application/x-www-form-urlencoded,因此还要在Ajax中加多一条语句contentType: "application/json"


那么这时候的Controller就可以接收到了JSON字符串数据了,接下来需要的就是把JSON的数据取出来了。这里我使用了Druid的JSON包来进行我的JSON,一开始我使用它来格式化我的JSON字符串,但是遇到了一个问题,我并不清楚要使用什么东西来保存我格式化之后的数据,从而也就导致了我无法从它里面取出任何数据。因此我就进去JSONObject的源代码里寻找,最后发现他是用一个Map<String, Object>来保存JSON数据的,这样第二步也解决了,代码如下:

@PostMapping("/editable")
@ResponseBody
public AjaxResult xEditSave(@RequestBody String json) {
        Student student = new Student();
        
        Map<String, Object> map1 = (Map<String, Object>) JSONUtils.parse(json);
       //将map1里面的数据赋值给bean
        student.setId((Integer) map1.get("id"));
        student.setStudentName((String) map1.get("undefined"));

        return toAjax(studentService.updateStudent(json));
    }

 


后面我在想,@RequestBody能不能直接使用Bean属性来接收呢?于是我就改了一下Controller的参数列表,将String改成了我自己的Student(这里补充一下,我前台的JSON数据不止有Student的属性,还有一些其他的参数),运行了一下,还真的可以,只是其他的不属于这个Bean的数据就直接被丢弃了。相对比一下,还是这样写方便很多,不用自己写一堆转来转去的JSON解析。


关于一些其他的想法:

之前一直用的是@ResponseBody,于是想着前台必要用contentType: "application/json"才能够使用@RequestBody接收,那么如果把Ajax里规定返回时的数据格式的dataType:"JSON"删了会怎样,结果是并没有什么影响,我自己想是因为方法记上了@ResponseBody注解就说明了返回的数据是JSON,这样两边其实就相当于重复了,因此可以把Ajax里的dataType那一行删了,避免重复劳动。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值