Spring 3.0 中的 Ajax 簡化

工程 | Keith Donald | 2010年1月25日 | ...

在我的上一篇文章中,我向您介紹了 Spring 3 中用於 Web 應用程式開發的幾項增強功能。許多人對後續文章表示興趣,該文章將重點關注 Ajax 遠端處理。Spring 3 在這方面提供了很多優勢。請繼續閱讀,我將向您詳細介紹。

Spring 和 Ajax 概述

就本文而言,我所說的 Ajax 是指 Web 瀏覽器使用 JavaScript 與 Web 伺服器非同步通訊的能力。在伺服器端,Spring 提供了定義 Web 服務(包括 JavaScript 客戶端使用的服務)的程式設計模型。在客戶端,現在也沒有人自己開發 Ajax 框架了。大多數人都使用成熟的 JavaScript 框架,例如 jQueryDojo

支援 Ajax 客戶端

在版本 3 之前,Spring 並沒有提供對 Ajax 遠端處理的支援。但這並沒有阻止我們的使用者擴充套件 Spring 以獲得支援,或者自行整合其他選項。有些人使用 DWR,尤其是在 JavaScript 框架興起之前。最近,使用 JSON 作為資料交換格式的 REST 風格遠端處理變得更加流行,特別是由於 jQuery 和其他框架 使其變得如此簡單

現在 Spring 3 已經發布,官方提供了對使用 JSON 的 Ajax 遠端處理的支援,作為 Spring MVC 的一部分。這包括使用 Spring MVC @Controller 程式設計模型生成 JSON 響應和繫結 JSON 請求的支援。在本文中,我將重點介紹如何使用此支援來實現幾個 Ajax 用例。就像我上一篇文章一樣,我將透過一個您可以自己嘗試的示例應用程式來引導您完成。

MVC Ajax 示例

mvc-ajax 旨在說明 Spring MVC 的 JSON 支援。該專案可在我們的 spring-samples Subversion 儲存庫中獲取,可以使用 Maven 構建,並可匯入 STS / Eclipse。mvc-ajax 具有與我 上一篇文章 中介紹的 mvc-basic 專案相同的結構。事實上,兩者的 Spring 配置是相同的。

透過將專案部署到您的 servlet 容器並在 localhost:8080/mvc-ajax 訪問歡迎頁面來開始您的審查。由於我使用 STS,我首先將專案匯入到 IDE,然後將其部署到內建的 Tomcat / tc-server 例項。

從伺服器獲取 JSON

從歡迎頁面啟用“Ajax @Controller 示例”連結。您將看到一個建立新帳戶的表單。當您退出“名稱”欄位時,您的瀏覽器將詢問伺服器您剛剛輸入的名稱是否可用。如果不可用,將顯示錯誤訊息,並且表單將保持停用狀態,直到您輸入可用的名稱。處理此問題的客戶端 JavaScript 位於 /WEB-INF/views/account/createForm.jsp 中,看起來像


$(document).ready(function() {
    // check name availability on focus lost
    $('#name').blur(function() {
        checkAvailability();
    });
});

function checkAvailability() {
    $.getJSON("account/availability", { name: $('#name').val() }, function(availability) {
        if (availability.available) {
            fieldValidated("name", { valid : true });
        } else {
            fieldValidated("name", { valid : false,
                message : $('#name').val() + " is not available, try " + availability.suggestions });
        }
    });
}

這裡沒有什麼 Spring 特有的,只是標準的 jQuery JavaScript。

在伺服器端,account/availability 資源的 Controller 是帶有 Spring MVC 註解的標準 Java


@RequestMapping(value="/availability", method=RequestMethod.GET)
public @ResponseBody AvailabilityStatus getAvailability(@RequestParam String name) {
    for (Account a : accounts.values()) {
        if (a.getName().equals(name)) {
            return AvailabilityStatus.notAvailable(name);
        }
    }
    return AvailabilityStatus.available();
}

AvailabilityStatus 是一個普通的 Java 值物件,具有兩個屬性:一個可用性標誌,告訴客戶端使用者名稱是否可用;以及一個建議替代方案的陣列,如果所需的名稱不可用。@ResponseBody 註解指示 Spring MVC 將 AvailabilityStatus 序列化到客戶端。Spring MVC 會自動序列化為 JSON,因為客戶端接受該內容型別。

在底層,Spring MVC 委託給 HttpMessageConverter 執行序列化。在這種情況下,Spring MVC 呼叫一個基於 Jackson JSON 處理器構建的 MappingJacksonHttpMessageConverter。當您在類路徑中存在 Jackson 的情況下使用 mvc:annotation-driven 配置元素時,此實現會自動啟用。

很酷,是嗎?嘗試建立一個帳戶,然後用相同的名稱建立另一個帳戶。您應該會看到一條錯誤訊息,建議替代名稱。開啟 Firefox 的 Firebug 或 Safari 的 Web Inspector 來除錯非同步互動。

向伺服器傳送 JSON

Spring MVC 還提供了向伺服器傳送 JSON 的支援。我發現這種需求較少見,原因很簡單,通常提交表單引數就足夠了。然而,JSON 提供了一種靈活的資料交換格式,更豐富的 JavaScript 客戶端可以方便地使用。在這種情況下,將 JSON 對映到伺服器端 Java 物件進行處理的能力可能是一個有用的功能。

在示例中,一個 JavaScript 事件處理程式攔截表單提交事件並將表單資料作為 JSON 傳送。伺服器返回新建立的帳戶的 ID,然後用於顯示一個模態確認對話方塊


$("#account").submit(function() {
    var account = $(this).serializeObject();
    $.postJSON("account", account, function(data) {
        $("#assignedId").val(data.id);
        showPopup();
    });
    return false;
});

在伺服器端,Controller 是帶有 Spring MVC 註解的更標準的 Java


@RequestMapping(method=RequestMethod.POST)
public @ResponseBody Map<String, ? extends Object> create(@RequestBody Account account, HttpServletResponse response) {
    Set<ConstraintViolation<Account>> failures = validator.validate(account);
    if (!failures.isEmpty()) {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        return validationMessages(failures);
    } else {
        accounts.put(account.assignId(), account);
        return Collections.singletonMap("id", account.getId());
    }
}

這裡,@RequestBody 註解指示 Spring MVC 將 HTTP 請求的主體對映到 Account 物件。Spring MVC 知道從 JSON 對映,因為客戶端將請求的 Content Type 設定為 application/json。

create 方法還會驗證 Account 物件。如果存在驗證錯誤,則返回 HTTP 400 並附帶錯誤訊息,否則返回 HTTP 200 並附帶分配的帳戶 ID。

總結

Spring 3 提供了對 JSON 的一流 Ajax 支援,作為 Spring MVC 模組的一部分。這包括結合 Jackson JSON 處理器,使用 Spring MVC @Controller 程式設計模型生成 JSON 響應和繫結 JSON 請求的支援。在本文中,我向您展示了這種支援如何工作。我希望您覺得這篇文章有用,並期待聽到您將 Spring 3 應用到您自己的應用程式中的更多經驗!

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有