如鹏网 大学生计算机学习社区

CowNew开源团队

http://www.cownew.com 邮件请联系 about521 at 163.com

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  363 随笔 :: 2 文章 :: 808 评论 :: 0 Trackbacks

#

爪哇国家里福洲有个农民汤木,听说联邦政府在东南部的佛落里洲建设特别区,需要大批劳力。吃不上饭的汤先生就打算去那里混饭吃了。
到了佛落里洲之后,才知道这里竟然在洲政府序列里有个绑架局。绑架局是干什么的呢?
首先,向汤木一类的来自外洲的人收取费用,颁发《免绑架证》,费用高昂,有效期一年。但是,有了《免绑架证》后,还不能免于被绑架,还必须在敲诈局办理《免绑架证承认证》、在勒索局办理《免绑架证生效证》及在无事生非局办理《免绑架证防伪卡》,简称“三证一卡”,此外,女性还必须在性别歧视局办理《女性免绑架证附加证》等许多证件,并且保证说,有了这么多证后,在大街上就不会被政府绑架,还威胁到,没有这么多证的话,或者虽然有却没有带的话,以“无证卡人”的理由予以绑架勒赎。而且,去赎人的人如果没有这么多证,也可能被绑架。至于是否有联邦政府颁发的《公民资格证》倒不重要。
汤木吓坏了,为了在这里混下去,卖血办了这么多证,并且随身带在身上,以为就不会被绑架了。
可是汤木想错了。
这一天,汤木走在大街上,不幸遇到了查《免绑架证》的人员。前面已经有许多人因为没有《免绑架证》或者没有《免绑架证承认证》、《免绑架证生效证》及《免绑架证防伪卡》和《女性免绑架证附加证》等被绑架了!汤木正想着,我的证件齐了,不会被绑架了,所以没有害怕,依然向前走。
戴着绿色帽子的绑架官粗鲁地问汤木:“北佬,有《免绑架证》吗?”
汤木不敢跟他计较礼貌,赶紧说:“我有。”
绑架官继续问:“三证一卡呢?”“都有。”
“拿出来看看。”
汤木赶快拿出来了。
想不到绑架官拿过去看也不看,撕成碎片一扔。然后扬长而去。
这时另一个绑架官问汤木:“你有《免绑架证》吗?”
汤木说:“被他撕了。”
“不要狡辩!来人,这个北佬没有《免绑架证》,马上绑了!”
汤木浑身是嘴也说不清了。到了天边,也可以说那天汤木根本没有带《免绑架证》,所以,绑架汤木是完全正确的。
posted @ 2007-06-16 11:16 CowNew开源团队 阅读(337) | 评论 (0)编辑 收藏

   今天我通过为JVM增加“-Dorg.apache.tapestry.disable-caching=true -Dorg.apache.tapestry.enable-reset-service=true”启动参数的方式启用了tapestry的非缓存模式以提高开发时的效率,但是在运行的时候发现以前正常工作的页面出现了错误,跟踪调试以后发现所有的页面成员变量都为null了。经过分析才发现自己以前对tapestry的一个超大误解,也避免了程序投入使用以后造成更大的问题。
因为有一些属性是只有运行期意义的,对用户没有意义,所以我的程序中原有的java的set/get方法没有与页面中的组件绑定,因为我误认为tapestry会替我在请求之间保存这些变量值,我也曾为此怀疑tapestry是否会因此而造成内存占用过大的问题。
   tapestry的页面java文件默认是会被缓存的,当这个页面对象服务完一个请求以后会被放回池中供下一个请求使用。由于一开始的开发的时候我没有启动非缓存模式,这样当我再次对页面进行操作而造成页面刷新后,tapestry把上次为我服务的页面对象又拿给我了,这样在我看来那些页面中的变量好像是被保存了一样。当我打开非缓存模式以后,每次请求完成后,tapestry都会把变量值清空,这样就会造成上面的问题了,这样也就暴露问题了。
   因此在使用tapestry的时候一定要将需要在页面之间保存的变量放到session中或者保存在页面的hidden字段中,否则很容易出现bug。为了提早发现bug,建议在detach方法中将所有的变量赋值为null。
