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 檔案中,你會看到一個典型的設定。第一行啟用了元件掃描,以便從 classpath 發現應用程式元件。下一行你會看到第一個新的 Spring MVC 3 特性


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

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

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

接下來,下一行演示了另一個新特性


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

在幕後,mvc:view-controller 註冊了一個 ParameterizableViewController,用於選擇要渲染的檢視。在這種情況下,當請求 "/" 時,會渲染 welcome 檢視。實際的檢視模板是一個位於 /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 標籤允許你註冊 HandlerInterceptor,以便應用於所有控制器。以前,你需要為每個 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 目錄內的檔案。

將應用程式部署起來,你應該會看到 welcome 檢視渲染出來

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 社群所有近期活動。

檢視全部