天天看點

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或者字元串直接寫響應體中的資料格式和字元集,那麼可以解決亂碼問題。

繼續閱讀