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 社区所有即将举行的活动。

查看所有