第11章 Groovy集成
JBoss Seam的一个方面是它的RAD(Rapid Application Development快速应用程序开发)能力。虽然没有与RAD同义的,在这个空间里的一个有趣的工具是动态语言。迄今为止,选择一个动态语言是要求一个完全不同的开发平台(带有一个API集和一个运行时间库的一个开发平台这样宠大,以致于你再也不愿想使用你的老的向后兼容的Java[sic] APIs,其是幸运的,因为无论何时你被迫使用那些所有的APIs)。???动态语言构建在Java虚拟机的顶层,并且Groovy [http://groovy.codehaus.org]在细节上打破了在仓库内的这种方法。
现在JBoss Seam联合了动态语言世界与Java EE世界,通过无缝集成了静态的和动态语言两者。为了这个任务,JBoss Seam让程序程序开发者使用最好的工具,不用上下文切换。写动态Seam组件完全象写正规的Seam组件。你使用同样的注释,同样的APIs,同样的所有事物。
11.1. Groovy 介绍
Groovy 是基于Java语言的一个灵活的动态语言,但是带着来自Python、Ruby 和 Smalltalk灵感的附加特色。Groovy的优点是双重的:
* Groovy支持Java语法;Java代码是Groovy代码,产生的学习曲线十分平滑。
* Groovy 对象是Java 对象,并且Groovy类是Java类;Groovy平稳地集成了存在的Java库和框架。
TODO: 写一个快速的 Groovy语法附加总结
11.2. 用 Groovy写Seam应用程序
关于它并没有太多说的。因为一个Groovy对象是一个Java对象,实质上你能写任何Seam组件,或对它值得写任何类,使用Groovy并部署它。你也能在同一个应用程序中混合Groovy类和Java类。
11.2.1. 写Groovy 组件
因为到现在你已注意到,Seam大量使用注释。为了对注释支持,你确定你使用了Groovy 1.1以上版本。这儿有用在一个Seam 应用程序中的一些groovy代码例子。
11.2.1.1. 实体
@Entity
@Name("hotel")
class Hotel implements Serializable
{
@Id @GeneratedValue
Long id
@Length(max=50) @NotNull
String name
@Length(max=100) @NotNull
String address
@Length(max=40) @NotNull
String city
@Length(min=2, max=10) @NotNull
String state
@Length(min=4, max=6) @NotNull
String zip
@Length(min=2, max=40) @NotNull
String country
@Column(precision=6, scale=2)
BigDecimal price
@Override
String toString()
{
return "Hotel(${name},${address},${city},${zip})"
}
}
Groovy天然地支持属性(getter/setter)概念,所以不需要明确地写冗余的getters和 setters: 在前面的例子,从Java用hotel.getCity()方法,hotel 类能被访问,getters和 setters由 Groovy 编译器产生。这类语法上的甜头产生的实体代码很简明。
11.2.1.2. Seam component
用Groovy写Seam组件与用Java写方法上并没有什么不同:注释被用来标记类为一个Seam组件。
@Scope(ScopeType.SESSION)
@Name("bookingList")
class BookingListAction implements Serializable
{
@In EntityManager em
@In User user
@DataModel List<Booking> bookings
@DataModelSelection Booking booking
@Logger Log log
@Factory public void getBookings()
{
bookings = em.createQuery('''
select b from Booking b
where b.user.username = :username
order by b.checkinDate''')
.setParameter("username", user.username)
.getResultList()
}
public void cancel()
{
log.info("Cancel booking: #{bookingList.booking.id} for #{user.username}")
Booking cancelled = em.find(Booking.class, booking.id)
if (cancelled != null) em.remove( cancelled )
getBookings()
FacesMessages.instance().add("Booking cancelled for confirmation number
#{bookingList.booking.id}", new Object[0])
}
}
11.2.2. seam-gen
Seam gen有一个透明的Groovy集成。不用任何附加的底层必要的东西,你能在seam-gen支持的项目中写Groovy代码。当写一个Groovy实体时,只不过放你的.groovy文件在src/model目录中。也不令人吃惊了,当写一个动作,只不过放你的.groovy在src/action目录中。
11.3. 部署
部署Groovy类非常象部署Java类(令人吃惊,不需要写,也不遵守一个为了支持一个多语言组件框架的3-letter复合规范。)
除了标准部署,在部署期间,JBoss Seam有能力,不用重启应用程序重部署JavaBeans Seam组件类,在部署/测试周期节省了大量时间。当.groovy被部署时,对GroovyBeans Seam组件提供同样的支持。
11.3.1. 部署Groovy代码
Groovy类是Java类,就象一个Java类一样也用字节代码表示。为了部署,一个 Groovy 实体,一个 Groovy 会话bean 或者一个Groovy Seam 组件,一个汇编步骤是必要的。一个通用方法是使用groovyc ant任务。一旦编译,一个groovyc 类与一个Java类并没有什么不同,并且应用程序服务器会同等对待它们。注意,这允许一个无缝的Groovy 和Java code混合。
11.3.2. 在部署期间,本地.groovy文件的部署
JBoss Seam天然地支持.groovy文件部署 (也就是说不编辑) ,用增加的热部署模式(仅部署)。这使一个快速的edit/test周期可行。为了设置.groovy部署,下面的配置在章节2.8,“Seam和增加的热部署”,并且部署你的Groovy 代码 (.groovy 文件) 进入WEB-INF/dev 目录。 GroovyBean组件会逐步获得,不需要重启应用程序(并且显然不是任一的应用程序服务器) 。
要意识到,象正规的Seam热部署一样,本地.groovy文件部署会遭遇到同样的限止:
*组件必须是 JavaBeans 或GroovyBeans.它们不能是 EJB3 bean
*实体不能被热部署
*热部署可用的组件对任何部署在WEB-INF/dev外的类会是不可见的。
* Seam调试模式必须被激活
11.3.3. seam-gen
Seam-gen透明地支持Groovy 文件部署和汇编。这包括在部署模式下的本地.groovy文件部署 (较小的汇编)。如果你创建了一个seam-gen WAR类项目,在src/action 目录下的Java和 Groovy类会自动成为增加的热部署的候选人。如果你是在生产模式,在部署前,Groovy文件只是被编译。
在 examples/groovybooking目录下,你会发现一个活生生的例子,Booking 演示应用程序,完全是用Groovy写的,并且支持增加的热部署。
[Groovy – Home http://groovy.codehaus.org/]