Spiga

快速排序算法和太阳照常升起



这两件事确实毫不相干。

周末看了电影频道播出的《太阳照常升起》,被姜文弄得一头雾水,真是不知所云,甚至心理都有些郁闷。今天在网上查了一下,看了《太阳照常升起》从性解放到人性解放这篇文章似乎有些明白了。


昨天在spring的博客上看到一张演示快速排序算法的图片,应该是来自于维基百科,挺有意思,还是技术算法比较明了。

给Spring Web Flow自定义Converter

想用spring web flow和richfaces的table实现服务器端分页,可以生成一个假冒的List修改它的size等方法,可以参考《wicket开发指南》中的做法,但这种做法总觉得不太完美。按更好的做法是实现一个特定richfaces table的datamodel,而spring web flow中对table用了他自己的datamodel,这就需要自定义converter。

http://forum.springframework.org/showthread.php?t=59042

The best example is in the booking-mvc sample application.

Steps...

1. Implement your custom converter, modeling after existing converters in org.springframework.binding.convert.converters (done once per custom converter). For example:



  1. public class StringToMoney extends StringToObject {   

  2.   

  3. public StringToMoney() {   

  4. super(Money.class);   

  5. }   

  6.   

  7. @Override  

  8. protected Object toObject(String string, Class targetClass) throws Exception {   

  9. return Money.valueOf(string);   

  10. }   

  11.   

  12. @Override  

  13. protected String toString(Object object) throws Exception {   

  14. Money amount = (Money) object;   

  15. return amount.toString();   

  16. }   

  17.   

  18. }  



2. Create a custom conversion service implementation that installs your custom converters (done once):



  1. @Component("conversionService")   

  2. public class ApplicationConversionService extends DefaultConversionService {   

  3.   

  4.    @Override  

  5.    protected void addDefaultConverters() {   

  6.       super.addDefaultConverters();   

  7.   

  8.       // registers a default converter for Money type   

  9.       addConverter(new StringToMoney());   

  10.   

  11.       // registers a custom converter reference-able by id and applied when requested   

  12.       addConverter("shortDate"new StringToDate());   

  13.    }   

  14.   

  15. }  


3. Register the conversion service with Web Flow (done once):



  1. <webflow:flow-builder-services id="flowBuilderServices" service="conversionService">  



Now there is a bug in 2.0.3 where the default expression parser used during data binding does not apply your custom conversion service. This is fixed in 2.0.4 nightly, but to workaround it on 2.0.3 you must manually configure the expression parser implementation and configure its conversion service e.g.



  1. <webflow:flow-builder-services id="flowBuilderServices" service="conversionService" parser="expressionParser">  

  2.   

  3.  <bean id="expressionParser" class="org.springframework.webflow.expression.el.WebFlowELExpressionParser">  

  4.      <constructor-arg>  

  5.          <bean class="org.jboss.el.ExpressionFactoryImpl">     

  6.      </bean>  

  7.      <property name="conversionService" ref="conversionService">  

  8.  </property>  


4. Default converters for your custom types should be used automatically anytime you bind to a property of that type. For custom converters to be applied for a specific type you reference the converter when you setup a view-binding:



  1. <view-state id="enterBookingDetails" model="booking">  

  2.     <binder>  

  3.         <binding property="checkinDate" converter="shortDate" required="true">  

  4.         <binding property="checkoutDate" converter="shortDate" required="true">  

  5.         <binding property="beds" required="true">  

  6.         <binding property="smoking" required="true">  

  7.         <binding property="creditCard" required="true">  

  8.         <binding property="creditCardName" required="true">  

  9.         <binding property="creditCardExpiryMonth" required="true">  

  10.         <binding property="creditCardExpiryYear" required="true">  

  11.         <binding property="amenities" required="false">  

  12.     </binding>  

  13.     <transition on="proceed" to="reviewBooking">  

  14.     <transition on="cancel" to="cancel" bind="false">  

  15. </transition>  




多选:
http://jira.springframework.org/browse/SWF-720
使用jsf的验证器:
http://jira.springframework.org/browse/SWF-799

共享一个一直都很喜欢的JavaScript幻灯片