posted @ 2007-06-06 23:46 CowNew开源团队 阅读(834) | 评论 (0)编辑 收藏

   在开发程序的时候热加载是非常有帮助的,这能大大简化我们开发调试的速度。在使用tapestry开发的时候,只要是启动了调试模式,那么代码的热替换是自动被JVM支持的,也就是只要我们的tapestry运行在调试模式下,就可以实现java代码的即时修改即时生效。但是tapestry的页面文件(.page和.html模板)默认是无法实现热加载的,每次修改页面都必须重启服务器,大大降低了开发速度。其实解决这个问题只要增加虚拟机参数就可以了,只要在虚拟机参数(注意不是应用参数)中加入:-Dorg.apache.tapestry.enable-reset-service=true -Dorg.apache.tapestry.disable-caching=true即可。这样每次修改的时候tapestry就不会去缓存中取了,其中org.apache.tapestry.enable-reset-service的意思是:If not specified as "true", then the reset service will be non-functional. The reset service is used to force the running Tapestry application to discard all cached data (including templates, specifications, pooled objects and more). This must be explicitly enabled, and should only be used in development (in production, it is too easily exploited as a denial of service attack).

Unlike most other configuration values, this must be specified as a JVM system property.

posted @ 2007-06-05 19:13 CowNew开源团队 阅读(426) | 评论 (0)编辑 收藏

 批量系统原有的页面定时刷新的实现是不太合理的,以RealtimeBatchRunningOfCountwf为例:
 首先在RealtimeBatchRunningOfCountwf.page中定义了属性refreshUrl:<property-specification name="refreshUrl" type="java.lang.String"/>,RealtimeBatchRunningOfCountwf.html中将refreshUrl插入head部分。实现的重点在RealtimeBatchRunningOfCountwf.java中,getRefreshUrl方法返回httpmeta头,在这个头信息中定义了刷新时间和要刷新到的页面的url:
 public String getRefreshUrl() {
  String t_intervalTime = getIntervalTime();
  if (t_intervalTime == null) {
   t_intervalTime = getRequestCycle().getRequestContext()
   .getParameter("intervalTime");
  }
  if (t_intervalTime == null || t_intervalTime.equals("")) {
   return "";
  }
  String url = "";
  
  try{
   url = "<meta http-equiv=\"Refresh\" content=\""
    + t_intervalTime
    + "; URL="
    + getRequestCycle().getRequestContext().getAbsoluteURL(
    "batch-server/app?service=page/RealtimeBatchCountwf")
    + "&gappid=" + getGappid() + "&gfuncid=" + getGfuncid() + "&intervalTime=" + t_intervalTime
    + "&agentzoneno=" + getAgentzoneno()
    + "\"/>";
  } catch(Exception e){
   setMessage(e.getMessage());
   return "";
  }
  return url;
 }
 可以看到getRefreshUrl的实现是非常复杂的,由于TapeStry的页面模型是比较复杂的,其中的变量都是通过页面模型来储存的,如果只是简单的刷新页面,会造成这些页面变量错误,因此在getRefreshUrl方法中将所有的变量拼接到url中,这样在页面的getGappid、getAgentzoneno等方法中首先判断页面请求(getRequestContext)中是否有此页面变量,如果有则取页面请求中的,否则再去取本对象中的变量值。这样看起来getGappid、getAgentzoneno、getRefreshUrl等方法都非常复杂,一旦页面中增加新的属性就需要去修改getRefreshUrl方法,而且这样造成视图(View)的逻辑混杂到了模型(Model)中,违反了MVC的隔离原则,最重要的是这样做违背了Tapestry页面模型设计的原意。因此我做了一个新的实现方法,可以参考BatchTaskContrlwf:
 首先仍然是在BatchTaskContrlwf.java中定义getIntervalTime方法:
 public String getIntervalTime()
 {
  if (intervalTime == null)
  {
   intervalTime = "60";
  }
  setMessage("数据每 " + intervalTime + " 秒更新一次,更新的速度可以在左上角更改");
  return intervalTime;
 }
 getIntervalTime比以前的实现简单了。BatchTaskContrlwf.java中也没有了getRefreshUrl方法,这样保持了视图与模型的独立性。
 在BatchTaskContrlwf.html中body的开头增加如下的javascript:
<script>
 //intervalTime表示秒,但是在setTimeout中的单位是毫秒,所以在后边加三个零
 window.setTimeout("RefreshPage()",<span jwcid="@InsertText" value="ognl:intervalTime"></span>000);
 function RefreshPage()
 {  
  document.getElementById("imgRefresh").click();
 }
</script>
 这里调用定时器实现每隔intervalTime秒就调用一次RefreshPage方法,在RefreshPage方法中则去模拟点击imgRefresh控件,这样就可以达到刷新页面的目的了。imgRefresh是为“刷新”这个图形按钮增加的id属性,因为图形按钮默认是只有name属性的,而且name属性生成的也是随机的,所以为“刷新”按钮增加id属性:
