天天看點

Spring MVC 的JSON 資料互動 和RESTful支援

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

需要使用到下面三個包

Spring MVC 的JSON 資料互動 和RESTful支援

在使用注解式開發時,需要用到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 />
        密&nbsp;&nbsp;&nbsp;碼:
          <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式資料進行響應)。運作項目檢視效果:

Spring MVC 的JSON 資料互動 和RESTful支援

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

Spring MVC 的JSON 資料互動 和RESTful支援

整體項目

Spring MVC 的JSON 資料互動 和RESTful支援

在這裡的js檔案夾下的jquery-1.11.3.min.js檔案:也就是jquery的腳本:可自行百度下載下傳。或者在下方連結下載下傳:http://www.worlduc.com/blog2012.aspx?bid=62801236