推荐两个关于JSF、Spring和JPA的幻灯片

之前我把JSF CARD做成了幻灯片,今天在slideshare上有发现了两个很不错的。
下面这个幻灯片中,不但讲了JSF的各个方面,而且还讲述了WEB框架发展的过程。

Apache MyFaces
View SlideShare presentation or Upload your own. (tags: jsf apache)
下面的这个幻灯片也是MyFaces的,重点讲述了JSF和Spring已及JPA的结合。

Advanced Jsf
View SlideShare presentation or Upload your own. (tags: jsf orchestra)

What's new In Spring3.0?

http://raibledesigns.com/rd/entry/what_s_coming_in_spring这篇博客上对spring从1.0到3.0做了介绍。


What's Coming in Spring 3.0
View SlideShare presentation or Upload your own. (tags: spring spring30)


看完上面的幻灯片,看到下面这个介绍spring2.5的也很不错。

Spring Framework勉強会
View SlideShare presentation or Upload your own. (tags: aop annotation)

强烈推荐一个JSF备忘卡片

Read this document on Scribd: JSF Online Card


这个flash是使用http://www.scribd.com在线把PDF转换过来的,此外http://pdfmenot.com也不错,不需要注册,不过品质可能没有scridb好。

怎么能拿孩子的未来开玩笑?永别了,三鹿!

三鹿终于承认了自己的罪过,开始召回奶粉了,不过那么多孩子的健康问题怎么处理?以后大家谁还敢喝三鹿的奶粉呢?——作为一个已为人父的人,我想到这件事也是心有余悸,什么事情都可以马虎,唯独生命有关的事不能,尤其是和孩子生命攸关的事。幸亏我们家孩子喝的是惠氏,不过谁家的孩子不是宝贝呢,可怜那些幼小的还在吃奶的受害的小朋友!

三鹿把责任推卸给奶农,据说公安机关已开始抓捕添加有害物质的不法奶农了,这种做法更使人感到厌恶,我倒觉得三鹿还不如主动承担所有责任,马上对那些受害的消费者进行援救和补偿。

看看聪明的网友们提出的质疑:

又在找替罪羊。难道你们三鹿没有质检,我给你石灰水,你也收??700吨啊,这可不是小数字,难道你们没质检。

1.三聚氰胺不溶于水,其实看上去三聚氰胺就是一塑料粉末,要在液态奶里面掺进不溶于水的三聚氰胺技术上几乎不可能(“三聚氰胺是一种三嗪类含氮杂环有机化合物,微溶于水,呈弱碱性。”“溶解度在每100g水中为0.1g以下的,称为微溶。”)。2.奶粉生产过程中要对液态奶进行喷雾干燥,如果液态奶里面含有不可溶的三聚氰胺成分的话,就会堵塞喷头,三鹿生产线都会完蛋。3.假如真的奶农掺了三聚氰胺,那么三鹿的所有奶粉都出问题才是,事实上,只有三鹿最便宜的婴儿奶粉出了问题,其他奶粉并没有出问题,这说明三聚氰胺不是来自奶源,而是来自用来替代奶蛋白的大豆蛋白。4.今年5月份三聚氰胺的出厂价格是每吨11000元,合每公斤11元,鲜奶收购价格是每公斤2.8元.奶农赔本也要给你毒牛奶啊?

PS:上面对三聚氰胺的的物理化学特性的描述我没有去考证,感兴趣的话大家可以自己去核对。

河北的优秀企业本来就少,这次又完了一个,而且是彻底的完蛋了,bye-bye了三鹿,看来以后只能在无关紧要的产品上支持国货了。

对个人而言,现在生活虽然富裕了,不愁温饱甚至天天吃肉,不过却更加不安全了——除了奶粉,还有激素超标的鸡腿、含有甲醛的酒、红心鸭蛋、致癌的牙膏……要命的是都是质检合格的产品。现在看来美国人来参加奥运会自带食品倒不是人家太矫情,而是确实有必要。

突然想到另外一个问题,如果三鹿完了,最起码大不如前了,厂里那些普通的工人们可能日子就没那么好过了,要知道在石家庄能在三鹿上班应该还是很好的工作奥。现在有名的产品靠不住,想靠一家有名的企业吃个安心饭也未必能靠得住了。

