第 14 章 JSON 數(shù)據(jù)交互和 RESTful 支持

Spring MVC 在數(shù)據(jù)綁定的過程中郁季,需要對傳遞數(shù)據(jù)的格式和類型進行轉(zhuǎn)換倒庵,它既可以轉(zhuǎn)換 String 類型的數(shù)據(jù)灯变,也能夠轉(zhuǎn)換 JSON 等其他類型的數(shù)據(jù)。 通過前面章節(jié)學(xué)習(xí)毕荐,大家已經(jīng)掌握 String 等數(shù)據(jù)類型的轉(zhuǎn)換和綁定,本章將針對 Spring MVC 中 JSON 類型的數(shù)據(jù)交互和 RESTful 支持進行詳細講解艳馒。

JSON 數(shù)據(jù)交互

JSON 是近幾年才流行的一種新的數(shù)據(jù)格式憎亚,它與 XML 非常相似,都是用于存儲數(shù)據(jù)的; 但 JSON 相對于 XML 來說弄慰,解析速度更快第美,占用空間更小。 因此在實際開發(fā)中陆爽,使用 JSON 格式的數(shù)據(jù)進行前后臺的數(shù)據(jù)交互是很常見的什往。 下面將對 Spring MVC 中 JSON 數(shù)據(jù)的交互內(nèi)容進行詳細的講解。

  • JSON 概述

JSON ( JavaScript Object Notation , JS 對象標記)是一種輕量級的數(shù)據(jù)交換格式墓陈。 它是基于 JavaScript 的一個子集恶守,使用了 C、 C++贡必、 C#兔港、 Java、 JavaScript仔拟、 Perl衫樊、 Python 等其他語言的約定,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)利花。 這些特性使 JSON 成為理想的數(shù)據(jù)交互語言科侈,它易于閱讀和編寫,同時也易于機器解析和生成炒事。
與 XML 一樣臀栈, JSON 也是基于純文本的數(shù)據(jù)格式。 剛開始大家可以使用 JSON 傳輸一個簡單的 String挠乳、 Number权薯、 Boolean姑躲,也可以傳輸一個數(shù)組或者一個復(fù)雜的 Object 對象。
JSON 有如下兩種數(shù)據(jù)結(jié)構(gòu)盟蚣。

  1. 對象結(jié)構(gòu)
    對象結(jié)構(gòu)以"{"開始黍析,以"}"結(jié)束。 中間部分由 0 個或多個以英文"屎开,"分隔的 name/value 對構(gòu)成(注意 name 和 value 之間以英文": "分隔)阐枣,其存儲形式如圖所示。



    對象結(jié)構(gòu)的語法結(jié)構(gòu)代碼如下奄抽。

{
    key1:value1,
    key2:value2,
    ...
}

其中關(guān)鍵字 (key) 必須為 String 類型蔼两,值 (value) 可以是 String、 Number如孝、 Object宪哩、 Array 等數(shù)據(jù)類型。 例如第晰,一個 address 對象包含城市锁孟、街道、 郵編等信息茁瘦,使用 JSON 的表示形式如下品抽。

{"city":"Beijing","street":"Xisanqi","postcode":l00096 } 
  1. 數(shù)組結(jié)構(gòu)
    數(shù)組結(jié)構(gòu)以"["開始,以"]"結(jié)束甜熔。 中間部分由 0 個或多個以英文"圆恤,"分隔的值的列表組成,其存儲形式如圖所示腔稀。



    數(shù)組結(jié)構(gòu)的語法結(jié)構(gòu)代碼如下盆昙。

[
   value1,
   value2,
   ...
]

例如,一個數(shù)組包含了 String焊虏、 Number淡喜、 Boolean、 null 類型數(shù)據(jù)诵闭,使用 JSON 的表示形式如下炼团。

  ["abc",12345,false,null] 

上述兩種(對象、數(shù)組)數(shù)據(jù)結(jié)構(gòu)也可以分別組合構(gòu)成更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)疏尿。 例如:一個 person 對象包含 name瘟芝、 hobby 和 address 對象,其代碼表現(xiàn)形式如下褥琐。

  {
      "name": "zhangsan" 
      "hobby" : ["籃球","羽毛球","游泳"] 
      "address" : {
          "city":"ShenYang"
          "street":"RenMinDaJie" 
          "postcode":100096 
      }
  }

