SpringMVC中前台ajax传递数据,后台controller接收为null问题解决

前言:

开始做SpringMVC以及整合ajax发送请求的时候,我们经常会踩一些坑,说实话到现在我都没有吧ajax中的各个参数理解透彻。。。今天写一个关于contentType参数吧,工作中经常会看见这个参数,也是本人踩了很多次坑

问题描述及解决:

首先,在jq的ajax中,contentType指定的是浏览器将发送什么样的编码格式,例如:
text/html:HTML格式
text/plain:纯文本格式(json/xml/html等)
text/xml:xml格式
image/jpeg:jpg图片格式
application/json:json数据格式
…(还有的不一一列举了)
在开发中我们经常遇到的问题就是在ajax中加入contentType和不加contentType有什么区别,比较常见的就是application/json。

1.在不指定contentType时,默认为application/x-www-form-urlencoded类型,此时ajax中的data对应的应该是json对象,application/x-www-form-urlencoded类型跟表单默认提交的类型一致,而且他能够配合ajax中的另一个参数processData(默认为true)将data对象自动的转化为查询字符串的形式(key1=value1&key2=value2)

下面开始演示:

前端页面:

<div class="container">
    <form class="form-signin">
        <h2 class="form-signin-heading">Please sign in</h2>
        <label for="inputEmail" class="sr-only">Username</label>
        <input type="text" id="username" name="username" class="form-control" placeholder="Username" required autofocus>
        <br>
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="text" id="password" name="password" class="form-control" placeholder="Password" required>
        <br>
    </form>
    <button class="btn btn-lg btn-primary btn-block" onclick="submitForm();">提交</button>
</div>

js

function submitForm() {
        var username = $("#username").val();
        var password = $("#password").val();
        $.ajax({
            url: "/test/test",
            type: "post",
            data:{
                "username":username,
                "password":password
            },
            dataType:"json",
            success: function (data) {
                alert(data.username);
            }
        })
    }

后台controller

	@ResponseBody
    @RequestMapping(value = "/test")
    public String sayHello(User user, String username,String password){
        System.out.println(username+" and "+password);
        System.out.println("username:"+user.getUsername()+" | password:"+user.getPassword());
        String result = JSONObject.toJSONString(user);
        return result;
    }

在页面输入username和password后,ajax回调成功!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

控制台打印数据无误!
在这里插入图片描述

2.当在ajax中加入contentType:"application/json"的时候,此时如果不做修改的话,后台接收必然为null,为什么呢?
这是因为在指定了contentType:"application/json"后,data就必须为json字符串了,而之前我们的data还是一个json对象,所以需要转为json字符串,修改ajax如下:

function submitForm() {
        var username = $("#username").val();
        var password = $("#password").val();
        var param = {username:username,password:password};
        console.log(username);
        $.ajax({
            url: "/test/test",
            type: "post",
            data: JSON.stringify(param),
            contentType:"application/json",
            dataType:"json",
            success: function (data) {
                alert(data.username);
            }
        })
    }

此时因为前台ajax传递给后台controller的数据是json字符串,所以后台也应该做响应的修改,这个时候就可以用到@RequestBody注解了,这个注解会帮你把前台传递的json字符串中的数据提取出来并绑定到对象中:

	@ResponseBody
    @RequestMapping(value = "/test")
    public String sayHello(@RequestBody User user){
        System.out.println("username:"+user.getUsername()+" | password:"+user.getPassword());
        String result = JSONObject.toJSONString(user);
        return result;
    }

请求成功,ajax回调成功!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
控制台打印成功!
在这里插入图片描述

问题成功解决,希望能帮到大家!!!


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值