在本系列的 Spring Roo 简介,第 1 部分:从源代码构建 和 Spring Roo 简介,第 2 部分:使用 Spring Roo 开发应用程序 中,我们使用 Spring Roo 1.1 开发了一个会议应用程序。在 Spring Roo 简介,第 3 部分:开发 Spring Roo 的附加组件 和 Spring Roo 简介,第 5 部分:编写 Spring Roo 的高级附加组件和包装器附加组件 中,我们开发了 Spring Roo 附加组件。而在这两部分之间的 Spring Roo 简介,第 4 部分:用 Spring Roo 和 Cloud Foundry 在云中快速开发应用程序 中,我们查看了 Cloud Foundry 和 Spring Roo 集成。从第 2 部分开始,我们就没有讨论过 Spring Roo 在过去一年中引入的许多新特性和改变。在之前版本中使用的很多命令都已不再工作或已弃用。当前版本的另一个重要方面是 Spring Release 3.1(是 Spring 框架最新也是最棒的发行版)的使用,这个新版本提供了 Profile、Environment abstraction、Cache abstraction 等诸多新特性。使用 Spring Roo 当前版本就意味着使用了 Spring 框架的最新版本。在本文中,我们首先将介绍 Spring Roo 的最新版本,即 Version 1.2.1,然后创建一个多模块的 Google Web Toolkit (GWT) 和 Spring Web Model–View–Controller (MVC) 应用程序并将该应用程序部署到 Cloud Foundry。
Spring Roo 是构建 Spring 应用程序的一个命令行快速应用程序开发工具。Spring Roo 在过去一年中得到了长足的发展,它的两个主要发行版本 1.1.5 和 1.2 让 Spring Roo 的功能更强大,对企业开发者更加友好。这些发布中引入的主要特性或变更包括:
MongoDB 支持:对于 Spring Roo 的旧版本,Spring Roo 应用程序要求使用 RDBMS(比如 MySQL 或 PostgreSQL)作为后端,Google App Engine BigTable 支持除外(但它从不利用各种关系)。自 Version 1.2 起开始,可以使用 MongoDB 作为数据存储。MongoDB 是一个流行的 NoSQL 文档数据存储。构建 Spring MongoDB 应用程序的能力就凸显了 Spring Roo 的可扩展性。要查看所
有的 MongoDB 的相关命令,可以键入: help --command mongo JavaServer Faces (JSF) 2.0 支持:在 Version 1.2 之前,默认情况下,Spring Roo 支持使用 GWT 和 Spring MVC 作为视图选项,
但是对于 Version 1.2,Spring Roo 还支持使用 JSF 2.0 作为视图选项之一。Spring Roo 目前支持 Apache MyFaces 和 Oracle Mojarra JSF 实现,还支持使用 PrimeFaces 作为其组件库。这曾经是常见的 JIRA 问题之一,如今也在 Version 1.2 中也得到了解决。要查看 JSF 所有的可用命令,可以键入: roo> help --command "web jsf" * web jsf all - Create JSF managed beans for all entities * web jsf media - Add a cross-browser generic player to embed multimedia content * web jsf scaffold - Create JSF managed bean for an entity * web jsf setup - Set up JSF environment
本文将不会介绍构建 JSF 2.0 应用程序的所有内容,未来的文章中可能会介绍它们。想要构建 JSF 应用程序的开发人员可以尝试使用 bikeshop.roo 应用程序,它是 Spring Roo 捆绑附带的。Roo 分布中有一个样例文件夹。
多模块 Maven 项目支持:这是社区最强烈要求的流行特性之一,如今已经可用。在 Version 1.2 之前,所有的应用程序代码都必须在一个 Maven 项目中编写。这一点对于构建企业应用程序是不适用的,因为企业应用程序通常有多个子模块来应对不同的应用需求,比如 Web、持久性、服务等。如今,父项目可以为持久性、服务和 Web 定义不同的子模块。在本文后面的有关使用 Spring Roo 构建多模块 Maven 项目的后续部分中,会对这些进行详细介绍。 存储库和服务层支持:直至 Version 1.2,Spring Roo 才提供了在应用程序中包含存储库(或 DAO)和服务层的方法。默认情况下,它支持 Active Record 模式,以确保存在具有与持久性相关的所有方法的
丰富的实体类。这是社区最强烈要求的流行特性之一,如今也已可用。默认情况下,Spring Roo 还支持使用 Active Record 作为实现策略,但是,如果使用 –activeRecord false 创建实体,
那么可以选择一个存储库。这也将在本文的后续部分进行详细介绍。 反向工程支持更强健和更强大的数据库支持:虽然在第 2 部分已经谈及这方面的内容,但这个附加组件在过去一年中有了重大的改进。这些改进包括多模式支持、允许 DBRE 通过 Java Naming and Directory Interface (JNDI) 进行数据库连接、反向工程视图以及对存储库而非 Active Record 实体对象的支持。此外,很多 bug 也得到了修复。DBRE 不在本文的讨论范围之内。 改进了的 Spring Roo Add-on API:第 5 部分介绍了 Spring Roo 附加组件的创建。在该本中,我使用了 Spring Roo Version 1.2,因为这个 API 已经有所改进。Version 1.2 之前存在的某些类已经不复存在或是在 Version 1.2 中被弃用。Spring Roo 团队让 API 与当前的 Spring Roo 附加组件的更为一致。将附加组件更新到 Version 1.2 可能会出问题。 改进了的 GWT 支持:Spring Roo GWT 支持在最新的发布版中得到了改进。早些时候,单个命令 gwt setup 就能够完成从创建代理到向其他与 UI 相关的项发出请求的所有工作。这个单个命令如今已被弃用,并使用 清单 1 中所示的 10 个命令代替了它。GWT 将在本文的后续小节中介绍。
清单 1. web gwt help 的例子
roo> help --command "web gwt"* web gwt all - Locates all entities in the project and creates GWT requests, proxies, and creates the scaffold* web gwt gae update - Updates the GWT project to support GAE* web gwt proxy all - Locates all entities in the project and creates GWT proxies* web gwt proxy request all - Locates all entities in the project and creates GWT requests and proxies* web gwt proxy request type - Creates a proxy and request based on the specified type* web gwt proxy type - Creates a GWT proxy based on the specified type* web gwt request all - Locates all entities in the project and creates GWT requests* web gwt request type - Creates a GWT proxy based on the specified type* web gwt scaffold - Creates a GWT request, proxy and scaffold for the specified type* web gwt setup - Install Google Web Toolkit (GWT) into your project
除了上述特性和改进之外,我还会在本文提及其他的一些细微变化。我们先来创建一个新的 Spring Roo 1.2 会议应用程序。
Spring Roo 1.2 入门
下载并安装这些先决条件。
Java 6 包 Apache Maven 3 Spring Roo 1.2 及其更高版本
本文使用的是 Spring Roo 1.2.1,这是 Spring Roo 的当前版本。
构建会议应用程序
我们将创建与第 1 部分和第 2 部分中相同的会议应用程序。一个 Speaker 可以提供一个或多个 Talk,而 Talk 则只能由一个 Speaker 提供。图 1 给出了这个简单的类图。(Speaker 包含 firstName、lastName、email、organization、birthDate、age 和 gender,Talk 包含 title 和 description。)
图 1. Speaker 和 Talk 表的类图