需要注意的是锌俱,如果使用 JSON 存儲單個數(shù)據(jù)(如 "abc" ),一定要使用數(shù)組的形式敌呈,不要使用 Object 形式贸宏,因為 Object 形式必須是"名稱:值"的形式贩汉。

  • JSON 數(shù)據(jù)轉(zhuǎn)換

為了實現(xiàn)瀏覽器與控制器類( Controller )之間的數(shù)據(jù)交互, Spring 提供了一個 HttpMessageConverter<T>接口來完成此項工作锚赤。 該接口主要用于將請求信息中的數(shù)據(jù)轉(zhuǎn)換為 一個類型為 T 的對象,并將類型為 T 的對象綁定到請求方法的參數(shù)中褐鸥,或者將對象轉(zhuǎn)換為響應(yīng)信息傳遞給瀏覽器顯示线脚。
Spring 為 HttpMessageConverter<T>接口提供了很多實現(xiàn)類,這些實現(xiàn)類可以對不同類型的數(shù)據(jù)進行信息轉(zhuǎn)換叫榕。 其中 MappingJackson2HttpMessageConverter 是 Spring MVC 默認處理 JSON 格式請求響應(yīng)的實現(xiàn)類浑侥。 該實現(xiàn)類利用 Jackson 開源包讀寫 JSON 數(shù)據(jù),將 Java 對象轉(zhuǎn)換為 JSON 對象和 XML 文檔晰绎,同時也可以將 JSON 對象和 XML 文檔轉(zhuǎn)換為 Java 對象寓落。 要使用 MappingJackson2HttpMessageConverter 對數(shù)據(jù)進行轉(zhuǎn)換,就需要使用 Jackson 的開源包荞下,開發(fā)時所需的開源包及其描述如下所示伶选。


以上 3 個 Jackson 的開源包大家以通過鏈接
"http://mvnrepository.com/artifact/com.fasterxm1.jackson.core" 下載得到。
在使用注解式開發(fā)時尖昏,需要用到兩個重要的 JSON 格式轉(zhuǎn)換注解仰税,分別為@RequestBody 和@ResponseBody ,關(guān)于這兩個注解的說明如表所示抽诉。

注解 說明
@RequestBody 用于將請求體中的數(shù)據(jù)綁定到萬法的形參中陨簇。 該注解用在方法的形參上
@ResponseBody 用于直接返回陀turn 對象。 該注解用在方法上

了解了 Spring MVC 中 JSON 數(shù)據(jù)交互需要使用的類和注解后迹淌,接下來通過一個案例來演示如何進行 JSON 數(shù)據(jù)的交互河绽,具體實現(xiàn)步驟如下。
( 1 ) 創(chuàng)建項目并導(dǎo)入相關(guān) JAR 包唉窃。 使用 Eclipse 創(chuàng)建一個名為 springmvc04 的 Web 項目耙饰,然后將 Spring MVC 相關(guān) JAR 包、 JSON 轉(zhuǎn)換包添加到項目的 lib 目錄中句携,并發(fā)布到類路徑下榔幸。 添加后的 lib 目錄如圖所示。



( 2 ) 在 web.xml 中矮嫉,對 Spring MVC 的前端控制器等信息進行配置削咆,文件如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee >http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
       id="WebApp_ID" version="3.1">
       <display-name>springmvc04</display-name>
       <welcome-file-list>
          <welcome-file>index.jsp</welcome-file>
       </welcome-file-list>
       <!-- 配置 Spring MVC 前端控制器 DispatcherServ1et -->
       <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>
          <!-- 配置服務(wù)器啟動后立即加載Spring MVC 配置文件  -->
          <load-on-startup>1</load-on-startup>
       </servlet>
       <servlet-mapping>
          <servlet-name>springmvc</servlet-name>
          <url-pattern>/</url-pattern>
       </servlet-mapping>     
</web-app>