赋上一个传说中的接龙贴,看看各地的网友是如何协作的,呵呵,就连加拿大的网友也参与进来了:
网易广东惠州网友(116.17.*.*) 的原贴:

三鹿说是奶农的责任
网易广东惠州网友(116.17.*.*) 的原贴:

奶农说是奶牛的责任
网易北京网友(210.74.*.*) 的原贴:

奶牛说是草的责任
网易河南濮阳网友(222.136.*.*) 的原贴:

草说是肥料的责任
网易广东深圳网友(59.40.*.*) 的原贴:

肥料说是厕所的责任
网易内蒙古呼伦贝尔网友(58.18.*.*) 的原贴:

厕所说是屁眼的责任。
网易湖北黄石网友(61.184.*.*) 的原贴:

屁眼说是肠子的责任。
网易海南网友(59.49.*.*) 的原贴:

肠子说是国足的责任
网易广西南宁网友(222.216.*.*) 的原贴:

国足说是哑聋的责任
网易广东佛山顺德网友 [sam701] 的原贴:

亚龙说是中国足球的责任
网易陕西西安网友(210.74.*.*) 的原贴:

中国足球说是国脚的责任.
网易山东潍坊网友(124.134.*.*) 的原贴:

国脚说是足球的责任
网易广东茂名高州网友(125.94.*.*) 的原贴:

足球说是生产商的责任!!
网易广东网友 [sandy_star] 的原贴:

生产商说是皮革供应商的责任
网易辽宁营口网友(60.23.*.*) 的原贴:

皮革供应商说是牛的责任
网易湖南岳阳网友(124.229.*.*) 的原贴:

牛说是草的责任
网易北京网友(203.86.*.*) 的原贴:

草说是肥料的责任。
网易北京丰台网友(221.219.*.*) 的原贴:

肥料说地球的责任
网易黑龙江鹤岗网友(222.32.*.*) 的原贴:

地球说是空气的责任
网易江西新余网友(117.42.*.*) 的原贴:

空气说是WY的责任。
网易上海奉贤网友(221.239.*.*) 的原贴:

WY说是三鹿的责任
网易山东青岛网友(124.129.*.*) 的原贴:

WY说是妓者的责任
网易加拿大网友(24.108.*.*) 的原贴:

妓者说是圆珠笔的责任。
网易北京网友(61.50.*.*) 的原贴:

圆珠笔说是纸的责任
网易上海松江网友(61.172.*.*) 的原贴:

纸说是树的责任
网易江苏南京网友(117.88.*.*) 的原贴:

树说是土的责任...又回去了,转吧!
网易安徽芜湖网友(218.22.*.*) 的原贴:

土说是肥料的责任

Spring Web Flow快速上手

下载spring2.5.5spring web flow2.0.3

新建一个工程,在WEB-INF/lib目录下添加如下的jar文件:

  • commons-logging.jar
  • ognl-2.6.11.jar
  • org.springframework.binding-2.0.3.RELEASE.jar
  • org.springframework.faces-2.0.3.RELEASE.jar
  • org.springframework.js-2.0.3.RELEASE.jar
  • org.springframework.webflow-2.0.3.RELEASE.jar
  • spring.jar
  • spring-webmvc.jar


然后需要配置一下web.xml,加上SpringMVC的支持,配置很简单,不多加解释了,下面是代码:


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  6. id="WebApp_ID" version="2.5">
  7. <display-name>helloswf</display-name>
  8. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>/WEB-INF/simple-servlet.xml</param-value>
  11. </context-param>
  12. <servlet>
  13. <servlet-name>simple</servlet-name>
  14. <servlet-class>
  15. org.springframework.web.servlet.DispatcherServlet
  16. </servlet-class>
  17. <load-on-startup>1</load-on-startup>
  18. </servlet>
  19. <servlet-mapping>
  20. <servlet-name>simple</servlet-name>
  21. <url-pattern>*.html</url-pattern>
  22. </servlet-mapping>
  23. <welcome-file-list>
  24. <welcome-file>index.jsp</welcome-file>
  25. </welcome-file-list>
  26. </web-app>


