領先一步
VMware 提供訓練和認證,以加速您的進展。
了解更多如同 Juergen 和 Arjen 所提到的,各地的 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-ful URL。
在主 servlet-context.xml 中,您會找到典型的設定。在第一行,元件掃描已開啟,以從類別路徑中探索應用程式元件。在下一行,您會找到第一個新的 Spring MVC 3 功能在運作
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />
此標籤註冊了將請求分派到您的 @Controllers 所需的 HandlerMapping 和 HandlerAdapter。此外,它還根據您的類別路徑中存在的內容套用合理的預設值。這些預設值包括
接下來,下一行示範了另一個新功能
<!-- 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 標籤允許您註冊 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 目錄內的檔案。
開始運作,如果您部署範例,您應該會看到 welcome 視圖呈現
隨意啟用不同的語言連結,讓 LocaleChangeInterceptor 切換使用者地區設定。
接下來我將說明的這組新功能與 @Controller 綁定和驗證有關。正如我幾週前在 部落格文章中 提到的,這個領域有很多新東西。
在範例中,如果您啟用 @Controller 範例 連結,應該會呈現以下表單
從那裡,如果您變更地區設定,您應該會看到國際化的欄位格式化開始生效。例如,從 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://127.0.0.1:8080/mvc-basic/account/1。
為了說明另一個很酷的新功能,請嘗試請求一個不存在的帳戶;例如 /account/99。
Spring 3 是一個很棒的版本,包含許多令人興奮的領域的新功能和簡化。我希望您發現這篇關於一些新的 Spring MVC 增強功能的文章很有用。正如我在開頭提到的,敬請期待「Spring 3 簡化」系列中更多內容,我們將繼續展示您可以使用最新版本的框架做哪些新的和有趣的事情。
佳節愉快!