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(映射到“/”),允许使用简洁的 RESTful URL。

在主 servlet-context.xml 中,您会发现一个典型的设置。在第一行,已启用组件扫描以从类路径中发现应用程序组件。在下一行,您会发现第一个正在使用的 Spring MVC 3 功能


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

此标签注册分派请求到您的 @Controllers 所需的 HandlerMapping 和 HandlerAdapter。此外,它还根据类路径中存在的内容应用合理的默认值。此类默认值包括

  • 使用 Spring 3 类型 ConversionService 作为 JavaBeans PropertyEditors 的更简单、更强大的替代方案
  • 支持使用 @NumberFormat 格式化数字字段
  • 支持使用 @DateTimeFormat 格式化日期、日历和 Joda Time 字段,如果类路径上有 Joda Time 的话
  • 支持使用 @Valid 验证 @Controller 输入,如果类路径上有 JSR-303 提供程序的话
  • 支持读取和写入 XML,如果类路径上有 JAXB 的话
  • 支持读取和写入 JSON,如果类路径上有 Jackson 的话
很酷,对吧?

接下来,下一行演示了另一个新功能


<!-- 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 标签允许您注册要应用于所有控制器的 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 目录中的文件。

启动并运行,如果您部署了示例,您应该会看到欢迎视图呈现

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://127.0.0.1:8080/mvc-basic/account/1

为了说明另一个很酷的新功能,请尝试请求一个不存在的帐户;例如,/account/99。

总结

Spring 3 是一个很棒的版本,包含许多新功能和简化功能,涵盖了许多令人兴奋的领域。我希望您发现这篇关于一些新的 Spring MVC 增强的文章有用。正如我在开头提到的,期待“Spring 3 简化”系列中出现更多内容,我们将继续展示使用最新版本框架可以执行的新事物和有趣事物。

节日快乐!

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部