配置simple-servlet.xml这个spring的上下文定义文件:


  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:webflow="http://www.springframework.org/schema/webflow-config"
  4. xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  7. http://www.springframework.org/schema/webflow-config
  8. http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">
  9. <bean id="publicUrlMappings"
  10. class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  11. <property name="mappings">
  12. <value>/helloWorld.html=helloWorldHandler</value>
  13. </property>
  14. </bean>
  15. <bean id="helloWorldHandler"
  16. class="org.springframework.webflow.mvc.servlet.AbstractFlowHandler" />
  17. <bean
  18. class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
  19. <property name="flowExecutor" ref="flowExecutor"/>
  20. </bean>
  21. <!-- Spring Web Flow Configuration -->
  22. <webflow:flow-executor id="flowExecutor"
  23. flow-registry="flowRegistry" />
  24. <webflow:flow-registry id="flowRegistry">
  25. <webflow:flow-location path="/WEB-INF/flows/helloWorld.xml" />
  26. </webflow:flow-registry>
  27. </beans>
  • 通过SimpleUrlHandlerMapping这个URL映射器将/helloWorld.html这个URL交给org.springframework.webflow.mvc.servlet.AbstractFlowHandler去处理。

  • 定义flowRegistryflowExecutorFlowHandlerAdapter,并在flowRegistry中注册/WEB-INF/flows/helloWorld.xml这个流程定义文件。


下面是/WEB-INF/flows/helloWorld.xml这个文件的内容:


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <flow xmlns="http://www.springframework.org/schema/webflow"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/webflow
  5. http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
  6. <view-state id="hello">
  7. <transition on="*" to="helloWorld" />
  8. </view-state>
  9. <end-state id="helloWorld" view="helloWorld.jsp" />
  10. </flow>


这个流程中使用了两个视图,hellohelloWorld,我们在/WEB-INF/flows/这个目录下新建这两个文件。


hello.jsp:

  1. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html>
  5. <head>
  6. <title>Welcome to Spring Web Flow</title>
  7. </head>
  8. <body>
  9. <h1>Welcome to Spring Web Flow</h1>
  10. <form:form id="start">
  11. <input type="submit" name="_eventId" value="Click to say hello!" />
  12. </form:form>
  13. </body>
  14. </html>
helloWorld.jsp:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html>
  4. <head>
  5. <title>Welcome to Spring Web Flow</title>
  6. </head>
  7. <body>
  8. <h1>Hello, Web Flow!</h1>
  9. </body>
  10. </html>

注意:在hello.jsp中一定要使用spring的form标签。如果使用html的form标签,要使用下面的写法:

  1. <form id="start" action="${flowExecutionUrl}" method="post">

好了,启动tomcat,然后再浏览器中输入:http://localhost:8080/helloswf/helloWorld.html测试一下吧。

推荐几个学习GWT的资源

Google Web Toolkit非常的棒!看看用它开发的GMail就知道了。虽然它有非常多的优点,但我觉得最突出的有两个,一是可以用Java的而不是JavaScript开发Ajax富客户端程序,对于那些Java程序员,尤其是喜欢Swing或SWT开发的Java程序员,那真是太爽了;二是它高效的运行性能,InfoQ中的一篇文章详细讲解了这个优点。

现在GWT已经发布了1.5版本,官方网站还提供了一个非常棒的教程,强烈推荐。《Google Web Toolkit Application》这本书也很不错,我觉得比《GWT in Action》要好,虽然都是讲的GWT1.4的版本,不过对GWT的学习非常有帮助。

ExtJS有一个Ext GWT项目可以用GWT开发炫丽的Ext界面,不过是GPL协议开源的,也就是说商业应用是要收费的,幸好还不太贵。使用Ext GWT对速度影响还是比较大的,但它提供了很多漂亮好用的Widget,如果打算做局域网内的应用的话还是可以考虑的。

说到开发工具,我首推Instantiations GWT Designer,SWT Designer也是出自这个厂家,他们做的实在是太棒了,不信可以看看他们的视频演示。可惜这个工具也是收费的,不过他们提供免费的试用(有期限限制),如果手头不是很充裕又想长期使用的话可能要想想其它的办法了。

