- 浏览: 5179125 次
- 性别:
- 来自: 天津
-
博客专栏
-
-
实战 Groovy
浏览量:29481
文章分类
- 全部博客 (639)
- 代码之谜 (6)
- JavaScript quirks (5)
- 程序员 (92)
- Java (93)
- BT编程 (7)
- html/css (64)
- Groovy&Grails (42)
- Android (20)
- C/C++ (5)
- PHP/Perl/Python (46)
- 经典文章 (51)
- CodeIgniter (14)
- JQuery (10)
- 笑话 (4)
- 其他 (32)
- javascript (69)
- 云计算 (0)
- html5 (7)
- 面试 (8)
- google (3)
- nosql (2)
- nodejs (11)
- go (5)
- erlang (1)
- 小常识 (3)
- 冷知识 (5)
- database (4)
- web (12)
- 架构 (12)
- Exception (0)
最新评论
-
jqw1992:
https://www.chromefor.com/libra ...
[福利] 开发者必备的 Chrome 插件——ChromeSnifferPlus -
litjerk:
初步算了一下,目前最最精简的Win98版是5M,他5个小时多敲 ...
让人目瞪口呆的三位世界级电脑大师 -
379855529:
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的 ...
Java NIO与IO的详细区别(通俗篇) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
一步步开发 Spring MVC 应用 -
匡建武:
Good
四个程序员的一天
Groovy 生成器让您能够利用诸如 Swing 这样的框架来模拟标记语言(如 XML、HTML、Ant) 任务以及 GUI。它们对于快速原型化非常有 用,并且正像 Andrew Glover 这个月在“实战 Groovy”专栏中向您展示的那样,当您马上需要可消费的标记时,它们是数据绑定框架的一种便利的替代方案。
几个月前,当我最初撰写有关 实战 Groovy: 用 Groovy 进行 Ant 脚本编程 的文章时,我提及了 Groovy 中的生成器 概念。在那篇文章里,我向您展示了,使用一个叫做 AntBuilder
的 Groovy 类,构建富有表现力的 Ant 构建文件是多么容易。本文中,我将深入 Groovy 生成器的世界,向您展示您还能用这些强大的类做些什么。
Groovy 生成器让您能够利用诸如 Swing 这样的框架来模拟标记语言(如 XML、HTML、Ant) 任务以及 GUI。使用生成器,您可以迅速地创 建复杂的标记(如 XML),而无须理会 XML 本身。
生成器的范例非常简单。生成器的实例的方法表示该标记(如 HTML 中的 <body>
标 签)的元素。方法的创建于闭包中的对象表示子节点(例如,<body>
标签中所包含的 <p>
标签)。
为了便于您查看这一过程,我将创建一个简单的生成器,以程序方式来表示一个具有清单 1 所示结构的 XML 文档。
<person> <name first="Megan" last="Smith"> <age>32</age> <gender>female</gender> </name> <friends> <friend>Julie</friend> <friend>Joe</friend> <friend>Hannah</friend> </friends> </person> |
要表示这个结构非常简单。首先将 person
方法连接到生成器实例,现在它表示 XML 的根节点,即 <person>
。要创建子节点,我创建一个闭包并声明一个名叫 name
的新对象(它接收 map
形式的参数。顺便说一下,这些参数是元素的属性的基础。
接下来,在 name
对象中,将两个附加对象连接到闭包,一个对象是 age
,另 一个是 gender
,它们对应于 <name>
的类似子元素。您明白其中的诀窍了么?确实很简单。
<friends>
元素是 <person>
的兄弟元素,于是我跳出这个闭包,声明了一个 friends
对象,当然,还附加了一个集合了多个 friend
元素的闭包,如清单 2 所示。
import groovy.xml.* import java.io.* class XMLBuilder{ static void main(args) { writer = new StringWriter() builder = new MarkupBuilder(writer) friendnames = [ "Julie", "Joey", "Hannah"] builder.person() { name(first:"Megan", last:"Smith") { age("33") gender("female") } friends() { for (e in friendnames) { friend(e) } } } println writer.toString() } } |
如您所见,这里的 Groovy 表示非常优雅,且易于映射到相应的标记表示。在底层,Groovy 显然在处理烦人的标记元素(如 < and >),使我们可以将更多精力放在内容上,而不必过分在意结构的细节。
生成器也可以有助于构建 HTML,这在开发 Groovlet 时可以派上用场。如同小菜一碟,假设我要创建一个如清单 3 所示的 HTML 页面。
<html> <head> <title>Groov'n with Builders</title> </head> <body> <p>Welcome to Builders 101. As you can see this Groovlet is fairly simple.</p> </body> </html> |
我可以轻易地将它编码在 Groovy 中,清单 4 所示。
import groovy.xml.* import java.io.* class HTMLBuilderExample{ static void main(args) { writer = new StringWriter() builder = new MarkupBuilder(writer) builder.html(){ head(){ title("Groov'n with Builders"){} } body(){ p("Welcome to Builders 101. As you can see " + "this Groovlet is fairly simple.") } } println writer.toString() } |
来点有意思的,让我们再看看用生成器建立一个成熟的 GUI 有多么容易。前面我曾提到过,Groovy 的 SwingBuilder
使它能够以一种极为简单的方式构造 GUI。您可以查阅清单 5 中 SwingBuilder
是如何工作的。
清单 5. Groovy 中的 GUI 生成器真的很“GROOVY”(很“棒”)
import java.awt.FlowLayout import javax.swing.* import groovy.swing.SwingBuilder class SwingExample{ static void main(args) { swinger = new SwingBuilder() langs = ["Groovy", "Ruby", "Python", "Pnuts"] gui = swinger.frame(title:'Swinging with Groovy!', size:[290,100]) { panel(layout:new FlowLayout()) { panel(layout:new FlowLayout()) { for (lang in langs) { checkBox(text:lang) } } button(text:'Groovy Button', actionPerformed:{ swinger.optionPane(message:'Indubitably Groovy!').createDialog(null, 'Zen Message').show() }) button(text:'Groovy Quit', actionPerformed:{ System.exit(0)}) } } gui.show() } } |
图 1 显示了上面的结果,还不错吧?
可以想像,对于原型化,SwingBuilder
是一个多么强大的工具,不是么?
这些例子虽然琐碎,却也有趣。我希望我能让您明白,Groovy 的生成器可以让您避免特定语言(如 XML)中的底层标记。显然,有时避免 XML 或 HTML 会更好,并且,那些标记协助器(facilitator)对 Java 平台来说并不陌生。例如,我最喜欢的 XML 协助框架是 JiBX。
使用 JiBX,您可以轻易地将 XML 结构映射到对象模型,反之亦然。绑定是个强大的范例,有不计其数的类似工具拥有此功能,如 JAXB、 Castor 和 Zeus 等。
绑定框架的惟一缺点是,它们恐怕 要耗费不少时间。幸运的是,您可以使用 Groovy 的生成器作为一个较简单的 解决方案,这在某些情况下是有效的。
假设有一个英文词典的简单数据库。有一个表用于 word
,另一个表用于 definition
,最后还有一个表用于 synonym
。图 2 是这个数据库的简单表示。
如您所见,这个数据库非常直观:word
与 definition
和 synonym
具有一对多的关系。
词典数据库拥有一个消费者,他在寻求一种表示数据库内容的关键方面的 XML 结构。所寻求的 XML 结构如清单 6 所示。
<words> <word spelling="glib" partofspeech="adjective"> <defintions> <defintion>Performed with a natural, offhand ease.</defintion> <defintion>Marked by ease and fluency of speech or writing that often suggests or stems from insincerity, superficiality, or deceitfulness</defintion> </defintions> <synonyms> <synonym spelling="artful"/> <synonym spelling="urbane"/> </synonyms> </word> </words> |
如果选择使用 JiBX 这样的绑定框架来解决这个问题,则很可能需要创建一些中间对象模型,以从关系模型到达最终的 XML 模型。然后必须将数据库内容读取到对象模型中,并请求底层框架将其内部的结构编组为 XML 格式。
这一过程内含了将对象结构映射到 XML 格式的步骤(使用所需的框架过程)。某些框架,如 JAXB,实际上是从 XML 和其他框架(如 JiBX )生成 Java 对象,允许您自定义自己的 Java 对象到 XML 格式的映射。总之,这都需要大量的工作。
并且,这是一项宏伟的计划。我并不提倡避免使用绑定框架。这里,我要声明:我已经预先警告过您。我计划向您展示的是一个生成 XML 的便捷方式。
使用 Groovy 的 MarkupBuilder
,结合新的数据库访问框架 GroovySql,您可以轻易地生成可消费的 XML。您 所要做的只是计算出所需的查询,并将结果映射到生成器实例 —— 然后,您马上就可以得到表示词典数据库内容的 XML 文档。
让我们逐步来了解这一过程。首先,创建一个生成器实例,在本例中是 MarkupBuilder
,因为您想要生成 XML。最外面的 XML 元 素(也就是“根”)是 words
,这样就创建了一个 words
方法。在闭包里, 调用第一个查询,并在迭代中将查询结果映射到 word
子节点。
接着,通过两个新的查询,创建 word
的两个子节点。创建一个 definitions
对象,并在迭代中映射它,接着用同样的方法处理 synonyms
。
import groovy.sql.Sql import groovy.xml.MarkupBuilder import java.io.File import java.io.StringWriter class WordsDbReader{ static void main(args) { sql = Sql.newInstance("jdbc:mysql://localhost/words", "words", "words", "org.gjt.mm.mysql.Driver") writer = new StringWriter() builder = new MarkupBuilder(writer) builder.words() { sql.eachRow("select word_id, spelling, part_of_speech from word"){ row | builder.word(spelling:row.spelling, partofspeech:row.part_of_speech){ builder.definitions(){ sql.eachRow("select definition from definition where word_id = ${row.word_id}"){ defrow | builder.definition(defrow.definition) } } builder.synonyms(){ sql.eachRow("select spelling from synonym where word_id = ${row.word_id}"){ synrow | builder.synonym(synrow.spelling) } } } } } new File("dbouuput.xml").withPrintWriter{ pwriter | pwriter.println writer.toString() } } } |
这里,我向您展示的绑定解决方案似乎简单得让人难以置信,特别是以 Java 纯化论者的观点看来更是如此。尽管该解决方案不比使用绑定框架(如 JABX 和 JiBX) 更好,但它确实更快一些 —— 而且,我主张使用这样较简单的方法。是不是我在简单的 Java 代码中做一些类似的事情?是的,但我敢肯定,某些时候我也不得不处理 XML。
用 Groovy 生成器进行开发的速度和简易性,在调用标记的时候可大显神威。例如,就像在第二个例子里展示的那样,我可以马上加快数据库的 XML 表示。对于原型化,或者当需要以最少的开发时间和精力来产生可工作的解决方案时,生成器也是一个不错的选择。
在下个月的实战 Groovy 中我会讲些什么呢?哦,当然是在 Java 语言中使用 Groovy!
发表评论
-
实战 Groovy: 用 Groovy 打造服务器端
2010-07-10 11:07 2742Groovlet 和 GroovyServer P ... -
实战 Groovy: for each 剖析
2010-07-10 11:07 18224在这一期的 实战 Groovy 中,Scott Davi ... -
实战 Groovy: 用 Groovy 进行 Ant 脚本编程
2010-07-10 11:07 2076Ant 和 Maven 两者在构建处理工具的世界中占统 ... -
实战 Groovy: 在 Java 应用程序中加一些 Groovy 进来
2010-07-10 11:06 4354您有没有想过在自己相对复杂的 Java 程序中嵌入 G ... -
实战 Groovy: Groovy 的腾飞
2010-07-10 11:06 2208随着 Groovy JSR-1(及其后续发行版本)的发 ... -
实战 Groovy: 用 curry 过的闭包进行函数式编程
2010-07-10 11:06 3272在 Groovy 中处处都是闭包,Groovy 闭包惟 ... -
实战 Groovy: 关于 MOP 和迷你语言
2010-07-10 11:06 2085将耳朵贴到地上仔细听 —— MOP 正在前进!了解一下 ... -
实战 Groovy: 用 Groovy 更迅速地对 Java 代码进行单元测试
2010-07-10 11:06 2313不久以前,developerWor ... -
实战 Groovy: 构建和解析 XML
2010-07-10 11:05 7164通过本文,您将了解 ... -
实战 Groovy: 用 Groovy 进行 JDBC 编程
2010-07-10 11:05 5211这个月,随着 Andrew G ... -
实战 Groovy: 美妙的操作符
2010-07-10 11:05 2299Java™ 取消了操作符重载,但是新兴的 Groovy ... -
实战 Groovy: 使用 Groovy 模板进行 MVC 编程
2010-07-10 11:04 2942视图是 MVC 编程的一个重要部分,而 MVC 编程本 ... -
实战 Groovy: 用 Groovy 减少代码冗余
2010-07-10 11:04 2075Groovy 简洁的语法将 ... -
实战 Groovy: Groovy:Java 程序员的 DSL
2010-07-10 11:04 3089Groovy 专家 Scott Davis 将重新开始 ... -
精通 Grails: 构建您的第一个 Grails 应用程序
2010-07-06 09:37 1659Java™ 程序员不需要 ... -
Grails 部署
2010-07-06 09:36 6090部署 Grails可以使用很多种方式来部署,每一种 ... -
Grails 脚手架
2010-07-05 08:20 4089脚手架 根据指定的领域类,脚手架为你自动生成 ... -
Grails Grails 与 Hibernate
2010-07-05 08:19 2710Grails 与 Hibernate 如果 GOR ... -
Grails Grails和 Spring
2010-07-05 08:19 7937Grails和 Spring 这一节适合于高级用户 ... -
Grails Web服务
2010-07-05 08:19 3971Web服务 Web服务就是让你的web应用提供一套 ...
相关推荐
### IBM实战Groovy知识点概览 #### 一、Groovy简介 **Groovy**是一种运行在Java平台上的灵活且强大的编程语言,它以其简洁、高效和面向对象的特点著称。Groovy是由James Strachan和Bob McWhirter创建的,并在2004年...
- **使用Soot优化Groovy字节码**:介绍了如何使用Soot工具优化Groovy生成的字节码。 #### 三、Groovy社区和贡献指南 Groovy不仅拥有强大的官方支持,还有活跃的社区。Groovy官方网站还提供了以下资源: - **社区...
在本项目中,Groovy可能被用作ANTLR4生成的解析器和词法分析器的实现语言,或者用于构建编译器的其他组件,如语义分析器、优化器和代码生成器。Groovy的简洁语法和强大的元编程能力可以简化编译器的编写工作,提高...
4. `@NonNull`: 标记字段为非空,Lombok会在setter方法或构造函数中添加null检查,并在字段赋值时抛出`NullPointerException`。 5. `@ToString`: 生成覆盖`toString()`方法,返回包含所有字段值的字符串。 6. `@...
2.3.3 生成器(builder) 2.4 本章小结 第3章 grails工程基础架构 3.1 grails工程结构 3.2 grails和mvc模式 3.2.1 mvc中的模型(m) 3.2.2 mvc中的视图(v) 3.2.3 mvc中的控制...
《使用JUnit5进行Android测试详解》 随着Android开发的不断进化,测试框架也在持续更新以适应新的需求。JUnit5作为最新一代的JUnit测试框架,带来了许多改进和新特性,为开发者提供了更强大的测试能力。本文将详细...