在“JBoss Seam+ExtJS”项目中使用Groovy代替Java

阅读了《Groovy In Action》一书,做了网上调研,经历了最初的FUD(Fear, uncertainty, doubt )过程,最终决定使用Groovy代替Java来写JBoss Seam组件。

 

本文是近一个月来, 使用Groovy编程的几点粗浅的体会。最后展示了一些Groovy源代码。

 

1.好处

 

(1)代码变得非常简洁,能够直接把程序的意图表现出来。同样的功能,很难想象再回到Java去编程。

(2)闭包(Closure)的使用,大大简化了某些算法,尤其是集合操作,开发效率大为提高。

(3)可以用JavaScript的感觉去写Groovy程序,因为两者都属于动态类型语言。

 

2.不便之处

 

(1)Groovy Eclipse Plugin的当前版本(2008-01-03发表)的编译速度还比较慢,功能上太弱。希望在未来的几个月中,这种情况能得到改变。

(2)编译阶段,对方法名引用错误,或者方法传递参数的错误,不再提示,要等到运行时才能发现。

(3)GlassFish中检测不到Groovy编写的类的修改,无法获得自动加载的热部署好处。 

 

3.不确定之处

 

(1)是否会影响到整个后台程序的运行速度?

(2)是否能被开发团队中其他成员接受和欢迎? 

 

4.Groovy代码展示1:Hibernate实体类

package com.divo.app.domain

import javax.persistence.*
import org.jboss.seam.annotations.*

//网格视图-用户版本
@Entity
@Name("app.myGridView")
@Table(name="app_MyGridView",uniqueConstraints = [
   @UniqueConstraint(columnNames =
   ["viewId", "userId"] )
])
class MyGridView {
    
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE, generator="appNextId")
    @TableGenerator(name="appNextId", table="app_NextId", allocationSize=1)
    Long id
    
    @Column(nullable=false)
    Long userId
    
    @Column(nullable=false)
    Long viewId
    
    @Column(nullable=false,length=4000)
    String viewState
	
}
//EOP

 

 

5.Groovy代码展示2:作为JBoss Seam组件的服务类

package com.divo.app.service

import org.hibernate.*

import org.jboss.seam.annotations.*
import org.jboss.seam.security.*

import com.divo.app.domain.*
import com.divo.core.misc.*
import com.divo.core.util.*

@Name("app.appInfoService")
@AutoCreate
class AppInfoService extends BaseService {

    String appInfoFileName
    
    def getAppInfo() {
	    def dir = appInfoFileName?"":AppUtil.getRootDir() 
	
	    def s = Constants.FILE_SEPARATOR
	    def fileName = appInfoFileName?appInfoFileName:"app${s}version.txt"
	    def file = new File(dir+fileName)
	    def appInfo = new AppInfo() 
		
	    def count = 0
	    file.splitEachLine(/\,/){
		    if (it.size()>1 && count>0) {
				appInfo.version = it[0]
				appInfo.buildId = it[1]
				appInfo.copyright = it[2]
				appInfo.productName = it[3]
				appInfo.isDebug = (it[6]=="Y" || it[6]=="y")
		    }
		    count++
	    }	    
	   appInfo.currentDate = DateTimeUtil.getNowDate()
	   appInfo.contextPath = appInfoFileName?"":AppUtil.getContextPath() 
	   appInfo
    }
    
}
//EOP
  

6.Groovy代码展示3:单元测试类

 

package com.divo.app.service.test

import org.testng.annotations.*
import com.divo.app.service.*
import com.divo.core.util.*
import com.divo.core.misc.*

class AppInfoServiceTest extends AppTestCase {

    def _service
    
    @BeforeClass
    @Override
    void init() {
        super.init()
        
        _service = new AppInfoService()
    }
   
    @BeforeMethod
    @Override
    void begin() {
        super.begin()
        
        _service.setSession(session)
    }
    
    @Test 
    void canGetAppInfo() {
	    _service.appInfoFileName = "test//version.txt"  
	    def appInfo = _service.getAppInfo()
	    def currentDate = DateTimeUtil.getNowDate()	    
	    
	    assert appInfo.version=="2.0.0-b1"
	    assert appInfo.buildId=="2008020112"
	    assert appInfo.copyright=="fzx"
	    assert appInfo.productName=="软件问题跟踪系统"
	    assert appInfo.currentDate==currentDate
    }
    
}
//EOP
 

 

 

 

你可能感兴趣的:(java,Hibernate,jboss,groovy,seam)