今天看到一个使用GWT Designer的很好的教程,Getting started with GWT and the GWT Designer by Instantiations(第一篇,第二篇),打算有时间把它翻译过来。

还有一些GWT的扩展项目,比如拖拽的、画图的等等,以后再慢慢了解。

GWT在国外其实还是很火的,比如我最近又看到JBoss就在用Ext GWT为JBPM重新改写了控制台,希望GWT在国内也能有好的发展。

Dojo1.2通过Flash实现了一个多文件上传组件

在Dojo1.2中将增加一个多文件上传组件,这个组件通过在页面上增加一个隐藏的Flash文件来增加一些以前HTML的uploadfile组件说没有的功能。



他不但使得使用ajax方式上传多个文件变得更加容易,而且带来了很多的好处:

  • 以在客户端就过滤文件的类型和大小了
  • 可以任意设计上传的界面了——以前普通的HTML的uploadfile中想改变按钮的样式都比较困难
  • 更多的扩展控制,提供了onChange、onProgress、onComplete、onError 等事件,可以通过添加自己的监听方法进行更多的控制
更多的消息请见Ajaxian的报道Dojo Multifile Uploader with Flash,详细的用法请见Dojo背后支撑公司SitePen的博客文章The Dojo Toolkit Multi-file Uploader,他们还提供了一个示例。下面是一段样例代码:


  1. var uploader = new dojox.form.FileInputFlash({

  2. uploadUrl:"http.localHost/FileUpload.php",

  3. button:myButton,

  4. uploadOnChange: false,

  5. selectMultipleFiles: true,

  6. fileMask: ["All Images", "*.jpg;*.jpeg;*.gif;*.png"],

  7. degradable: true

  8. });



这个组件将包含在Dojo1.2中,按计划Dojo1.2将会在本月发布。你可以个下载nightly builds提前体验一下。

Google Chrome发布——界面简洁,速度惊人!

google今天终于发布了自己的浏览器,这款被命名为chrome的软件尽管还是beta版,但自早上发布以来好评自身便不绝于耳。最直观的优点莫过于简洁友好的界面和惊人的速度——其实我觉得这体现了google的一贯的指导原则,对比一下gmail和其它的邮箱就可以看出,它的界面看上去很是平淡绝少华而不实却又极富可操作性,性能和速度更是其它邮箱比不上的。

简单、稳定、高效、安全、开源。

这是chrome的设计主旨,现在看来最起码在简单和高效上已经做得非常不错了,此外,它对标准的支持也是非常不错,浏览了几个常用的几个网站,显示基本上很正常,当然这得益于chrome所使用的内核WebKit,adobe的AIR和apple 的Mac OS X中的safari都使用WebKit作为内核,此外chrome使用的是自己开发的JavaScript V8引擎,所以对JavaScript的解析速度也表现优异,我试着运行了一下ExtJS的demo,感觉非常流畅。

WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,包含了来自KDE项目和苹果公司的一些组件。

速度提高的主要秘诀是使用了多进程的架构,这大概是和IE及FireFox最不同的地方,多进程的方式不但大大提高了速度,还避免了多个标签页之间的相互影响以及整个浏览器的假死现象。Google Chrome漫画书中文版对多进程的结构和内存的使用做了很直观的介绍。


界面的设计也是别具匠心,UCDChina也做了一个Google Chrome 和它的设计 的专题,可以一看。

我现在比较关心的是chrome是否能够提供想FireFox一样的插件体系和一些比较好用的插件,比如FireBug。

GoogleChrome漫画书中文版

用JRuby轻松搞定SOAP RPC调用

最初发表在JavaEye上,搬家了就搬过来了。

1、安装JRuby。今天发现JRuby已经发布了1.0.0RC1版本,可以到http://dist.codehaus.org/jruby/去下 载。正确设置一个系统环境变量JRUBY_HOME指向解压后的目录,并把%JRUBY_HOME%\bin添加到系统环境变量PATH中。新建一个 hello.rb文件:

