Spring boot 使用ajax前后端数据异步传输详解

因为我们是将数据以JSON 的形式传输的,所以,后端需要将前端传过来的JSON字符串转换为JSON对象,需要添加alibab的fastjson,构建这个测试的所有依赖如下

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.3</version>
        </dependency>

    </dependencies>

由于只是一个测试,所以只要一个用一个按钮来测试是否可以将数据传到后台即可,js中必须正确引入jQuery,否则无法传输

<!DOCTYPE html>
<html lang="en">
<head>

    <meta charset="UTF-8">
    <title>hello</title>
    <script src="../js/jquery-3.4.1.min.js"></script><!--必须加../,这表示在上层目录下,spring boot默认在static中访问静态文件,./表示在当前目录下,/表示根目录-->
    <script>
        function test(){

            var user = {
                "name":"wccSend",
                "age":18
            };
            $.ajax({
                type: "POST",
                url: "/test/json",
                cache: false,  //禁用缓存
                data: JSON.stringify(user),//将json对象转换成字符串形式
                dataType: 'json',
                contentType : 'application/json;charset=utf-8',
                success: function (req) {
                    alert(req.name);
                }
            });

/*            $.ajax({
                type: "POST",
                url: "/test/json",
                cache: false,  //禁用缓存
                data:{
                    "name":"wccSend",
                    "age":18
                },/!*这种传输方式会被封装成name=wccSend&age=18形式,因为它是被请求带过去的,所以会转换成这种形式,请求以&分隔*!/
                dataType: 'json',
                contentType : 'application/json;charset=utf-8',
                success: function (req) {
                    alert("fdsafds");
                    alert(req.name);
                }
            });*/
            alert("已运行");
        }
    </script>
</head>
<body>
<input type="button" onclick="test()" value="submit">
</body>
</html>

注释的这一部分是在做做测试,用于观察发送的json字符串和json对象的区别,两者区别为:

发送的json对象到后台用String接收,输出为:

为了分清,我把代码载再贴一遍

$.ajax({
                type: "POST",
                url: "/test/json",
                cache: false,  //禁用缓存
                data:{
                    "name":"wccSend",
                    "age":18
                },/!*这种传输方式会被封装成name=wccSend&age=18形式,因为它是被请求带过去的,所以会转换成这种形式,请求以&分隔*!/
                dataType: 'json',
                contentType : 'application/json;charset=utf-8',
                success: function (req) {
                    alert(req.name);
                }
            });

name=wccSend&age=18
经试验,用其他类型无法接收JSON,JSONObject,HashMap<>,都无法接收,会报
java.lang.NoSuchMethodError: javax.servlet.ServletRequest.getServletContext()Ljavax/servlet/ServletC错误,这是因为内置tomcat不兼容引起的,我把内置tomcat调为和我本机tomcat版本相同就没有了这个错误,但是会有新错误:JSON parse error: Unrecognized token ‘name’: was expecting ‘null’, ‘true’, ‘false’ or NaN; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token ‘name’: was expecting ‘null’, ‘true’, ‘false’ or NaN,由于有其他字符,所以无法转化为JSON数据结构。

而这个错误下面这个方法可以很好地避免,下面这个方法有多中接收方式

发送的json字符串到后台用String接收,输出为:
            var user = {
                "name":"wccSend",
                "age":18
            };
            $.ajax({
                type: "POST",
                url: "/test/json",
                cache: false,  //禁用缓存
                data: JSON.stringify(user),//将json对象转换成字符串形式
                dataType: 'json',
                contentType : 'application/json;charset=utf-8',
                success: function (req) {
                    alert(req.name);
                }
            });

{“name”:“wccSend”,“age”:18}
此种发送为json字符串形式,可以减少很多错误,而后端也有多种接收方式

1.可以用String 接收,然后将String字符串转化为json对象,获得其中的属性值,如:

    @RequestMapping(value = "/json",method = RequestMethod.POST)
    @ResponseBody
    public String success(@RequestBody String user){
        JSONObject jsonObject = JSON.parseObject(user);//将字符串形式的json数据转换成json对象,然后获取属性
        String name = jsonObject.getString("name");
        int age = jsonObject.getInteger("age");
        System.out.println(name);
        System.out.println(age);
        return "suibianchuandeshuju";
    }

2.可以用HashMap接收,直接获取其中的属性即可,比较简便

    @RequestMapping(value = "/json",method = RequestMethod.POST)
    @ResponseBody
    public HashMap<String,String> success(@RequestBody HashMap<String,String> user){
    
        System.out.println(user.get("name"));
        System.out.println(user.get("age"));

        HashMap<String,String > map = new HashMap<>();//为返回内容
        map.put("name","wccBack");
        map.put("age","20");

        return map;//返回的HashMap会被@ResponseBody直接转换为json对象,传输比较简单
    }

重要:@ResponseBody不能省略,它是将返回内容转化为json数据,如果省略,将会去寻找同名.html文件,然后返回的是视图,也就是将一个html文件发送到前端去解析

这是目录结构
这是目录结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃小巴掌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值