天天看点

SpringMVC学习笔记13-JSON 数据处理

十三、 JSON 数据处理

在 SpringMVC 中使用的是 Jackson API 实现对 JSON 格式数据处理。需要添加 Jackson 的 jar 包。

jackson-annotations-2.11.0.jar

jackson-core-2.11.0.jar

jackson-databind-2.11.0.jar

1 搭建环境

1.1创建项目添加依赖

SpringMVC学习笔记13-JSON 数据处理

1.2添加 Jquery.js

2 处理请求中的 JSON 格式数据

在处理请求中的 JSON 格式数据时需要使用@RequestBody 注解。

[email protected]

@RequestBody 注解可以将 JSON 格式的数据转为 Java 对象。但是要求 content-type 不是 默认的 application/x-www-form-urlcoded 编码的内容。一般情况下来说常用其来处理 application/json 类型。

2.2创建 Users

package com.bjsxt.web.controller;

public class Users {
    private String username;
    private int userage;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getUserage() {
        return userage;
    }

    public void setUserage(int userage) {
        this.userage = userage;
    }

    @Override
    public String toString() {
        return "Users{" +
                "username='" + username + '\'' +
                ", userage=" + userage +
                '}';
    }
}

           

2.3创建页面

<%--
  Created by IntelliJ IDEA.
  User: HP
  Date: 2020/12/23
  Time: 20:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="/js/jquery.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                var name = $("#username").val();
                var age=$("#userage").val();
                var obj={
                    username:name,
                    userage:age
                };
                var user=JSON.stringify(obj);
                debugger
                $.ajax({
                    url:"/user/addUsers",
                    contentType:"application/json",
                    type:"post",
                    data:user,
                    success:function(res){
                        alert(res);
                    }
                })
            })
        })
    </script>
</head>
<body>
用户姓名:<input type="text" name="" id="username"/><br/>
用户年龄:<input type="text" id="userage"/><br/>
<input type="button" value="ok" id="btn">
</body>
</html>

           

2.4创建页面跳转控制器

package com.bjsxt.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/page")
public class PageController {
    @RequestMapping("/{page}")
    public String showPage(@PathVariable String page) {
        return page;
    }

}

           

2.5创建处理 JSON 的控制器

package com.bjsxt.web.controller;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

@Controller
@RequestMapping("/user")
public class UsersController {


    @RequestMapping("/addUsers")
    public void addUsers(@RequestBody Users users, HttpServletResponse response) throws  Exception{
        System.out.println(users);
        PrintWriter writer = response.getWriter();
        writer.print("ok");
        writer.flush();
        writer.close();
    }

    /*
    @RequestMapping("/addUsers")
    @ResponseBody
    public  String addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return "ok";
    }*/

    /*@RequestMapping("/addUsers")
    @ResponseBody
    public  Users addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return users;
    }*/
    // 解决中文乱码增加produces响应体中的数据类型,以及编码解码字符集
    /*@RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
    @ResponseBody
    public  Users addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return users;
    }*/
}

           

运行结果:

注意页面文件里面的btn前面根据id选择需要加#,还有JSON.sringfiy(obj)括号里面需要写js对象。

SpringMVC学习笔记13-JSON 数据处理

响应头没有content-type

SpringMVC学习笔记13-JSON 数据处理

3 处理响应中的 JSON 格式数据

将响应结果转换成 JSON 格式数据时,需要使用@ResponseBody 注解。

[email protected]

@ResponseBody 注解的作用是将处理请求方法返回的对象通过转换器转换为 JSON 格式 数据,同时写入到 response 对象的 body 区,通常用来返回 JSON 数据。需要注意,在使用此注解之后不会再走视图解析器,而是直接将数据写入到输出流中,他的效果等同于通过 response 对象输出指定格式的数据。 如果处理请求方法返回的是 String 时,@ResponseBody 注解不会进行 JSON 转换。响应 的 Content-Type 为 text/plain;charset=ISO-8859-1。 如果处理请求方法返回的是除了 String 类型以外的其他 Object 类型时,@ResponseBody 注解会进行 JSON 转换。响应的 Content-Type 为 application/json。

3.2修改控制器

package com.bjsxt.web.controller;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

@Controller
@RequestMapping("/user")
public class UsersController {


