随着Groovy 1.1 beta版和新版Java 5注解的支持推出,我们能否在Groovy中编写Seam应用程序呢?确实很棒,您可以使用JBoss Seam(在写作时CVS HEAD)这样做。
支持哪些内容,它是如何工作的?
您可以使用Groovy编写任何实体和任何操作。只需在Groovy类上使用Seam注解,它们就变成了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])
}
}
顺便说一句,您可以使用Groovy来编写您的实体,Hibernate会自动支持它们。没有约束,没有限制,没有XML ;-)
@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文件由构建系统中的groovyc编译器编译;然后它们对容器来说就像普通类一样。
让它更加Groovy
让我们更进一步,当Seam处于开发模式时,.groovy文件可以不涉及groovyc构建时编译而直接部署。就像热重部署的Java Seam组件一样,将您的.groovy文件复制到WEB-INF/dev目录。
无需重新启动应用程序(更不用说容器了):下一次请求将透明地重新加载Groovy类,提供一个相当平滑的开发环境。快速开发时间,快速部署时间。
目前此模式仅限于Seam JavaBean组件:EJB 3.0会话豆和实体(尚不支持)热重部署。我们正在考虑增强JBoss EJB 3容器以消除这一限制(尽管在其他容器中您仍将遇到这一限制)。
如何设置它?
使用seam-gen,您可以在一分钟内生成一个支持Groovy的开发环境。
./seam setup # use project type WAR, the rest is at your will ./seam new-project # that's it
然后您就完成了,您可以在以下任一位置编写.groovy代码src/model或src/action请记住,在Seam开发模式下,当您更改(无论是Groovy还是Java)代码时,无需重新启动应用程序。src/action(./seam explode(复制Groovy文件)即可完成。
要查看一个完整的Groovy项目,请参阅JBoss Seam示例中的groovybooking项目(撰写时为CVS HEAD)。
此功能(已在CVS HEAD中可用)预计将在下一个主要JBoss Seam版本中推出:我们还有很多惊喜等着你 :-)
注意:如果您对Groovy感兴趣,并且今晚在旧金山,不要错过G2One ,如果您有任何问题,我会在那里。