<img jwcid="@ImageSubmit" id="imgRefresh" hspace="20" align="middle" image="ognl:assets.refreshImage" listener="ognl:listeners.refreshAction"/>
 这样就可以在RefreshPage方法中轻松的取得此控件了。
 在RefreshPage方法中也使用getElementById这个技巧,因为Tapestry生成的html中的表单的名称也是不可测的,目前的名称是“$Form0”,但是这个名称是不保障的,如果我们在RefreshPage方法中使用document.$Form0.$ImageSubmit.click()方式刷新页面的话,很有可能在Tapestr实现机制改变或者在页面中加入了新的表单元素后造成代码错误。而getElementById则可以直接根据控件id来定位控件,大大提高了代码的灵活性。
注:上边的文章是我对公司原有产品进行重构的时候发的一篇文章,涉及到了公司的一些私有概念,非公司的人可能读部分章节起来有点费劲,请谅解。如果以后有时间我会整理成通用的文档的。
posted @ 2007-06-05 18:40 CowNew开源团队 阅读(1267) | 评论 (0)编辑 收藏

1、开发工作进行到比较后期时,会进入一个“视觉冻结”阶段,也就是界面固定不动,这样做的目的是让使用手册等文件能够定稿。
2、电子邮件让我们工作时不被电话打扰,开发人员彼此之间的讨论主要通过电子邮件,只有必要时才开会。
3、领导者的任务是努力消除程序员工作上的一切障碍,让程序员能全力专注于产品开发,而非写报告、开会。
4、如果你要准备向上级报告项目概况,非得要所有的程序员停下手边的工作,为每个程序写一份摘要吗?这是leader的工作。有太多的Leader

在不该授权的时候授权,让组员为了与产品无关的事情疲于奔命,导致进度停滞不前。
5、我写文章的时候,从不使用电脑,而是使用纸笔来写作,然后再录入计算机。因为使用计算机的时候,每写完一句就忍不住要编辑以前写稿

的东西,这样造成进度过慢,太分心于修改上,忘记了写作内容才是本旨。
6、微软曾经有几位主管,每次遇到项目进度不顺利,就把组员叫出来骂。这种责骂只会激起组员心中的愤怒。
7、用看程序的方式找错,是无效率的方法,用debugger来找bug才是最快最方便的,观察各变量在程序执行过程中的变化,是非常有效的方法

,绝对不要用猜或者用看的办法来找错。
8、这样做对产品有没有帮助?对于目标的完成有没有策略上的价值?这样做是否会使我忽略了更重要的事情?
9、不要把会议时间定在上午10点或者下午3点,这样会把上午或者下午的时间切割的太零碎,最好排在一清早或者快下班之前。
10、不要让程序员的学习停滞不前,要让他们有机会磨练不同领域的技术,培养复合型人才。
11、不要舍不得放您最优秀的程序员到别的项目去。如果他在您的项目中已经没有新的东西科学,为了公司和他个人的前途,您应该把他推荐

到别的项目,让他的成长永不间断。
12、加班本身就是一个危险的讯号,明确告诉你一定有什么地方出现了问题。

posted @ 2007-06-03 12:14 CowNew开源团队 阅读(474) | 评论 (2)编辑 收藏

此版本更新了在Eclipse3.1下无法使用的问题,目前已经能够在Eclipse3.2、Eclipse3.1下运行。
下载地址:http://www.cownew.com/download/

posted @ 2007-06-02 23:45 CowNew开源团队 阅读(311) | 评论 (0)编辑 收藏

from http://blogs.huihoo.com
1. 确保固定的发布周期,短一些。最好每月一个 milestone版,半年一个final版。人手不够?步子可以迈小一点;变化?把部分feature推迟到下一版……无论如何,版本发布的频率节奏一定要稳定,周期要短。这是很多成功的开源项目的经验,也是Agile最重要的原则之一。
2. 建立一个子项目,专门用于集成实用的示范应用,演示JFox推荐的体系结构、设计模式用法。这些示范应用必须是实际的完整的解决方案,而不是Hello World式的Demo。用户可以在此基础上修改扩充,形成自己的系统。Pragmatic的开发框架对推广很重要。

posted @ 2007-06-02 21:09 CowNew开源团队 阅读(343) | 评论 (0)编辑 收藏

