Spring 3.0 中的 MVC 簡化

工程 | Keith Donald | 2009年12月21日 | ...

正如 JuergenArjen 所提到的,全球的 Java 開發者都透過 Spring 3.0 實現了平穩升級。現在 Spring 3 已經發布,我想帶您瞭解一些您可能不知道的新 MVC 功能。我希望您覺得這些功能有用,並能立即開始在您的 Web 應用程式中應用它們。

這也是“Spring 3 簡化”系列文章的開端,因此在未來幾天和幾周內,請期待更多類似的文章。

配置簡化

Spring 3 引入了 mvc 名稱空間,大大簡化了 Spring MVC 的設定。加上其他增強功能,讓 Spring Web 應用程式啟動和執行從未如此簡單。這可以透過 mvc-basic 示例來展示,我將帶您逐步瞭解。

mvc-basic 旨在展示 Spring MVC 的基本功能集。該專案可在我們的 spring-samples SVN 儲存庫中獲取,可以使用 Maven 構建,並可匯入 Eclipse。請從 web.xml 開始檢視,並注意其中的配置。值得注意的是,一個 DispatcherServlet 配置了一個主 Spring 配置檔案,該檔案初始化所有其他應用程式元件。DispatcherServlet 被配置為應用程式的預設 Servlet(對映到“/”),從而實現乾淨、REST 風格的 URL。

在主 servlet-context.xml 中,您會發現一個典型的設定。第一行,元件掃描已開啟,用於從類路徑中發現應用程式元件。在下一行,您會發現第一個新的 Spring MVC 3 功能正在執行


<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />

此標籤註冊了將請求分派到您的 @Controllers 所需的 HandlerMapping 和 HandlerAdapter。此外,它還根據類路徑中存在的內容應用合理的預設值。這些預設值包括

  • 使用 Spring 3 型別 ConversionService 作為 JavaBeans PropertyEditors 更簡單、更健壯的替代方案
  • 支援使用 @NumberFormat 格式化數字欄位
  • 如果 Joda Time 在類路徑中,則支援使用 @DateTimeFormat 格式化 Date、Calendar 和 Joda Time 欄位
  • 如果 JSR-303 Provider 在類路徑中,則支援使用 @Valid 驗證 @Controller 輸入
  • 如果 JAXB 在類路徑中,則支援讀寫 XML
  • 如果 Jackson 在類路徑中,則支援讀寫 JSON
很酷,是吧?

接下來,下一行演示了另一個新功能


<!-- Forwards requests to the "/" resource to the "welcome" view -->
<mvc:view-controller path="/" view-name="welcome" />

在幕後,mvc:view-controller 註冊了一個 ParameterizableViewController,它選擇一個檢視進行渲染。在這種情況下,當請求“/”時,歡迎檢視將被渲染。實際的檢視模板是 /WEB-INF/views 目錄中解析的 .jsp 檔案。

接下來,下一行展示了另一個新功能


<!-- Configures Handler Interceptors -->	
<mvc:interceptors>
    <!-- Changes the locale when a 'locale' request parameter is sent; e.g. /?locale=de -->
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>

mvc:interceptors 標籤允許您註冊 HandlerInterceptors 以應用於所有控制器。以前,要做到這一點,您必須為每個 HandlerMapping bean 明確註冊這些攔截器,這是重複的。另請注意,此標籤現在允許您限制某些攔截器適用的 URL 路徑。

接下來,下一行重點介紹了版本 3.0.4 中新增的新功能


<!-- Handles GET requests for /resources/** by efficiently serving static content in the ${webappRoot}/resources dir -->
<mvc:resources mapping="/resources/**" location="/resources/" />

mvc:resources 標籤允許您為靜態資源(如 css 和 javascript 檔案)配置處理程式。在這種情況下,對 /resources/** 的請求會對映到 /resources 目錄中的檔案。

將一切付諸行動,如果您部署示例,您應該會看到歡迎檢視渲染

mvc-basic

隨意啟用不同的語言連結,讓 LocaleChangeInterceptor 切換使用者語言環境。

資料繫結簡化

我將展示的下一組新功能與 @Controller 繫結和驗證有關。正如我幾周前 在部落格中提到的,這個領域有很多新內容。

在示例中,如果您啟用 @Controller 示例 連結,則應渲染以下表單

mvc-basic-form

從那裡,如果您更改語言環境,您應該會看到國際化欄位格式生效。例如,從 en 切換到 de 會導致續訂日期 12/21/10 格式化為 21.12.10。此行為和表單的驗證規則由模型註解驅動


public class Account {
	
	@NotNull
	@Size(min=1, max=25)
	private String name;
	
	@NotNull
	@NumberFormat(style=Style.CURRENCY)
	private BigDecimal balance = new BigDecimal("1000");
	
	@NotNull
	@NumberFormat(style=Style.PERCENT)
	private BigDecimal equityAllocation = new BigDecimal(".60");

	@DateTimeFormat(style="S-")
	@Future
	private Date renewalDate = new Date(new Date().getTime() + 31536000000L);

}

表單提交由以下 AccountController 方法處理


@RequestMapping(method=RequestMethod.POST)
public String create(@Valid Account account, BindingResult result) {
    if (result.hasErrors()) {
        return "account/createForm";
    }
    this.accounts.put(account.assignId(), account);
    return "redirect:/account/" + account.getId();
}

此方法在繫結和驗證之後被呼叫,其中 Account 輸入的驗證由 @Valid 註解觸發。如果存在任何驗證錯誤,createForm 將重新渲染,否則 Account 將被儲存,使用者將被重定向;例如,重定向到 https://:8080/mvc-basic/account/1

為了說明另一個很酷的新功能,請嘗試請求一個不存在的帳戶;例如 /account/99。

總結

Spring 3 是一個很棒的版本,在許多令人興奮的領域包含了許多新功能和簡化。我希望您發現這篇關於 Spring MVC 一些新增強功能的文章很有用。正如我在開頭提到的,敬請期待“Spring 3 簡化”系列中將推出的更多內容,我們將繼續展示使用最新版本框架可以實現的新穎有趣的事物。

節日快樂!

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

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

瞭解更多

獲得支援

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

瞭解更多

即將舉行的活動

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

檢視所有