( 3 )在 src 目錄下蠢笋,創(chuàng)建 Spring MVC 的核心配置文件 springmvc-config.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.neuedu.controller" />
  <!-- 配置注解驅(qū)動   -->
  <mvc:annotation-driven /> 
  <!-- 配置靜態(tài)資掘的訪問映射瞻惋,此配置中的文件厦滤,將不被前端控制器攔截 -->
  <mvc:resources location="/js/" mapping="/js/**" />
  <!-- 配置視圖解析器  -->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <!-- 設(shè)置前綴  -->
      <property name="prefix" value="/WEB-INF/jsp/" /> 
      <!-- 設(shè)置后綴  -->
      <property name="suffix" value=".jsp" /> 
  </bean>
</beans>

在文件中,不僅配置了組件掃描器和視圖解析器歼狼,還配置了 Spring MVC 的注解驅(qū)動 <mvc:annotation-drivern />和靜態(tài)資源訪問映射<mvc:resources .../>掏导。 其中<mvc:annotation-drivern/>配置會自動注冊 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 兩個 Bean ,并提供對讀寫 XML 和讀寫 JSON 等功能的支持羽峰。 <mvc:resources... />元素用于配 置靜態(tài)資源的訪問路徑趟咆。 由于在 web.xml 中配置的"/"會將頁面中引入的靜態(tài)文件也進行攔截, 而攔截后頁面中將找不到這些靜態(tài)資源文件梅屉,這樣就會引起頁面報錯值纱。 而增加了靜態(tài)資源的訪問映射配置后,程序會自動地去配置路徑下找靜態(tài)的內(nèi)容坯汤。
<mvc:resources .../>中有兩個重要屬性 location 和 mapping 虐唠,關(guān)于這兩個屬性的說明如下表所示。

屬性 說明
location 用于定位需要訪問的本地靜態(tài)資源文件路徑惰聂,具體到某個文件夾
mapping 匹配靜態(tài)資源全路徑疆偿,冥中"/**"表示文件夾及其子文件夾下的某個具體文件

( 4 )在 src 目錄下,創(chuàng)建一個 com.neuedu.po 包搓幌,并在包中創(chuàng)建一個 User 類翁脆,該類用于封裝 User 類型的請求參數(shù),編輯后文件如下所示鼻种。

package com.neuedu.po;
/**
* 用戶POJO
*/
public class User {
  private String username;
  private String password;
  public String getUsername() {
      return username;
  }
  public void setUsername(String username) {
      this.username = username;
  }
  public String getPassword() {
      return password;
  }
  public void setPassword(String password) {
      this.password = password;
  }
  @Override
  public String toString() {
      return "User [username=" + username + ", password=" + password + "]";
  }
}

在文件中反番,定義了 username 和 password 屬性,及其對應(yīng)的 getter/setter 方法叉钥,同時為了方便查詢結(jié)果重寫了 toString() 方法罢缸。
( 5 )在 WebContent 目錄下,創(chuàng)建頁面文件 index.jsp 來測試 JSON 數(shù)據(jù)交互投队,編輯后文件如下所示枫疆。

<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>測試 JSON交互</title>
<script src="js/jquery-3.4.1.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 表示發(fā)送的數(shù)據(jù)
          >data:JSON.stringify({username:username,password:password}),
          //定義發(fā)送請求的數(shù)據(jù)格式為 JSON 字符串
          contentType:"application/json;charset=UTF-8",
          //定義回調(diào)響應(yīng)的數(shù)據(jù)格式為 JSON 字符串,該屬性可以省略
          dataType:"json",
          //成功響應(yīng)的結(jié)果
          success:function(data){
              if(data != null){
                  alert("您輸入的用戶名為:"+data.username+"密碼為:"+data.password);
              }
          }
      });
  }
</script>
</head>
<body>
  <form>
      用戶名:<input type="text" name="username" id="username"><br />
      密&nbsp;&nbsp;碼:<input type="password" name="password" id="password"><br />
      <input type="button" value="測試JSON交互" onclick="testJson()">
  </form>
</body>
</html>