首先自我介绍:我是郑重,南京人,Java程序员,现在巴黎一个小IT公司任职,做J2EE编程,主要做servlet/JSP,CMS和portal。应龙辉之邀加入huihoo社区。
言归正传。我算是关注huihoo的一员。所谓关注,首先要知道的一个问题就是,huihoo是什么。网站上说huihoo是Open Enterprise Foundation,它自己也有一些项目,比如JFox,这样看来,huihoo很象一个类似Apache或者Codehaus的一个组织。 Huihoo还拥有一个技术论坛,这样又有点象The Server Side。龙辉还有建立自己的forge的打算,如果forge真的建立起来了,huihoo又有了点sourceforge或者objectweb的模样。但其实,Apache,The Server Side和sourceforge是完全不同的三个东东,那么huihoo到底是什么?
我个人倾向于把huihoo看成是一个Open Source Foundation。原因如下:
先说技术论坛。我觉得国内没有必要再存在一个Java技术论坛。最权威的Java技术论坛,堪称Sun的Java Forum,The Server Side和Java World。国内也有一些有知名度的论坛,比如CSDN,比如China Java World,比如java-cn,所以我觉得技术论坛已经够多了。而且技术论坛的灵魂是人气,不是技术本身。国内那些论坛,统统好像菜场,到处充斥着关于 CLASSPATH如何设置之类的问题,这些问题虽然低级,但却正是一个技术论坛所需要的:不停的有人问问题,有人回答问题,论坛的人气就起来了,至于问题本身是什么,却不那么重要。你要去国内那些论坛问castor怎么用,问xmlbeans怎么用,肯定问津者鲜。我想,一个这样的技术论坛,应该不是 huihoo所需要的。Huihoo不是一个Java初学者俱乐部。
然后说forge。一个forge,本质上是一个服务提供者,所以最重要的是提供的服务是否可靠,是否稳定。Huihoo不是财大气粗的地主,弄个服务器来为别人提供CVS和问题跟踪系统,这样的负荷huihoo肯定受不了。而且,即使能弄来一个这样的服务器,为什么别人不选择sourceforge而选择huihoo?再而且,我觉得项目不贵多而贵精。我三天一个想法,如果用huihoo做forge,一个月我就能注册10个项目,可这10个项目,我能坚持到底的能有一个就不错了。成千上万个半途而废的项目也比不上一个好项目。烂尾的项目太多,反而坏了名声。
最后是开放原代码基金会。做好一个基金会,关键是有一个或者n个有技术有激情并能坚持不懈的团队,和一个或者n个优秀的项目,这也很象目前huihoo的发展模式。如果huihoo意在成为一个这样的组织,那么我觉得forum也好,forge也好,都好比阑尾,有了是个累赘,迟早要卸载掉,所以干脆不用。看看apache和codehaus,都没有自己的forum和forge。为什么没有?因为没有必要。
在上面所说的基础上,再谈谈huihoo的项目。我看了看huihoo网站上列出的一些项目,一个普遍的问题是,似乎坚持下去的不多。很多的项目,最后更新时间都是去年,而今年都快结束了。Java技术日新月异,如果一个Java项目停滞一年没有进展,基本就可以进回收站了。所以,我觉得huihoo应该把它的成员组织好,把它的项目精简一下,然后好好进行开发。
开始一个项目,首先要问的一个问题是,为什么需要做这样的项目。Unix下的 bash,全称是but another shell。为什么大家不用原来的shell,却要用这个bash,but这个单词,很有讲究。因为bash提供了shell所不具有的新特性,所以需要这样的but another。做任何一个项目,都一样。
不客套了,直接拿JFox开刀。J2EE服务器,市场上已经有很多了,比如 JBoss,比如JONAS,比如Apache的Geronimo。为什么还需要JFox?这个问题,我没有和列位JFox团队的成员探讨过,JFox的主页上也没有找到,所以并不清楚。Apache的Geronimo,开始的时间不久,但主页上明确说明了为什么在大家有JBoss和JONAS可以选择的时候启动Geronimo:因为license的问题,Apache希望创建一个在Apache License 2.0之下的开源J2EE服务器。那么,JFox的理由是什么?
做开放源代码的项目,关键是有人愿意使用。开放源代码,让程序员不能从中获得物质上的所得,那么开发的动力来自哪里?我个人认为,一部分来自于理想,一部分来自于别人的认可,两者缺一不可。一个没有人使用的项目,就得不到别人的认可,就难以为继,即使各位是多么的理想主义。而且,优秀的项目,不是闭门造车的成果,而是无数次的反馈和回应反馈的迭代。没有人使用,就没有反馈,就创造不出优秀的项目,这恐怕也是对理想的一个打击。
我看到JoyAOP,看到Willow,都有同样的疑问:我为什么要选择huihoo 的项目,而不是Spring AOP或者aspectJ,不是ObjectWeb的Enhydra?Huihoo需要有自己的项目,每个项目都应该有自己存在的理由。没有存在理由的项目,为什么要存在?
先说这么多。我想,每一个关注huihoo的人,或多或少都会有类似我的想法。要把huihoo建设好,需要直面这些问题。虽然我心存疑问,但我对huihoo是有希望的,因为huihoo有灵魂,那就是它的成员。措辞直接,不够委婉,还望见谅。
from http://blogs.huihoo.com