ruby 代码
  1. puts 'Hello World.'
打开一个CMD窗口,切换到hello.rb所在目录,运行jruby hello.rb,在窗口中看到“Hello World.”了吧?--JRuby就安装好了。

2、安装AXIS。我在http://ws.apache.org/axis/index.html下载了AXIS1.4,解压后吧webapp下的axis目录复制到tomcat的webapp目录下,启动tomcat,
然 后打开浏览器输入网址http://localhost:8080/axis,会看到AXIS的主页面,点击Validation,如果没出现大的错误就 算安装成功了。接下来我们来部署一个web服务。在tomcat的webapp/axis目录下新建一个文件Hello.jws:
java 代码
  1. public class Hello {
  2. public String hello(String name){
  3. return "hello,"+name;
  4. }
  5. }
在浏览器中输入http://localhost:8080/axis/Hello.jws?wsdl,就会看到一个新发布的web服务的wsdl描述。

3、JRuby处理SOAP消息。在hello.rb中写入下面的代码:
ruby 代码
  1. require 'soap/rpc/driver'
  2. server = 'http://localhost:8080/axis/Hello.jws'
  3. InterfaceNS = 'impl'
  4. drv = SOAP::RPC::Driver.new(server, InterfaceNS)
  5. drv.add_method_with_soapaction('hello', InterfaceNS+'#hello', 'translationmode')
  6. puts drv.hello('YanHua')
代码很简洁,其中server、ns和action等信息可以在上面的那个wsdl文件中找到。在命令行运行jruby hello.rb屏幕上会打出“hello,YanHua”的字样,这样,我们就用JRuby轻松的实现了一个web服务的调用。

在Groovy1.0中使用闭包和集合

这是以前的一篇文章,发布在JavaEye上,现在转帖到这里。

1、闭包
闭包是很多动态语言提供的一个很方便的功能,它有点像Java中的内部类,不同的是闭包中只有一个方法,但这个方法可以有任意个参数。

java 代码
  1. def closure = { param -> println("hello ${param}") }
  2. closure.call("world!")
这段代码会输出”hello world”。
  • 闭包用“{}”括起,“->”前面是参数,后面是处理语句,可以使用call调用,也可以在“{}”后直接使用“()”来执行。
  • 闭包可以有多个参数,各个参数用“,”隔开。如果只有一个参数的话可以省略不写,可以使用关键字“it”来代表。
我们可以把上面的例子像下面这样写:
java 代码
  1. closure = { println("hello ${it}") }('world')
或者
java 代码
  1. closure = { param1,param2->
  2. println(param1+param2) }('hello ','world')
上面的几种写法都会输出“hello world”。

2、集合
(1)List
java 代码
  1. def list = [1, 2, 'hello', new java.util.Date()]
  2. assert list.size() == 4
  3. assert list[1]==2
  4. assert list.get(2) == 'hello'
(2)Map
java 代码
  1. def map = ['name':'James', 'location':'London']
  2. assert map.size() == 2
  3. assert map.get('name') == 'James'
  4. assert map['location']=='London'
(3)循环
java 代码
  1. def list = [1, 2, 3]
  2. for (i in list) {
  3. print i
  4. }
  5. println()
  6. list.each{item->
  7. print item
  8. }
  9. println()
  10. ['name':'yanhua','addr':'beijing'].each{println it}
  11. ['name':'yanhua','addr':'beijing'].each{key,value->println "${key} ^_^ ${value}"}
上面的运行的结果如下:
123
123
name=yanhua
addr=beijing
name ^_^ yanhua
addr ^_^ beijing
(4)collect
遍历集合,逐个传递给闭包,处理后的结果返回给对应的项。
java 代码
  1. def value = [1, 2, 3].collect { it * 2 }
  2. assert value == [2, 4, 6]
(5)find
根据闭包断言,返回集合中找到的第一个项目。
java 代码
  1. def value = [1, 2, 3].find { it > 1 }
  2. assert value == 2
(6)findAll
根据闭包断言,返回集合中所有找到的项目。
java 代码
  1. def value = [1, 2, 3].findAll { it > 1 }
  2. assert value == [2, 3]
