waterye

Groovy快速入门

Groovy is an agile dynamic language for the Java 2 Platform that has many of the features that people like so much in languages like Python, Ruby and Smalltalk, making them available to Java developers using a Java-like syntax.

groovy资源
Official Site: http://groovy.codehaus.org/
JIRA: http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242
Confluence:  http://docs.codehaus.org/display/GROOVY/Home
Founder's blog: http://radio.weblogs.com/0112098/
Project Manager's blog: http://glaforge.free.fr/weblog/

使用IDEA的用户, groovyj非常方便, 不用设定groovy_home, 将jar加入classpath等麻烦事

1. groovy string

def h = 'hello'
def gs 
= """${h}:
Java,
Python,
Ruby
"""

println h[
4..0]
println gs


2. groovy beans

class Customer {
    @Property Integer id
    @Property String name
}


def customer 
= new Customer(id:6, name:"Water Ye")
println 
"Hello: ${customer.name}"


//含有只读或只写属性的Bean:
class Foo {
    
// read only property
    private String name
    
public String getName() return name }

    
// read only property with protected setter
    @Property Integer amount
    
protected void setAmount(Integer amount) this.amount = amount }

    
// dynamically typed property
    def cheese
}

3. Groovy Collections
List:
def list 
= ['Java''Python''Ruby']
for (i in list) { println i } 
list.each 
{ item | println "${item}" }

Ranges:
def range 
= 1..10
for (i in range) { println i }

Map:
def map 
= ["id":6"firstName":"Water""lastName":"Ye"]
println map.
get("id"+ "" + map["firstName"+ " " + map.lastName


4. Groovy Closures
Closure(闭包): Closures are a powerful way of passing around blocks of executable code. Think of closures as being like anonymous inner classes in Java that have only a single (anonymous) method.

int x, y;
= 2;
// create closure and assign it to variable C
def c = {numberToSquare -> numberToSquare * numberToSquare }
= c.call(x)    // y == 4

5. GPath
import org.codehaus.groovy.sandbox.util.XmlSlurper


def xmlStr 
= """
<a>
<b id="b1" name="bn1">
<c id="c1">c1</c>
</b>
<b id="b2" name="bn2">
<c id="c2" >c2</c>
</b>
</a>
"""
def node = new XmlSlurper().parseText(xmlStr)
// 遍历所有b结点
def bs = node.b
for (b in bs)
    println 
"b: id = " + b['@id'+ ", name = " + b['@name']
// 查找c2 
def c = node.b.c.find { it['@id'== 'c2' } 
if (c != null)
    println c.text()

// 缺点:没有getParent(), 丑陋的解决方法
def b = null
def bs 
= node.b
for (t in bs) {
    def c 
= t.c.find { it['@id'== 'c2' } 
    
if (c != null{
        b 
= t
        
break
    }

}
说明: 江南白衣已实现getParent()

6. groovy builder
import groovy.xml.*
import java.io.
*

def writer 
= new StringWriter()
def builder 
= new MarkupBuilder(writer)
builder.person() 
{
    name(first:
"Water", last:"Ye"{
        id(
"006")
        age(
"25")
        gender(
"male")
        email(
"ychunshui@yahoo.com.cn")
    }

}

println writer.toString()
输出结果:
<person>
  
<name first='Water' last='Ye'>
    
<id>006</id>
    
<age>25</age>
    
<gender>male</gender>
    
<email>ychunshui@yahoo.com.cn</email>
  
</name>
</person>

7. Groovlets
// index.groovy 
import java.util.Date
import groovy.xml.MarkupBuilder
if (session.counter == null{
      session.counter 
= 1
}

html 
= new MarkupBuilder(out)
html.html 
{
  head 
{
      title(
"Groovy Servlet")
  }

  body 
{
    p(
"Hello, ${request.remoteHost}: ${session.counter}! ${new Date()}")
  }

}

session.counter 
= session.counter + 1
<!-- web.xml -->
<servlet>
<servlet-name>Groovy</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet> 

<servlet-mapping>
<servlet-name>Groovy</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>

8. groovy ant task
<taskdef name="groovy" 
         classname
="org.codehaus.groovy.ant.Groovy"
         classpathref
="my.classpath"/>
<groovy>
  println("Hello World")
</groovy>

9. groovy sql
import groovy.sql.Sql

def sql 
= Sql.newInstance(url, user, password, driver)
def sql 
= new Sql(dataSource)
def sql 
= new Sql(connection)

sql.eachRow(
"select * from person"{ row |
    println row.id 
+ " " + row.name
}


def goods 
= sql.dataSet('GOODS')
def material 
= goods.findAll { it.type == 'M' }
material.each 
{ println "name: ${it.name}" }

sql.execute(sqlStr) 
sql.executeUpdate(sqlStr)

sql.call(sqlStr) 
// 调用过程

sql.rollback()
sql.commit()

sql.close()

注意: 使用groovyj的话, 变量不要和文件名相同, 否则出错

posted on 2005-08-22 21:52 waterye 阅读(880) 评论(1)  编辑  收藏 所属分类: groovy

Feedback

# re: Groovy快速入门 2005-08-25 12:36 江南白衣@ITO

对阿,xml支持parent()了,但提交上去后N久都还没有加入正式代码,大家要的找我。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问