posted @ 2007-06-02 20:58 CowNew开源团队 阅读(480) | 评论 (1)编辑 收藏

朋友银狐999写得一篇blog,他说出了 Huihoo 目前的一些现状,贴出来与大家分享,希望对大家能有所启发。
Allen,huihoo的创始人之一,这几年一直用自己的热情和努力,来支撑着huihoo的发展。
huihoo,国内著名的开源社团,创造了诸如JFox Server,JFoxAOP,JFoxSOAF,JFoxMX,JFoxMQ等不错的一些开源组件。
这几天Allen来到了北京,趁着今天周六,晚上大家聚了聚:Allen(龙辉),Peter(程勇),Orbat(杨永),梁震宇,以及我(胡长城,银狐999)。
Allen依然对开源充满信心,也依然在为创造一个开源神话而努力:他希望基于开源为大家提供产品和服务,利用服务来创造盈利。—— Allen很执着,也坚定着这个方向。
我们很理解Allen的梦想,但是也不得不承认现实就是现实。
huihoo是国内最值得推崇的开源团体,也创造了诸如JFox Server,JFoxAOP,JFoxSOAF,JFoxMX,JFoxMQ等不错的一些开源组件。然而,曾经的热血小伙子们,如今正在为“房子”,为 “自主创业”等等事情所困扰,JFox的研发越来越缓慢了。
huihoo的网站上,google的广告越来越多了,没有办法,Allen只能依靠这有限的广告收入来维护huihoo网站的运营,甚至这两年多来,Allen利用提供咨询和培训的收入来维持huihoo的网站。
在Allen眼中,国内开源的市场,应该能够托起huihoo这艘大船。然而这艘船越来越沉,船上的水手也越来越疲惫。这艘大船航行在一望无际的海洋 上,充满热情和激情的Allen,面对着一张可能有宝藏的图纸,却苦于没有一个指南针:风帆依然在扬起,帆布却逐渐在被撕碎······
我们很佩服Allen的执着,但是我们也实在不忍心说一些打击Allen的话,但是我们心里都明白,Allen这个梦想,也许真的仅仅只是一个梦。这个 梦还要沉睡多久,我们谁也说不清,但是我们都希望,某一天,这个梦醒来,一切晴空万里,面对着远方,我们这些水手,可以高喊:瞧,就在那里。
谢谢 银狐999 对 Huihoo 和我的鼓励与支持,我们会坚定不移地继续走下去。
from http://blogs.huihoo.com

posted @ 2007-06-02 20:55 CowNew开源团队 阅读(389) | 评论 (1)编辑 收藏