在文件中敷鸦,編寫了一個測試 JSON 交互的表單息楔,當(dāng)單擊"測試 JSON 交互"按鈕時, 會執(zhí)行頁面中的 testJson()函數(shù)扒披。在函數(shù)中使用了 jQuery 的 AJAX 方式將 JSON 格式的用戶名和密碼傳遞到以 "/testJson" 結(jié)尾的請求中值依。 需要注意的是,在 AJAX 中包含了 3 個特別重要的屬性碟案,其說明如下愿险。

  • data: 即請求時攜帶的數(shù)據(jù),當(dāng)使用 JSON 格式時价说,要注意編寫規(guī)范辆亏。
  • contentType: 當(dāng)請求數(shù)據(jù)為 JSON 格式時风秤,值必須為 application/json。
  • dataType: 當(dāng)響應(yīng)數(shù)據(jù)為 JSON 時扮叨,可以定義 dataType 屬性缤弦,并且值必須為 json。 其中 dataType: "json"也可以省略不寫 彻磁,頁面會自動識別響應(yīng)的數(shù)據(jù)格式甸鸟。

小提示:在上述測試頁面 index.jsp 中使用的是jQuery 的 AJAX 進行的 JSON 數(shù)據(jù)提交和響應(yīng),所以還需要引入 jquery.js 文件。 本示例是引入了 WebContent 目錄下js 文件夾張的 jquery-l.11.3.min.js,大家可以自行下載降宅。
( 6 )在 src 目錄下已卸,創(chuàng)建一個 com.neuedu.controller 包,在該包下創(chuàng)建一個用于用戶操作的控制器類 UserController瞧省,編輯后的代碼文件如下所示扯夭。

package com.neuedu.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.ResponseBody;
import com.neuedu.po.User;
@Controller
public class UserController {
  /**
   * 接收頁面請求的 JSON 數(shù)據(jù),并返回 JSON 格式結(jié)果
   */
  @RequestMapping("/testJson") 
  @ResponseBody 
  public User testJson(@RequestBody User user){
      //打印接收的 JSON 格式數(shù)據(jù)
      System.out.println(user);
      //返回 JSON 格式的響應(yīng)
      return user;
  }
}

在文件中鞍匾,使用注解方式定義了一個控制器類交洗,并編寫了接收和響應(yīng) JSON 格式數(shù)據(jù) 的 testJson() 方法,在方法中接收并打印了接收到的 JSON 格式的用戶數(shù)據(jù)橡淑,然后返回了 JSON 格式的用戶對象构拳。
方法中的@RequestBody 注解用于將前端請求體中的 JSON 格式數(shù)據(jù)綁定到形參 user 上, @ResponseBody 注解用于直接返回 User 對象(當(dāng)返回 POJO 對象時梁棠,會默認轉(zhuǎn)換為 JSON 格 式數(shù)據(jù)進行響應(yīng))置森。
( 7 )將 springmvc04 項目發(fā)布到 Tomcat 服務(wù)器并啟動,在瀏覽器中訪問地址 http://localhost:8880/springmvc04/ 符糊,其顯示效果如圖所示凫海。


在兩個輸入框中分別輸入用戶名 "jack" 和密碼 "123456" 后,單擊"測試 JSON 交互" 按鈕男娄,當(dāng)程序正確執(zhí)行時行贪,頁面中會彈出顯示用戶名和密碼的彈出框,如圖所示模闲。

與此同時建瘫, Eclipse 的控制臺中也會顯示相應(yīng)數(shù)據(jù),如圖所示尸折。

從圖中的顯示結(jié)果可以看出暖混,編寫的代碼已經(jīng)正確實現(xiàn)了 JSON 數(shù)據(jù)交互, 可以將 JSON 格式的請求數(shù)據(jù)轉(zhuǎn)換為方法中的 Java 對象翁授,也可以將 Java 對象轉(zhuǎn)換為 JSON 格式的響應(yīng)數(shù)據(jù)拣播。
多學(xué)一招

  • 使用<bean>標簽方式的 JSON 轉(zhuǎn)踉器配置
    在配直 JSON 轉(zhuǎn)換器時 晾咪, 除了常用的<mvc:annotation-drivem />方式配置外,還可以使用 <bean>標簽的方式進行顯示的配置贮配。 具體配直方式如下 谍倦。
    從上述示例可以看出 , 使用 <bean>標簽配直方式配置 JSON 轉(zhuǎn)換器時泪勒, 需要同時配直處理器映射器和處理器適配器昼蛀,并且 JSON 轉(zhuǎn)換器是配置在適配器中。
  • 配置靜態(tài)資源訪問的萬武
    除了使用 <mvc:resources>元素可以實現(xiàn)對靜態(tài)資源的訪問外圆存,還有另外兩種靜態(tài)資源訪問 的配直方式叼旋,具體分別如下。



    ( 1 )使用 <mvc:default-servlet-handler>標簽沦辙。
    在 springmvc-config.xml 文件中夫植,使用 <rnvc:default-servlet-handler>標簽,具體如下油讯。

 <mvc :default-servlet-handler /> 