(7)inject
遍历集合,第一次将传递的值和集合项目传给闭包,将处理结果作为传递的值,和下一个集合项目传给闭包,依此类推。
java 代码
  1. def value = [1, 2, 3].inject('counting: ') { str, item -> str + item }
  2. assert value == "counting: 123"
  3. value = [1, 2, 3].inject(0) { count, item -> count + item }
  4. assert value == 6
(8)every
如果集合中所有项目都匹配闭包断言,就返回true,否则返回false。
java 代码
  1. def value = [1, 2, 3].every { it < 5 }
  2. assert value
  3. value = [1, 2, 3].every { item -> item < 3 }
  4. assert ! value
(9)any
如果集合中任何项目匹配闭包断言,就返回true,否则返回false。
java 代码
  1. def value = [1, 2, 3].any { it > 2 }
  2. assert value
  3. value = [1, 2, 3].any { item -> item > 3 }
  4. assert value == false
(10)min/max
返回集合中的最小/最大项目(对象必须可比较)。
java 代码
  1. def value = [9, 4, 2, 10, 5].max()
  2. assert value == 10
  3. value = [9, 4, 2, 10, 5].min()
  4. assert value == 2
  5. value = ['x', 'y', 'a', 'z'].min()
  6. assert value == 'a'
(11)join
连接集合中的值成一个字符串。
java 代码
  1. def value = [1, 2, 3].join('-')
  2. assert value == '1-2-3'

本文参考了http://blog.csdn.net/chenyun2000/archive/2004/09/15/104971.aspx这篇文章,针对Groovy1.0做了一些修改和扩充。

再说说JSF适合在什么样的场合下使用

以前我在JavaEye上发过一篇关于JSF的文章——做JSF很久了,我也说说JSF的缺点——当时的反响还是大的,过了几个月了,根据大家的回复和我对JSF的进一步深入了解,再总结一下。

整体上我的观点还是没有太大变化的,JSF在服务器端保存组件状态的这个特点使得它非常的不REST,也显得十分的笨重,但这种在无状态的HTTP协议上模拟出组件的有状态的做法,确实给开发带来了很多的便利。所以这个问题要辩证的看,对于那些用户数和访问量不大的企业应用,我觉得用JSF开发还是很合适的。另一个问题是JSF的学习曲线和难度,我想说的是千万不要指望那些可视化的IDE工具能显著降低JSF的开发难度,即使这些工具在80%的情况下能显著提高开发效率,但你的团队中还是要有非常熟悉JSF的人——不仅要熟悉生命周期和方方面面的细节,而且要能够合理的扩展框架和自定义组件。而且团队中的成员最好都能有一些OO的功底,如果都用action-based的基于MVC的Web框架(比如Struts、SpringMVC)的思想来开发JSF会非常的别扭,不过说实话,现在大多的WEB程序员似乎都不太熟悉OO,所以要使用JSF必须舍得花点成本培训你的团队成员,这比买那些快速开发工具要划算的多。我记得TSS上 有一篇文章讨论为什么招聘wicket的程序员的广告很少,wicket的fans说我们不一定要招聘使用过wicket程序员,我们只要招聘那些懂OO的程序员就一定能做好wicket了。我想对于JSF这个说法也是适用的。

所以我认为JSF适合那些经常做访问量不是很大业务可能比较复杂的内部应用的,一个有志于技术积累和稳定团队建设的公司使用。

具体的优缺点就不再详细说了,可以看看我上面提到的文章尤其是大家的评论。

体验Oracle Database 10g Express Edition

前些天试用普元的EOS,它的开发工具竟然不支持MySql和其他的一些轻量级的数据库,无奈装了一个Oracle Database 10g Express Edition,它提供了一个非常容易使用的基于浏览器的控制台,也提供了非常详细友好的教程,不过,一些高级的操作还是需要使用命令行的,下面是使用过程中的一些心得。

安装完成后会在windows中注册好几个服务,其中OracleServiceXE和OracleXETNSListener默认会自动启动。默认的数据库名叫XE,express版的oracle数据库只能建立一个数据库,且最大为4G。假如我们用jdbc来连接(这里使用ojdbc14.jar),可以这样写:

oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@127.0.0.1:1521:XE

虽然只能建立一个数据库,不过我们可以建立多个表空间,可惜,可视化的控制台并没有提供创建表空间的快捷方式,所以只能使用命令来完成了:



  1. create tablespace YHSP

  2. datafile 'D:\ORACLE10EX\ORADATA\XE\YHSP.DBF' size 100M

  3. autoextend on next 20M maxsize unlimited logging

  4. extent management local autoallocate

  5. segment space management auto;

关键选项的说明如下:
  • DATAFILE: 表空间数据文件存放路径
  • SIZE: 起初设置为200M
  • UNIFORM: 指定区尺寸为128k,如不指定,区尺寸默认为64k
  • 空间名称MOF_TEMP与 数据文件名称 MOF_TEMP.dbf 不要求相同,可随意命名.
  • AUTOEXTEND ON/OFF 表示启动/停止自动扩展表空间
  • alter database datafile ' D:\oracle\product\10.2.0\oradata\orcl\MOF_TEMP.dbf ' resize 500m; //手动修改数据文件大小为500M
如果要删除表空间,可执行下面的语句:

  1. DROP TABLESPACE YHSP INCLUDING CONTENTS AND DATAFILES;


创建了表空间后,可以在图形化管理中看到新加的表空间,也可以使用如下语句看到所有的表空间:


  1. select * from v$tablespace;


这里假定刚刚创建的这个表空间的id是17。

这时新建的用户的默认表空间还是user,如果想改变这个新用户的表空间,可以在管理后台修改表user$中这个用户的datats字段为表空间的id,或执行以下sql命令:


  1. update user$ set datats#=17 where name='UserName'


注意system用户没有操作user$表的权限,要执行以上的操作必须要以sys用户登录。

几年前Oracle Database 10g Express Edition刚刚发布时我也试用过,印象中好像不能在Windows 2000 Server中安装,为此我还专门安装了Windows XP。

如果是想学习和联系Oracle的话,个人电脑上安装一个Express版还是不错的选择。

美化了一下blogger,很满意,以后就在此安家了!

我是一个不折不扣的gfans,一项服务只要是google有的,我基本上不会用别人家的了。google的博客——blogger——我也是非常的喜欢,可是确有一个致命的问题,那就是经常被伟大英武的GFW封杀,总告诉你的朋友自己的博客地址还要教人家如何“爬墙”吧,只能自己使用代理访问一下,这也颇具讽刺意味。

封了又解,解了又封,这么来回多次,这一次大概有数月没有再封了,所以我有有些蠢蠢欲动,真正使用blogger打造自己的地盘了。

我不喜欢花里胡哨的,博客不就是给人看的吗,所以首先要简洁明了,对阅读者的眼睛友好,当然,也要美观。blogger默认的模板是够简洁的但我觉得不太漂亮,不过blogger的扩展性非常强,你可以使用第三方的模板,而且还可以再做一些修改以符合自己的口味。推荐一个专门提供blogger模板的网站——http://btemplates.com——我当前的这个就是那里下载的。

现在blogger的widget也比以前丰富了很多,我先把饭否和Google Reader的共享加上来,再把宝贝儿子的相册加进来,呵呵,好看多了。

可是我是一个程序员,经常会张贴一些代码,可惜blogger的编辑器不支持代码高亮的功能,恰好今天开到了一片文章基于 dp.SyntaxHighlighter 写的代码着色工具,马上下载了这个工具使用一下,非常的棒。我首先把highlight.css中的样式表放在HTML模板中,然后就用上面的那个工具生成HTML代码插入到博客中来了。下面秀一下代码高亮吧。



  1. public int indexOf(Object o) {

  2. if (o == null) {

  3. for (int i = 0; i < size; i++)

  4. if (elementData[i]==null)

  5. return i;

  6. } else {

  7. for (int i = 0; i < size; i++)

  8. if (o.equals(elementData[i]))

  9. return i;

  10. }

  11. return -1;

  12. }


syntaxhighlighter这个项目也是非常值得推荐的。

以后争取每天能写一篇博客,主要是以技术为主当然不只限于技术。