groovy中的?.是什么意思
params?.email
就是参数email的意思
param
[释义] 参数;
[网络] 氰胍;
[例句]The fourth param here is an array of options.
第四个参数是一个选项数组。
相关单词:
PARAM abbr. parametrical 参数的,参量的
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。
单词seal是什么意思?
seal 主要有两个意思
1、海豹-名词词性
可以看到这个词的词首是sea- 海里面的动物 海豹
2、印章、火漆、密封
首先有个同源词conceal 意思是全部隐藏 con-是共同的 全部的
-ceal意思是隐藏
词缀 -ceal和-seal发音是一样的 有隐藏的意思
引申出第一个意思 密封 (名词和动词含义)
从密封引申的第二个意思 火漆 就是用烧软了的漆蜡 盖在信封上面把信封密封起来
火漆 实则也是一种印章 一般是个人姓名 机构 家族标记等等 所以引申出来第三个含义 印章
不知道这么解释是不是容易记忆?
单词groovy是什么意思
groovy 英[ˈgru:vi] 美[ˈɡruvi]
adj. 绝妙的; 槽的,沟的; 流行的; 最佳状态的;
[例句]Once again, I am taking advantage of the seamless integration between the Java language and Groovy.
我再次利用了Java语言和Groovy之间的无缝集成。
[其他] 比较级:groovier 最高级:grooviest
什么是 Groovy
● 是一个基于 Java虚拟机的敏捷 动态语言。● 构建在强大的Java语言之上 并 添加了从Python,Ruby和Smalltalk等语言中学到的 诸多特征。●为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低(几乎为零)。● 支持DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让你的代码变得易于阅读和维护。● Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变的非常简单。● 在开发Web,GUI,数据库或控制台程序时 通过 减少框架性代码 大大提高了开发者的效率。● 支持单元测试和模拟(对象),可以 简化测试。● 无缝集成 所有已经存在的 Java对象和类库。● 直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。Groovy 的一个好处是,它的语法与 Java 语言的语法很相似。虽然 Groovy 的语法源于 Smalltalk 和 Ruby 这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。(在这点上,Ruby 与 Groovy 不同,因为它的语法与 Java 语法差异很大。)Groovy 快捷方式 开始使用 Groovy 时,您会发现它使日常的编程活动变得快了许多。完成本教程之后,您会了解更多的 Groovy 语法快捷方式。不过现在只需知道以下这些要点:Groovy 的松散的 Java 语法允许省略分号和修改符。除非另行指定,Groovy 的所有内容都为 public。Groovy 允许定义简单脚本,同时无需定义正规的class 对象。Groovy 在普通的常用 Java 对象上增加了一些独特的方法和快捷方式,使得它们更容易使用。Groovy 语法还允许省略变量类型。Groovy 的新增特性 虽然Groovy 允许省略 Java 语法中的一些元素,但也增加了一些新特性,例如本地集合、内置的正则表达式和闭包。在标准的 Java 代码中,如果想要创建一个项列表,首先要导入java.util.ArrayList,然后程序化地初始化 ArrayList 实例,然后 再向实例中添加项。在 Groovy 中,列表和映射都内置在语法中 — 无需导入任何内容。正则表达式也不需要额外的导入或对象;它们可以通过特殊的 Groovy 语法来创建。关于闭包 对于任何 Java 开发人员来说,闭包都是一个令人兴奋的新技巧。这些神奇的构造将会包含在未来的 Java 发行版(很可能是 Java 7)中,成为正式的 Java 语法,但现在已经可以在 Groovy 中使用了。可以将闭包 想像为一个代码块,可以现在定义,以后再执行。可以使用这些强大的构造做许多漂亮的事,不过最著名的是简化迭代。使用 Groovy 之后,就有可能再也不需要编写Iterator 实例了。动态的 Groovy 从技术上讲,Groovy 可能是您最近听说过的类型最松散的动态语言之一。从这个角度讲,Groovy 与 Java 语言的区别很大,Java 语言是一种固定类型语言。在 Groovy 中,类型是可选的,所以您不必输入String myStr = "Hello"; 来声明 String 变量,可以使用def myStr = "Hello";(分号可有可无)。除此之外,Groovy 代码还能在运行时轻松地改变自己。这实际上意味着,能够在运行时轻松地为对象指定新方法和属性。这一编程领域称为元编程,Groovy 能够很好地支持这种编程方式。在学习本教程的过程中,您将了解到关于 Groovy 的动态性质的更多内容。现在惟一要补充的是,您会惊讶地发现,在 Groovy 会使操作 XML 或普通的 java.io.File 实例变得非常轻松。一体两面 用Groovy 编写的任何内容都可以编译成标准的 Java 类文件并在 Java 代码中重用。类似地,用标准 Java 代码编写的内容也可以在 Groovy 中重用。所以,可以轻易地使用 Groovy 为 Java 代码编写单元测试。而且,如果用 Groovy 编写一个方便的小工具,那么也可以在 Java 程序中使用这个小工具。Groovy是用Java实现的开源脚本语言并且和它联系紧密.它需要JDK 1.4. Groovy向Java添加了许多Ruby和Python脚本语言的特性. Groovy的特性包括动态类型(dynamic typing), 闭包(closures),简单对象导航( easy object navigation)和更加简洁的Lists和Maps语法.Groovy是由James Strachan和Bob McWhirter创造的. James还参与了许多其他开源项目的开发,其中包括Jelly, dom4j, Jaxen, Betwixt和Maven. Bob是Jaxen和Drools (一个开源的面向对象的JAVA规则引擎) 的创始人.目前最新稳定版为Groovy1.8。
单词groovy是什么意思?
什么是 Groovy? Groovy 是 JVM 的一个替代语言 —替代是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。目前的 Groovy 版本是 1.6.3,在 Java 1.4 和 Java 5 平台上都能使用,也能在 Java 6 上使用。 Groovy 的一个好处是,它的语法与 Java 语言的语法很相似。虽然 Groovy 的语法源于 Smalltalk 和 Ruby 这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。(在这点上,Ruby 与 Groovy 不同,因为它的语法与 Java 语法差异很大。) Groovy 的一个好处是,它的语法与 Java 语言的语法很相似。虽然 Groovy 的语法源于 Smalltalk 和 Ruby 这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。(在这点上,Ruby 与 Groovy 不同,因为它的语法与 Java 语法差异很大。) 许多 Java 开发人员非常喜欢 Groovy 代码和 Java 代码的相似性。从学习的角度看,如果知道如何编写 Java 代码,那就已经了解 Groovy 了。Groovy 和 Java 语言的主要区别是:完成同样的任务所需的 Groovy 代码比 Java 代码更少。(有时候会少很多!)
groovy语言主要是用来干什么,和JAVA的区别是什么
先说区别吧:java是编译性语言,就是得编译后才能运行。groovy语言是动态语言。
Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。
Groovy 的一个好处是,它的语法与 Java 语言的语法很相似。虽然 Groovy 的语法源于 Smalltalk 和 Ruby 这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。(在这点上,Ruby 与 Groovy 不同,因为它的语法与 Java 语法差异很大。)
java程序员为什么使用Groovy
1.Groovy可以兼容java。 是的,你可以用java语法来编写groovy,最后还可以生成class文件,直接用java调用。你会说,这有什么好的,不就是改了个后缀名么?呕,也许吧…但是它的亮点当然不是这个,它的亮点是你可以在Groovy里面直接用java语法混搭写,当然不是很推荐这样做的。2.Groovy是动态的。不需要java的反射,不需要冗长的代码,不需要各种try catch 异常,你就可以实现各种神奇的事情。Groovy的class可以这样新增一个方法,或者调用它。3.Groovy是一把瑞士军刀。java是一把基础工具,等你需要的时候,你需要到处去找jar包,来填充自己的程序,而且你需要看API去弄懂各种使用。此外,java的编写实在是太冗长了,为了打印一个HelloWorld,你需要编写class, 写一个main函数。对于Groovy来说:print “hello world!”.这一句就足够了,这只是开始…
java程序员为什么使用Groovy
一直听说java世界里有个Groovy,但是一直没时间去了解它究竟是一个怎么样子的。我们现在的项目里放了很多开源包,而且项目中做流程的时候,规则就是用Groovy实现的。近来闲来无事,于是开始认真的看看Groory究竟有什么好的。其实最初我接触它是因为Grails这一个框架,这两个都是为了实现一个目的,java的敏捷开发,与java的无缝对接。在某些情况下,java需要半天处理的事情,Groovy只需要几分钟,是的,几分钟…剩下来的时间,程序员终于有时间泡妹子了,^_^…….技术宅的兄弟,赶紧来看看吧。
脚本语言,动态语言?难道是javascript一类的?好吧,它的确和javascript有一点像,但是它太强大了,远远超出了javascript能处理的事情。这里不和javascript做比较了,直接来和Java比较吧,看看Groovy能做什么。
Groovy 的网站( http://groovy.codehaus.org ) 给出了 groovy 的最好定义: groovy 是在 java平台上的、 具有象 Python , Ruby 和 Smalltalk 语言特性的灵活动态语言, groovy 保证了这些特性象 java 语法一样被 java 开发者使用。 而且学习Groovy对javaer来说,是很容易的一件事情。如果你还没有开始学Ruby,来吧,和我一起来Groovying一下…………而且附带一个Grails来媲美Ruby on rails。
1.Groovy可以兼容java。
是的,你可以用java语法来编写groovy,最后还可以生成class文件,直接用java调用。你会说,这有什么好的,不就是改了个后缀名么?呕,也许吧…但是它的亮点当然不是这个,它的亮点是你可以在Groovy里面直接用java语法混搭写,当然不是很推荐这样做的。
2.Groovy是动态的。
不需要java的反射,不需要冗长的代码,不需要各种try catch 异常,你就可以实现各种神奇的事情。Groovy的class可以这样新增一个方法,或者调用它。
//用闭包定义一个方法 var1为参数 ,->后面是执行语句(当然参数不是必须的)
def methodA={var1-> print "this is methodA"}
//用闭包定义一个方法 var1为参数 ,->后面是执行语句(当然参数不是必须的)
def methodB={var1-> print "this is methodB"}
String.metaClass.addMethodA=methodA; //将methodA绑定为成员方法。
String.metaClass.'static'.addMethodB=methodB; //将methodB绑定为静态方法
String s="str";
s.addMethodA('good'); //实例调用方法A
String.addMethodB('hello'); //静态类调用方法B
以上的代码将两个方法添加到了String class里面(天哪,final的String 也被攻破了),然后分别用实例对象调用addMethodA,静态类调用AddMethodB.
3.Groovy是一把瑞士军刀。
java是一把基础工具,等你需要的时候,你需要到处去找jar包,来填充自己的程序,而且你需要看API去弄懂各种使用。此外,java的编写实在是太冗长了,为了打印一个HelloWorld,你需要编写class, 写一个main函数。对于Groovy来说:print “hello world!”.这一句就足够了,这只是开始…
通过 groovy 你能快速的打开控制台, 通过输入如下代码来输出所有的文件名 ( 递归处理 ) :
groovy -e "new File('.').eachFileRecurse { println it }"
即使 java 有一个名称为 eachFileRecurse 的方法和一个 FileListener 的接口,你仍旧需要显示的创建一个类, 声明一个 main 方法, 保存源代码到一个文件中, 并且编译它, 然后你才能运行它, 基于比较, 我们来看看 java 做相同工作的代码, 我们假设存在单独的 eachFileRecurse 方法:
public class ListFiles { // JAVA !!
public static void main(String[] args) {
new java.io.File(".").eachFileRecurse( // 假设 java 存在该方法
new FileListener() {
public void onFile (File file) {
System.out.println(file.toString());
}
}
);
}
好吧,下载一本好书《Groovy in Action[文字版][中文].pdf》,现在开始学习Groovy吧。
求百变小樱魔术卡第一部片尾曲(日文的)
歌名为FRUITS CANDY
那个“嘀嗒”为“Tip Tap”
摁。。以下附上歌词
每一句话的顺序为:
日文歌词
罗马拼音(部分大写字母为片假名读音)
中文歌词
歌词我修改过了
因为网上找的的歌词有点错误。。
如果想要这首歌
可以留下邮箱
我发给你
-----------------------
『FRUITS CANDY』
「カードキャプターさくら」ED3
歌 こじまめぐみ
作词 横山 武
作曲 上田晃司
编曲 保刈久明
歌词:
Tip Tap 恋はいつだってCANDY
Tip Tap koi wa itsu datte CANDY
Tip Tap 爱情就像CANDY
フルーツのようにTasty
FURUUTSU no you ni Tasty
像水果般甜蜜Tasty
Good Luck そうね 毎日がSUNDAY
Good Luck sou ne mainichi ga SUNDAY
Good luck没错 天天都是SUNDAY
あわてないで My Heart
awatenai de My Heart
别慌呀 My heart
雨上がりの街へと出かけよう
ame agari no machi e to dekakeyou
到雨后的街道走走吧
バブルガムと好奇心をふくらませ
BABURUGAMU to koukishin o fukuramase
鼓起泡泡糖和好奇心
水たまりに映った blue blue sky
mizutamari ni utsutta blue blue sky
映入水塘的blue blue sky
涙もきっと
namida mo kitto
泪水也一定能
乾くよ jelly bean
kawaku yo jelly bean
拭乾 jelly bean
Ah パステルの阳射しに
Ah PASUTERU no hizashi ni
Ah 粉蜡笔的阳光
幸せもアクビしてる
shiawase mo AKUBI shiteru
让幸福也打起呵欠
ゆっくりと歩きましょ
yukkuri to arukimasho
悠闲地去散散步
Ah… Tip Tap まるで梦见るCANDY
Ah… Tip Tap marude yume miru CANDY
Ah……Tip Tap如梦似幻的CANDY
頬张ればすぐにHappy
hoobareba sugu ni Happy
张开大口吃下立刻Happy
Good-bye とてもU2なMONDAY
Good-bye totemo U2 na MONDAY
Good-bye非常U2的MONDAY
あせらないで My Dream
aseranaide My Dream
别急呀 My Dream
悩み事はベリーのジャムつけて
nayamigoto wa BERII no JAMU tsukete
烦恼的事就沾著果酱
少し冷めたミルクティーで饮みほそう
sukoshi sameta MIRUKUTII de nomihosou
和著有点冷掉的奶茶一饮而尽
ウインクする夜空のShinin' Star
UINKU suru yozora no Shinin' Star
夜空的Shinin Star一闪一闪
天使が游ぶ
tenshi ga asobu
彷佛天使玩耍的
ビー玉みたい
BII dama mitai
玻璃弹珠
Ah カラフルな気分で
Ah KARAFURU na kibun de
Ah 怀著绚丽的心情
口ずさむ甘いメロディー
kuchi zusamu amai MERODII
哼唱甜美的旋律
フィルムが回り出す
FUIRUMU ga mawaridasu Ah…
往事历历浮现眼前 Ah ...
Tip Tap 恋はいつだってCANDY
Tip Tap koi wa itsu datte CANDY
Tip Tap 爱情就像CANDY
フルーツのようにTasty
FURUUTSU no you ni Tasty
像水果般甜蜜Tasty
Good Luck そうね 毎日がSUNDAY
Good Luck sou ne mainichi ga SUNDAY
Good luck没错 天天都是SUNDAY
あわてないで My Heart
awatenai de My Heart
别慌呀 My heart
Ah… Tip Tap まるで梦见るCANDY
Ah… Tip Tap marude yume miru CANDY
Ah……Tip Tap如梦似幻的CANDY
頬张ればすぐにHappy
hoobareba sugu ni Happy
张开大口吃下立刻Happy
Good-bye とてもU2なMONDAY
Good-bye totemo U2 na MONDAY
Good-bye非常U2的MONDAY
あせらないで My Dream
aseranaide My Dream
别急呀 My Dream
Tip Tap 恋はいつだってCANDY
Tip Tap koi wa itsu datte CANDY
Tip Tap 爱情就像CANDY
フルーツのようにTasty
FURUUTSU no you ni Tasty
像水果般甜蜜Tasty
Good Luck そうね 毎日がSUNDAY
Good Luck sou ne mainichi ga SUNDAY
Good luck没错 天天都是SUNDAY
あわてないで My Heart
awatenai de My Heart
别慌呀 My heart
求<魔卡少女樱>所有主题曲的罗马拼音....
TV OP3]プラチナ(白金)
プラチナ(白金)
[魔卡少女樱 OP3]
作词:岩里佑穗
作曲/编曲:菅野よう子(菅野阳子)
歌:坂本真绫
日文原文:
I'm a dreamer 潜むパワー
私の世界 梦と恋と不安でできてる
でも想像もしないもの 隠れてるはず
空に向かう木々のようにあなたを
まっすぐ见つめてる
见つけたいなぁ 叶えたいなぁ
信じるそれだけで 越えられないものはない
歌うように奇迹のように
思いがすべてを変えてゆくよ
きっと きっと 惊くくらい
I'm a dreamer 潜むパワー
まだ见ぬ世界 そこで何が待っていても
若しも理想と违っても 恐れはしない
鸟たちは风にのり旅をしゆく
今日から明日へと
伝えたいなぁ 叫びたいなぁ
この世界一つだけの存在である私
祈るのように星のように
小さな光だけど何时かは
もっと もっと 强くなりたい
限界のない可能性がここにある
この出会 Is't gonna be your world
见つけたいなぁ 叶えたいなぁ
信じるそれだけで 越えられないものはない
歌うように奇迹のように
思いがすべてを変えてゆくよ
きっと きっと 惊くくらい
罗马注音:
I'm a dreamer hisomu PAWAA
watashi no sekai
yume to koi to fuan de dekiteru
demo souzou mo shinai mono kakureteru hazu
sora ni mukau kiki no you ni anata o
massugu mitsumeteru
mitsuketainaa kanaetainaa
shinjiru sore dake de
koerarenai mono wa nai
utau you ni kiseki no you ni
"omoi" ga subete o kaete yuku yo
kitto kitto odoroku kurai
I'm a dreamer hisomu PAWAA
mada minu sekai
soko de nani ga matte ite mo
moshimo risou to chigatte mo osore wa shinai
toritachi wa kaze ni nori tabi o shite yuku
kyou kara ashita e to
tsutaetainaa sakebitainaa
kono yo ni hitotsu dake no sonzai de aru watashi
inoru you ni hoshi no you ni
chiisana hikari dakedo itsuka wa
motto motto tsuyoku naritai
genkai no nai kanousei ga koko ni aru kono te ni
It's gonna be your world
mitsuketainaa kanaetainaa
shinjiru sore dake de
koerarenai mono wa nai
utau you ni kiseki no you ni
"omoi" ga subete o kaete yuku yo
kitto kitto odoroku kurai
中文翻译:
I'm a dreamer 隐藏的力量
我的世界 是由梦想与恋爱还有不安组成
但是也有所隐藏那些无法想象的事
就象参天大树
想一直凝视你
想要寻找 想要实现
一直坚信 一切不可能都能超越
像歌唱 像奇迹
思念改变一切
一定一定会让你惊讶
I'm a dreamer 隐藏的力量
还未看清的世界 等待将要发生的事
就算和理想违背 也请不要感到恐惧
鸟儿们乘着风开始旅行
今天开始前往明天而去
想要传递 想要呐喊
世界上唯一存在的我
像祈祷 像星星
只有微小的光芒
变得更加更加坚强
有着没有界限的可能
在这相遇 It's gonna be your world
想要寻找 想要实现
一直坚信 一切不可能都能超越
像歌唱 像奇迹
思念改变一切
一定一定会让你惊讶
Java程序员为什么学习Groovy
正如Groovy对Java很多特性进行的包装优化一样,基于Groovy的HttpBuilder也包裹了HttpClient,使网络编程变得更加的方便易用,下面稍微来用一个例子看一下。
寻找各种依赖的jar包有时候会让我们失去耐心,不过值得庆幸的是我们有Maven和Gradle这样的工具,可以根据配置轻松的帮我们配置好我们需要的数据。下面我们来叙述一下整个过程。
1. 创建文件夹httpbuildertest
2. 创建gradle配置文件,build.gradle,内容如下:
apply plugin: "groovy"
apply plugin: "eclipse"
repositories {
mavenCentral()
}
dependencies {
compile "org.codehaus.groovy:http-builder:0.4.0"
compile "org.codehaus.groovy:groovy-all:2.3.3"
testCompile "org.spockframework:spock-core:0.7-groovy-2.0"
}
gradle我们将做另文介绍
3. 执行gralde eclipse(当然必须先安装gradle),就可以生成eclipse所需要的.classpath和.project文件,这时候就可以使用eclipse导入功能来import->Existing Projects Into WorkSpace。
4. 创建我们的一个测试,试试看是不是可以使用httpbuilder了
import groovyx.net.http.HTTPBuilder
import spock.lang.Specification;
import static groovyx.net.http.Method.*
import static groovyx.net.http.ContentType.*
class HttpbuildLabSpec extends Specification{
HTTPBuilder http = new HTTPBuilder( 'http://m.weather.com.cn' )
public void testRequestWeather(){
when:
def info =""
http.request( GET, JSON ) {
url.path = '/data/101290401.html'
headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'
response.success = { resp, json ->
info = json.weatherinfo.city
}
response.failure = { resp -> println "Unexpected error: ${resp.statusLine.statusCode} : ${resp.statusLine.reasonPhrase}" }
}
then: "曲靖"==info
}
}
打完收工,通过这个小例子我们可以了解到这么一些内容:
(1)HTTPBuilder 是这个框架的核心类(要不然怎么和框架一个名字),构建这个类的对象的时候,指定要请求的baseUrl。
(2)request方法可以指定请求的method和返回的数据格式,method对应的是GET/PUT/POST/DELETE/HEAD几个常量,而数据格式目前有JSON/XML/HTML/BINARY/URLENC/ANY几种。
(3)一个比较有意思的地方是,在http的request方法里面,仿佛是无根之水一样突然冒出来了几个没有声明过的变量,看起来连编译也不会通过的方法,那么是如何能正常运作的呢?这个我们就要研究到Groovy的Closure(闭包)。Groovy的闭包里包含有一个delegate属性,一般来说,这个delegate里保存的是闭包使用上下文的对象引用,比如a调用了一个闭包b,则b的delegate就是a的this对象。而在HTTPBuilder对象调用request方法的时候,它把传入闭包的delegate改成了一个叫做SendDelegate的类对象(这是HTTPBuilder的内部类,他们都是用Java写的,在新版的HttpBuilder里,已经改名为RequestConfigDelegate),这个类里面,分别包含了一个叫做getHeaders()的方法,一个叫做getUrL()的方法,一个叫做getResponse()的方法。稍微思索一下我们就可以想到,Groovy里有这样的特性,如果直接使用一个识别不出来的变量,Groovy会假设它是getter的一种简写形式,自动进行补全(当然这也是DSL的常用伎俩,把方法伪装成短语),而getter并没有参数,所以其括号是可以简写的,实际上上面的代码可以写作getUrl().path = '/data/101290401.html',这样就非常符合程序员的视觉体验了。
(4)第四点罗嗦了不少,主要是为了喜欢追根问题的同学释疑,实际上整个调用还是非常的简单明快的,在request闭包里,我们通过response(记得吗,实际上就是GetResponse()),获得了一个Map结构,这个Map的内部结构实际上是Map,对“success”和“failure”这两个key我们分别设置了对应的闭包,这样就完成了回调的设置,一旦方法成功或者失败,就可以调用到对应的闭包。
(5)使用了JSON作为返回格式,闭包的第二个参数就是解析好的返回body,就是一个Json对象,是可以直接用点号来访问的。当然最好不要在失败的闭包里放这个参数,一般失败的情况比较多,也许就是一个html返回,格式错误那么测试也就无法按照预期进行了。
Java程序员为什么学习Groovy
正如Groovy对Java很多特性进行的包装优化一样,基于Groovy的HttpBuilder也包裹了HttpClient,使网络编程变得更加的方便易用,下面稍微来用一个例子看一下。
寻找各种依赖的jar包有时候会让我们失去耐心,不过值得庆幸的是我们有Maven和Gradle这样的工具,可以根据配置轻松的帮我们配置好我们需要的数据。下面我们来叙述一下整个过程。
1. 创建文件夹httpbuildertest
2. 创建gradle配置文件,build.gradle,内容如下:
apply plugin: "groovy"
apply plugin: "eclipse"
repositories {
mavenCentral()
}
dependencies {
compile "org.codehaus.groovy:http-builder:0.4.0"
compile "org.codehaus.groovy:groovy-all:2.3.3"
testCompile "org.spockframework:spock-core:0.7-groovy-2.0"
}
gradle我们将做另文介绍
3. 执行gralde eclipse(当然必须先安装gradle),就可以生成eclipse所需要的.classpath和.project文件,这时候就可以使用eclipse导入功能来import->Existing Projects Into WorkSpace。
4. 创建我们的一个测试,试试看是不是可以使用httpbuilder了
import groovyx.net.http.HTTPBuilder
import spock.lang.Specification;
import static groovyx.net.http.Method.*
import static groovyx.net.http.ContentType.*
class HttpbuildLabSpec extends Specification{
HTTPBuilder http = new HTTPBuilder( 'http://m.weather.com.cn' )
public void testRequestWeather(){
when:
def info =""
http.request( GET, JSON ) {
url.path = '/data/101290401.html'
headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'
response.success = { resp, json ->
info = json.weatherinfo.city
}
response.failure = { resp -> println "Unexpected error: ${resp.statusLine.statusCode} : ${resp.statusLine.reasonPhrase}" }
}
then: "曲靖"==info
}
}
打完收工,通过这个小例子我们可以了解到这么一些内容:
(1)HTTPBuilder 是这个框架的核心类(要不然怎么和框架一个名字),构建这个类的对象的时候,指定要请求的baseUrl。
(2)request方法可以指定请求的method和返回的数据格式,method对应的是GET/PUT/POST/DELETE/HEAD几个常量,而数据格式目前有JSON/XML/HTML/BINARY/URLENC/ANY几种。
(3)一个比较有意思的地方是,在http的request方法里面,仿佛是无根之水一样突然冒出来了几个没有声明过的变量,看起来连编译也不会通过的方法,那么是如何能正常运作的呢?这个我们就要研究到Groovy的Closure(闭包)。Groovy的闭包里包含有一个delegate属性,一般来说,这个delegate里保存的是闭包使用上下文的对象引用,比如a调用了一个闭包b,则b的delegate就是a的this对象。而在HTTPBuilder对象调用request方法的时候,它把传入闭包的delegate改成了一个叫做SendDelegate的类对象(这是HTTPBuilder的内部类,他们都是用Java写的,在新版的HttpBuilder里,已经改名为RequestConfigDelegate),这个类里面,分别包含了一个叫做getHeaders()的方法,一个叫做getUrL()的方法,一个叫做getResponse()的方法。稍微思索一下我们就可以想到,Groovy里有这样的特性,如果直接使用一个识别不出来的变量,Groovy会假设它是getter的一种简写形式,自动进行补全(当然这也是DSL的常用伎俩,把方法伪装成短语),而getter并没有参数,所以其括号是可以简写的,实际上上面的代码可以写作getUrl().path = '/data/101290401.html',这样就非常符合程序员的视觉体验了。
(4)第四点罗嗦了不少,主要是为了喜欢追根问题的同学释疑,实际上整个调用还是非常的简单明快的,在request闭包里,我们通过response(记得吗,实际上就是GetResponse()),获得了一个Map结构,这个Map的内部结构实际上是Map,对“success”和“failure”这两个key我们分别设置了对应的闭包,这样就完成了回调的设置,一旦方法成功或者失败,就可以调用到对应的闭包。
(5)使用了JSON作为返回格式,闭包的第二个参数就是解析好的返回body,就是一个Json对象,是可以直接用点号来访问的。当然最好不要在失败的闭包里放这个参数,一般失败的情况比较多,也许就是一个html返回,格式错误那么测试也就无法按照预期进行了。