在 springmvc-config.xml 中配直<mvc:default-servlet-handler />后详民,會在 SpringMVC 上下文中定義一個 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler (即默認的 Servlet 請求處理器)。 它會像一個檢查員陌兑,對進入 DispatcherServlet 的 URL 進行篩查. 如果 發(fā)現(xiàn)是靜態(tài)資源的請求沈跨,就將該請求轉(zhuǎn)由 Web 服務(wù)器默認的 Servlet 處理,默認的 Servlet 就會對這些靜態(tài)資源放行;如果不是靜態(tài)資源的請求兔综,才由 DispatcherServlet 繼續(xù)處理饿凛。

  • 注意
    一般 Web 服務(wù)器默認的 Servlet 名稱是"default",因此 DefaultServletHttpRequestHandler 可以找到它软驰。如果使用的 Web應(yīng)用服務(wù)器默認的 Servlet 名稱不是"default"笤喳,則需要通過default-servlet-name屬性顯示指定,具體方式如下碌宴。
    <mvc :default-servlet-handler default-servlet-name="Servlet 名稱" />
    而 Web 服務(wù)器的 Servlet 名稱是由使用的服務(wù)器確定的杀狡,常用服務(wù)器及其 Servlet 名稱如下。
    ? Tomcat贰镣、 Jetty呜象、 JBoss 和 and GlassFish 默認 Servlet 的名稱一一 "default"
    ? Google App Engine 默認 Servlet 的名稱一一"_ah_default"
    ? Resin 默認 Servlet 的名稱一一"resin-file"。
    ? WebLogic 默認 Servlet 的名稱一一 "FileServlet"碑隆。
    ? WebSphere 默認 Servlet 的名稱一一"SimpleFileServlet"恭陡。

( 2 )激活 Tomcat 默認的 Servlet 來處理靜態(tài)文件訪問 。 激活 Tomcat 默認的 Servlet 時上煤,需要在 web.xml 中添加以下內(nèi)容.



在上述代碼中休玩,配置了 <servlet-mapping>元素來激活 Tomcat 默認的 Servlet 來處理靜態(tài)文件,我們還可以根據(jù)需要繼續(xù)追加<servlet-mapping>,此種配置方式和上一種方式本質(zhì)上是一樣的拴疤,都是使用 Web 服務(wù)器默認的 Servlet 來處理靜態(tài)資源文件的訪問永部。其中 Servelt 名稱(即<servlet-name>元素的值)也是由使用的服務(wù)器來確定的,不同的服務(wù)器需要使用不同的名稱呐矾。 以上 3 種靜態(tài)資源訪問的自己直方式不同苔埋,并且各有優(yōu)缺點,具體如下蜒犯。
? 第一和第三種配直方式可以選擇性的釋放靜態(tài)資源组橄。
? 第二種配直方式配直相對簡單,只需要一行代碼罚随,就可以釋放所有靜態(tài)資源玉工。
? 第二和第二種配直方式會導(dǎo)致項目移植性較差,需要根據(jù)具體的 Web 服務(wù)器來支改 Servlet 名稱淘菩。
? 第三種配置方式運行效率更高遵班,因為服務(wù)器啟動時已經(jīng)加載了 web.xml 中的靜態(tài)資源 。
在實際開發(fā)中瞄勾,更為常用的配直還是第一種(即案例中的)配置方式,這樣就不需要考慮 Web 服務(wù)器的問題了 弥激。

RESTful 支持

Spring MVC 除了支持 JSON 數(shù)據(jù)交互外进陡,還支持 RESTful 風(fēng)格的編程。 接下來的兩個小節(jié)就對 Spring MVC 中 RESTful 風(fēng)格的編程進行詳細的講解微服。

  • 什么是 RESTful