由于工作需要,今天看了看Groovy,下面是学习过程的学习笔记:
基本原则:Java完全可以调用Groovy写好的类;Groovy完全可以调用Java写好的类;即使不使用Groovy的特有的语法,可以使用Java中的绝大部分传统写法。
1 如果使用 groovy.lang.*,grooby.util.*,java.lang.*,java.util.*,java.net.*中的类的时候无需import。
2、支持assert,比如assert 1==1,assert(true)
更高级的用法:assert('text'.3<<'hello').size==4*3+5
3、groovy支持弱类型声明def x=1
4、GroovyBean
class Book
{
   String title;//声明的是属性,而非字段
}
def g = new Book()
print g.title
print g.getTitle()
5 groovy中的==表示等于(equality),而非同一(identity),这与java不同。
6 def nick = 'Gina'
def book = 'Groovy'
assert '$nick is $book' = 'Gina is Groovy'
7 使用正则判断字符串匹配:assert '12345'=~/\d+/
8 groovy中可以直接对Integer类型使用四则运算,可以对int类型调用toString方法。
9 使用list:
def r =['a','b','c']
assert r[0]='a'
assert r.size()==9
使用map:
def http=[100:"cont",200:'ok']
assert http[200]=='ok'
http[800]='what?'
使用ranges:
def x=1..10
assert x.contains(5)
10 闭包:
(1)[1,2,3].each{entry->println entry}
(2)累加计算:其中upto表示从1遍历到10
def  counter=0
1.upto(10)
{
   number->
   counter = counter+number
}
println counter
11 动态执行:evaluate('1+2') 会打印出3
12 groovy中类型可以弱类型声明,也可以强类型声明,并且声明的时候会自动进行boxing,比如def a=1是可以的,int a=1也是可以的,而且第二种用法中声明的a是Integer类型的。
13 Groovy支持运算符重载,其实现方式和python类似,也就是类只要实现某个方法即可实现运算符重载,下面是运算符和对应方法:+ plus;- minus;* multiply;/ div;% mod;++ next;-- previous;** power;| or;& and;^ xor;~ negate;a[b] a.getAt(b);a[b] = c a.putAt(b,c);a<<b a.leftShift(b);a>>b a.rightShift(b);a>>>b a rightShiftUnsigned(b);
switch(a){case b:} b.isCase(a);a==b a.equals(b);
a<=>b a.compareTo(b);
a>b a.compareTo(b)>0;
a>=b a.compareTo(b)>=0;
a<b a.compareTo(b)<0;
a<=b a.compareTo(b)<=0;
a as type a.asType(typeClass)
14 字符串操作:
g="Hello Grooby!"
assert g[6..11] == 'Groovy'
assert g.count('0')==3
assert 'x'.padLeft(3)=='  x'
assert 'x'.padRight(3,'_')=='x__'
assert 'x'.center(3)==' x '
assert 'x'*3=='xxx'
15 字符串的LeftShift和切片的应用
g='Hello'
g<<' Groovy'
assert g instanceof java.lang.StringBuffer
g<<'!'
assert g.toString()=='Hello Groovy!'
g[1..4] = 'i'//替换ello为i,切片的典型应用
assert g.toString()=='Hi Grooby!'
list等collection类型同样支持切片
16 数字的方法:
def s = ''
10.times{s+='x'}
10.downto(0){x+='d'}
s=''
0.step(0.5,0.1){number->
s+=number+' '
}
assert s=='0 0.1 0.2 0.3 0.4'
17 List的常见操作
assert [1,[2,3]].flattern()==[1,2,3]//扁平化
assert [1,2,3].intersect([4,3,1])==[3,1]//交集
assert [1,2,3].disjoint([4.5,6])
list = [1,2,3]
assert list.pop()==3//像使用堆栈一样
assert [3,1,2].sort()==[1,2,3]
assert [1]==[1,1,1].unique()//去掉重复元素

def list=[1,2,3]
assert list.count(2)==1
assert list.max()==3
assert list.min()==1
def even = list.find{item->
 item%2==0
}
assert even ==2
assert list.every{item->
 item<5
}//所有的都小于5
assert list.any{item->
 item<2
}//任何一个小于5
list.reverseEach{item->
 store+=item
}//反向遍历

assert [1,2,3].join('-')=='1-2-3'
for(i in [1,2,3])
{
   println i
}
18 文件处理:
new File('a.txt').eachLine{println it}
19 groovy中xml处理非常简单,可以参考blogjava上的一篇名为“Groovy高效编程——生成XML文件”的文章。
20 Groovy中使用Swing构建界面:
import grooby.swing.SwingBuilder

swing = new SwingBuilder()
frame = swing.frame(titile:'Demo'){
  menuBar{
    menu('File'){
        menuItem 'New'
        menuItem 'Open'
    }
  }
  panle{
    label 'Label my'
    slider()
    comboBox(items:['1','2','3'])
  }
}
frame.pack()
frame.show()
21 groovy中简化了jdbc访问数据库的方法,提供了execute、eachRow等方法,无需开发人员关心关闭连接等问题。
22 java中运行grooby脚本的方法:
GroovyShell shell = new GroovyShell()
Object result = shell.evaluate("12+23")
23 Groovy解析引擎的类为GroovyScriptEngine
def engine = new GroovyScriptEngine(".")
def value = engine.run("test/MyScript.grooby",new Binding())

 

posted @ 2007-05-31 20:17 CowNew开源团队 阅读(2894) | 评论 (0)编辑 收藏

仅列出标题
共30页: First 上一页 10 11 12 13 14 15 16 17 18 下一页 Last