第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/]
分享到:
相关推荐
第11章 与java集成 11.1 服务器端java集成 11.2 通过集成hibernate实现orm 11.2.1 使用hibernatecxml映射 11.2.2 ejb3方式的映射 11.2.3 在pojo实体中使用约束 11.2.4 得到...
第11章 扩展性模式 11.1 抽象化模块 11.1.1 表述 11.1.2 描述 11.1.3 多种实现 11.1.4 效果 11.1.5 样例 11.1.6 小结 11.2 实现工厂 11.2.1 表述 11.2.2 描述 11.2.3 多种实现 11.2.4 效果 11.2.5 样例...
第11章 扩展性模式 11.1 抽象化模块 11.1.1 表述 11.1.2 描述 11.1.3 多种实现 11.1.4 效果 11.1.5 样例 11.1.6 小结 11.2 实现工厂 11.2.1 表述 11.2.2 描述 11.2.3 多种实现 11.2.4 效果 11.2.5 样例 11.2.6 小结 ...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
3 小结 18 第 2 章开发第一个应用程序 19 2 . 1 运用 Spring Boot 19 2 . 1 . 1 查看初始化的 Spring soot 新项目 21 21 . 2 Spring Boot 项目构建过程解析 24 2 . 2 使川起步依赖, 27 2 . 2 . 1 指定基于功能的...
3 小结 18 第 2 章开发第一个应用程序 19 2 . 1 运用 Spring Boot 19 2 . 1 . 1 查看初始化的 Spring soot 新项目 21 21 . 2 Spring Boot 项目构建过程解析 24 2 . 2 使川起步依赖, 27 2 . 2 . 1 指定基于功能的...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程...