    /*@RequestMapping("/addUsers")
    public void addUsers(@RequestBody Users users, HttpServletResponse response) throws  Exception{
        System.out.println(users);
        PrintWriter writer = response.getWriter();
        writer.print("ok");
        writer.flush();
        writer.close();
    }*/

    
    @RequestMapping("/addUsers")
    @ResponseBody
    public  String addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return "ok";
    }

    /*@RequestMapping("/addUsers")
    @ResponseBody
    public  Users addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return users;
    }*/
    // 解决中文乱码增加produces响应体中的数据类型,以及编码解码字符集
    /*@RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
    @ResponseBody
    public  Users addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return users;
    }*/
}

           

运行结果:

返回类型String,响应体中的数据是iso-8859-1编码方式的文本类型。

SpringMVC学习笔记13-JSON 数据处理
SpringMVC学习笔记13-JSON 数据处理

修改控制器:

package com.bjsxt.web.controller;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

@Controller
@RequestMapping("/user")
public class UsersController {


    /*@RequestMapping("/addUsers")
    public void addUsers(@RequestBody Users users, HttpServletResponse response) throws  Exception{
        System.out.println(users);
        PrintWriter writer = response.getWriter();
        writer.print("ok");
        writer.flush();
        writer.close();
    }*/


    /*@RequestMapping("/addUsers")
    @ResponseBody
    public  String addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return "ok";
    }*/

    @RequestMapping("/addUsers")
    @ResponseBody
    public  Users addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return users;
    }
    // 解决中文乱码增加produces响应体中的数据类型,以及编码解码字符集
    /*@RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
    @ResponseBody
    public  Users addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return users;
    }*/
}

           

运行结果:

返回值写不是字符串的类,响应体中的数据类型是json,编码方式无。

SpringMVC学习笔记13-JSON 数据处理

修改jsp文件

<%--
  Created by IntelliJ IDEA.
  User: HP
  Date: 2020/12/23
  Time: 20:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="/js/jquery.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                var name = $("#username").val();
                var age=$("#userage").val();
                var obj={
                    username:name,
                    userage:age
                };
                var user=JSON.stringify(obj);
                debugger
                $.ajax({
                    url:"/user/addUsers",
                    contentType:"application/json",
                    type:"post",
                    data:user,
                    success:function(res){
                        //alert(res);
                        alert(res.username+","+res.userage);
                    }
                })
            })
        })
    </script>
</head>
<body>
用户姓名:<input type="text" name="" id="username"/><br/>
用户年龄:<input type="text" id="userage"/><br/>
<input type="button" value="ok" id="btn">
</body>
</html>

           

运行结果:

显示js对象的具体属性值。响应体数据的类型是json类型。

SpringMVC学习笔记13-JSON 数据处理

3.3解决响应的 JSON 数据中文乱码问题

修改控制器

package com.bjsxt.web.controller;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

@Controller
@RequestMapping("/user")
public class UsersController {


    /*@RequestMapping("/addUsers")
    public void addUsers(@RequestBody Users users, HttpServletResponse response) throws  Exception{
        System.out.println(users);
        PrintWriter writer = response.getWriter();
        writer.print("ok");
        writer.flush();
        writer.close();
    }*/


    /*@RequestMapping("/addUsers")
    @ResponseBody
    public  String addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return "ok";
    }*/

    /*@RequestMapping("/addUsers")
    @ResponseBody
    public  Users addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return users;
    }*/
    // 解决中文乱码增加produces响应体中的数据类型,以及编码解码字符集
    @RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
    @ResponseBody
    public  Users addUsers(@RequestBody Users users) throws  Exception{
        System.out.println(users);
        return users;
    }
}

           

运行结果:

响应体数据类型是json并且按照utf-8格式编码解码。

SpringMVC学习笔记13-JSON 数据处理

总结:

@RequestBody 将前端的json格式的字符串转为一个java对象。需要发送post类型请求。

@ResponseBody 将返回的字符串写入响应中的响应体,格式为文本,字符集iso-8859-1。返回的java对象写入响应中的响应体,格式为json,字符集没有。如果在@RequestBody中加上reduce参数,使用MediaType或者字符串直接写响应体中的数据格式和字符集,那么可以解决乱码问题。

继续阅读