JSON資料互動
JSON概述
JSON與 XML 非常相似,都是用于存儲資料的,但是JSON 相對于XML來說,解析速度更快,占用空間更小,是以在實際開發中,使用 JSON式的資料進行前背景的資料互動是很常見的。
JSON(JavaScript Object Notation,JS對象标記)是一種輕量級的資料交換格式。它是基于JavaScript的一個子集,使用了C、C++、C#、Java、JavaScript、Perl、Python等其他語言的約定,采用完全獨立于程式設計語言的文本格式來存儲和表示資料。
JSON資料轉換
Spring提供了一個HttpMessageConverter接口來實作浏覽器與控制器類(Controller)之間的資料互動。該接口主要用于将請求資訊中的資料轉換為一個類型為T的對象,并将類型為T的對象綁定到請求方法的參數中,或者将對象轉換為響應資訊傳遞給浏覽器顯示。
HttpMessageConverter接口有很多實作類,這些實作類可以對不同類型的資料進行資訊轉換。其中MappingJackson2HttpMessageConverter是Spring MVC預設處理JSON格式請求響應的實作類。該實作類利用Jackson開源包讀寫JSON資料,将Java對象轉換為JSON對象和XML文檔,同時也可以将JSON對象和XML文檔轉換為Java對象。
要使用MappingJackson2HttpMessageConverter對資料進行轉換,就需要使用Jackson的開源包,下載下傳位址:http://mvnrepository.com/artifact/com.fasterxml.jackson.core
需要使用到下面三個包
在使用注解式開發時,需要用到2個重要的JSON格式轉換注解,分别為@RequestBody和@ResponseBody,關于這兩個注解的說明如下表所示:
注解 | 說明 |
---|---|
@RequestBody | 用于将請求體中的資料綁定到方法的形參中。該注解用在方法的形參上 |
@ResponseBody | 用于直接傳回return對象。該注解用在方法上。 |
案例實作:
先進行配置web.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<!-- 配置前端過濾器 -->
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 初始化時加載配置檔案 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!-- 在啟動時立即加載servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
随後對spring-mvc.xml檔案進行配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 指定需要掃描的包 -->
<context:component-scan
base-package="com.lzq.controller" />
<!-- 配置注解驅動包 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置靜态資源的通路映射 該配置的檔案 不被前端控制器攔截-->
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
<!-- 定義視圖解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 設定字首 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 設定字尾 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
在檔案14-2中,不僅配置了元件掃描器和視圖解析器,還配置了SpringMVC的注解驅動
<mvc:annotation-drivern />
和靜态資源通路映射
<mvc:resources>
.其中
<mvc:annotation-drivern/>
配置會自動注冊RequestMappingHandlerMapping和RequestMappingHandlerAdapter,兩個Bean并提供對讀寫XML和讀寫JSON等功能的支援。
<mvc:resources... />
元素用于配置靜态資源的通路路徑。由于在web.xml中配置的“/”會将頁面中引入的靜态檔案也進行攔截,而攔截後頁面中将找不到這些靜态資源檔案,這樣就會引起頁面報錯。而增加了靜态資源的通路映射配置後,程式會自動地去配置路徑下找靜态的内容。
<mvc:resources>
中有兩個重要屬性location 和 mapping,如下表所示:
屬性 | 說明 |
---|---|
location | 用于定位需要通路的本地靜态資源檔案,具體到某個檔案夾 |
mapping | 比對靜态資源的全路徑,其中" /** " 表示檔案夾及其子檔案夾下的某個具體檔案 |
建立一個com.lzq.po包,在裡面添加一個class類。對屬性進行封裝以及重寫getter/setter方法。
public class User {
String username;
Integer password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer password) {
this.password = password;
}
@Override
public String toString() {
return "User[ username = "+username +" , password = "+password+"]";
}
}
再在 WebContent 目錄下,建立頁面檔案 index.jsp 來測試JSON 資料互動,
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>測試JSON互動</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript"
src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js">
</script>
<script type="text/javascript">
function testJson(){
// 擷取輸入的使用者名和密碼
var username = $("#username").val();
var password = $("#password").val();
$.ajax({
url : "${pageContext.request.contextPath }/testJson",
type : "POST",
// data表示發送的資料
data :JSON.stringify({username:username,password:password}),
// 定義發送請求的資料格式為JSON字元串
contentType : "application/json;charset=UTF-8",
//定義回調響應的資料格式為JSON字元串,該屬性可以省略
dataType : "json",
}
});
}
</script>
</head>
<body>
<form>
使用者名:<input type="text" name="username" id="username"><br />
密 碼:
<input type="password" name="password" id="password"><br />
<input type="button" value="測試JSON互動" onclick=" testJson()" />
</form>
</body>
</html>
編寫了一個測試 JSON 互動的表單,當單擊 “測試 JSON 互動” 按鈕時,會執行頁面中的 testJson() 函數 在函數中使用了 jQuery AJAX 方式将 JSON 格式的使用者名和密碼傳遞到以 “/testJson” 結尾的請求中。
需要注意的是,在 AJAX 中包含了 個特别重要的屬性,其說明如下:
- data: 即請求時攜帶的資料,當使用 JSON 格式時,要注意編寫規範
- contentType: 當請求資料為JSON 格式時,值必須為application/json
- dataType: 當響應資料為 JSON 時,可以定義 dataType 屬性,并且值必須為 json 其中dataType: "json"也可以省略不寫 ,頁面會自動識别響應的資料格式。
建立一個com.lzq.controller的包,在裡面進行添加控制器類。
package com.lzq.controller;
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.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.lzq.po.User;
@Controller
public class UserController {
@RequestMapping(value = "/testJson")
public User testJson(@RequestBody User user) {
System.out.println(user);
return user;
}
方法中的@RequestBody 注解用于将前端請求體中的JSON 格式資料綁定到形參 user 上,@ResponseBody 注解用于直接傳回 User 對象(當傳回 POJO 對象時,會預設轉換為 JSON式資料進行響應)。運作項目檢視效果:
RESTful支援
Spring MVC 除了支援 JSON 資料互動外,還支援 RESTf ul 風格的程式設計。
什麼是RESTful ?
RESTful也稱之為REST,是英文“Representational State Transfer”的簡稱。可以将他了解為一種軟體架構風格或設計風格,而不是一個标準。 簡單來說,RESTful風格就是把請求參數變成請求路徑的一種風格。
傳統的URL請求格式為:使用問号傳遞參數
采用RESTful風格後,其URL請求為:
案例實作:
在上面的代碼當中進行添加,首先在控制器類當中添加一個新的方法
@RequestMapping(value="/user/{id}", method=RequestMethod.GET)
//value="/user/{id}" 表示可以比對以 "/user/{id}"尾的請求,
//id 為請求中的動态參數; method=RequestMethod.GET 表示隻接收 GET 方式的請求.
@ResponseBody
public User getUser(@PathVariable("id") String id) {
//@PathVariable("id")注解則用于接收并綁定請求參數,它可以将請求 URL 中的變量映射到方法的形參上,
//如果請求路徑為 "/user/{id}" ,即請求參數中的 id 和方法形參名稱 id 一樣,則@PathVariable 後面的"(id)"可以省略
System.out.println("id =" +id);
User user= new User();
if (id.equals("1234")) {
user.setUsername("huangyueyue");
}
return user;
}
添加一個restful.jsp檔案:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>restful</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript"
src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js">
</script>
<script type="text/javascript">
function search(){
// 擷取輸入的使用者名和密碼
var id = $("#number").val();
$.ajax({
url : "${pageContext.request.contextPath }/user/"+id,
type : "GET",
// data表示發送的資料
dataType : "json",
//成功響應的結果
success : function(data){
if(data.username != null){
alert("你查詢的是:"+data.username);
}else{
alert("沒有找到id ="+id+"的使用者")
}
}
});
}
</script>
</head>
<body>
<form>
<input type="text" name="number" id="number"><br />
<input type="button" value="搜尋" onclick=" search()" />
</form>
</body>
</html>
運作項目輸入網址:
http://localhost:8080/JsonDataInteraction/restful.jsp
整體項目
在這裡的js檔案夾下的jquery-1.11.3.min.js檔案:也就是jquery的腳本:可自行百度下載下傳。或者在下方連結下載下傳:http://www.worlduc.com/blog2012.aspx?bid=62801236