RESTful 也稱之為 REST ( Representational State Transfer )趾疚,可以將它理解為一種軟件架構(gòu)風(fēng)格或設(shè)計風(fēng)格,而不是一個標準以蕴。
簡單來說糙麦, RESTful 風(fēng)格就是把請求參數(shù)變成請求路徑的一種風(fēng)格。 例如丛肮,傳統(tǒng)的 URL 請求格式為:

http://.../queryltems?id=1

而采用 RESTful 風(fēng)格后赡磅,其 URL 請求為:

http://.../queryltems/1

從上述兩個請求中可以看出, RESTful 風(fēng)格中的 URL 將請求參數(shù) id=1 變成了請求路徑的一部分宝与,并且 URL 中的 queryltems 也變成了 items ( RESTful 風(fēng)格中的 URL 不存在動詞形式的路徑焚廊,如 queryltems 表示查詢訂單,是一個動詞习劫,而 items 表示訂單咆瘟,為名詞)。
RESTful 風(fēng)格在 HTIP 請求中诽里,使用 put袒餐、 delete、 post 和 get 方式分別對應(yīng)添加、刪除灸眼、 修改和查詢的操作卧檐。 不過目前國內(nèi)開發(fā),還是只使用 post 和 get 方式來進行增刪改查操作幢炸。

  • 應(yīng)用案例一一用戶信息查詢

本案例將采用 RESTful 風(fēng)格的請求實現(xiàn)對用戶信息的查詢泄隔,同時返回 JSON 格式的數(shù)據(jù)。 其具體實現(xiàn)步驟如下宛徊。
( 1 )在控制器類 UserController 中佛嬉,編寫用戶查詢方法 selectUser() ,代碼如下所示闸天。

  /**
   * 接收 RESTful 風(fēng)格的請求暖呕,其接收方式為 GET 
   */
  @RequestMapping(value="/user/{id}",method=RequestMethod.GET)
  @ResponseBody 
  public User selectUser(@PathVariable("id") String id){
      //查看數(shù)據(jù)接收
      System.out.println("id = "+id);
      User user = new User();
      //模擬根據(jù)id查詢出到用戶對象數(shù)據(jù)
      if(id.equals("1234")){
          user.setUsername("tom");
      }
      //返回 JSON格式的數(shù)據(jù)
      return user;    
  }

在上述代碼中, @RequestMapping(value="/user/{id}"苞氮,method=RequestMethod.GET)注解用于匹配請求路徑(包括參數(shù))和方式湾揽。 其中 value="/user/{id}"表示可以匹配以 "/user/{id}" 結(jié)尾的請求, id 為請求中的動態(tài)參數(shù); method=RequestMethod.GET 表示只接收 GET 方式的請求笼吟。 方法中的@PathVariable("id")注解則用于接收并綁定請求參數(shù)库物,它可以將請求 URL 中的變量映射 到方法的形參上,如果請求路徑為 "/user/{id}" 贷帮,即請求參數(shù)中的 id 和方法形參名稱 id 一樣戚揭,則@PathVariable 后面的“("id")” 可以省略。
( 2 )在 WebContent 目錄下撵枢,編寫頁面文件 restful.jsp 民晒,在頁面中使用 AJAX 方式通過輸入的用戶編號來查詢用戶信息,文件如下所示锄禽。

