十三、 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建立項目添加依賴
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對象。
響應頭沒有content-type
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編碼方式的文本類型。
修改控制器:
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,編碼方式無。
修改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類型。
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格式編碼解碼。
總結:
@RequestBody 将前端的json格式的字元串轉為一個java對象。需要發送post類型請求。
@ResponseBody 将傳回的字元串寫入響應中的響應體,格式為文本,字元集iso-8859-1。傳回的java對象寫入響應中的響應體,格式為json,字元集沒有。如果在@RequestBody中加上reduce參數,使用MediaType或者字元串直接寫響應體中的資料格式和字元集,那麼可以解決亂碼問題。