<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>RESTful 測試</title>
<script src="js/jquery-3.4.1.js"></script>
<script type="text/javascript">
  function search(){
      //獲取輸入的查詢編號
      var id = $("#number").val();
      $.ajax({
          url:"${pageContext.request.contextPath }/user/"+id,
          type:"GET",
          //定義發(fā)送請求的數(shù)據(jù)格式為 JSON 字符串潜必,該屬性可以省略
          contentType:"application/json;charset=UTF-8",
          //定義回調(diào)響應(yīng)的數(shù)據(jù)格式為 JSON 字符串,該屬性可以省略
          dataType:"json",
          //成功響應(yīng)的結(jié)果
          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">
      <input type="button" value="搜索" onclick="search()">
  </form>
</body>
</html>

在文件中磁滚,在請求路徑中使用了 RESTful 風(fēng)格的 URL,并且定義了請求方式為 GET宵晚。
( 3 )將項目發(fā)布到 Tomcat 服務(wù)器并啟動恨旱,在瀏覽器中訪問地址 http://localhost:8080/springmvc04/restful.jsp ,其顯示效果如圖所示坝疼。


在輸入框中輸入編號 "1234" 后搜贤,單擊"查詢"按鈕,程序正確執(zhí)行后钝凶,瀏覽器會彈出用戶信息窗口仪芒,如圖所示唁影。

如果客戶端使用的是火狐瀏覽器,使用 Firebug 查看請求地址掂名,會發(fā)現(xiàn)請求的 URL 就是我們所需要的 RESTful 風(fēng)格的路徑据沈,如圖所示。

與此同時饺蔑, Eclipse 的控制臺中锌介,也打印出了請求的參數(shù)信息,如圖所示猾警。

從圖中的顯示結(jié)果可以看出孔祸,我們已經(jīng)成功地使用 RESTful 風(fēng)格的請求查詢出了用戶信息。

本章小結(jié)

本章主要對 Spring MVC 中的 JSON 數(shù)據(jù)交互和 RESTful 風(fēng)格的請求進行了詳細的講解发皿。 首先簡單介紹了 JSON 的概念崔慧、 作用和結(jié)構(gòu),然后通過案例講解了 Spring MVC 中如何實現(xiàn) JSON 數(shù)據(jù)的交互穴墅。 接下來講解了什么是 RESTful 惶室,最后通過用戶信息查詢案例來演示 RESTful 的實際使用。 通過本章的學(xué)習(xí)玄货,大家可以掌握 Spring MVC 中的 JSON 數(shù)據(jù)交互和對 RESTful 風(fēng)格支持皇钞, 這對今后實際開發(fā)有極大的幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末松捉,一起剝皮案震驚了整個濱河市夹界,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惩坑,老刑警劉巖掉盅,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件也拜,死亡現(xiàn)場離奇詭異以舒,居然都是意外死亡,警方通過查閱死者的電腦和手機慢哈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門蔓钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卵贱,你說我怎么就攤上這事滥沫。” “怎么了键俱?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵兰绣,是天一觀的道長。 經(jīng)常有香客問我编振,道長缀辩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮臀玄,結(jié)果婚禮上瓢阴,老公的妹妹穿的比我還像新娘。我一直安慰自己健无,他們只是感情好荣恐,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著累贤,像睡著了一般叠穆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畦浓,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天痹束,我揣著相機與錄音,去河邊找鬼讶请。 笑死祷嘶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夺溢。 我是一名探鬼主播论巍,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼风响!你這毒婦竟也來了嘉汰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤状勤,失蹤者是張志新(化名)和其女友劉穎鞋怀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體持搜,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡密似,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了葫盼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片残腌。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贫导,靈堂內(nèi)的尸體忽然破棺而出抛猫,到底是詐尸還是另有隱情,我是刑警寧澤孩灯,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布闺金,位于F島的核電站,受9級特大地震影響峰档,放射性物質(zhì)發(fā)生泄漏败匹。R本人自食惡果不足惜匣距,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哎壳。 院中可真熱鬧毅待,春花似錦、人聲如沸归榕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刹泄。三九已至外里,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間特石,已是汗流浹背盅蝗。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姆蘸,地道東北人墩莫。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像逞敷,于是被迫代替她去往敵國和親狂秦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 16. Web MVC 框架 16.1 Spring Web MVC 框架介紹 Spring Web 模型-視圖-...
    此魚不得水閱讀 1,046評論 0 4
  • 對于java中的思考的方向推捐,1必須要看前端的頁面裂问,對于前端的頁面基本的邏輯,如果能理解最好牛柒,不理解也要知道幾點堪簿。 ...
    神尤魯?shù)婪?/span>閱讀 815評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,103評論 1 32
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評論 0 11
  • 緊接著上文,我們來學(xué)習(xí)mvc標簽皮壁。 Spring版本:4.3.14椭更。 6.mvc 命名空間 ??mvc命名空間內(nèi)的...
    騎著烏龜去看海閱讀 1,780評論 0 2