- 提起模板,在 Java 领域中无疑会让人想起 Velocity 和 FreeMarker,可也不要忽略了,和我们最早打交道的 JSP 其实也是一种模板。模板一般都用来作为数据显示分离的显示部分,即 MV 的 V。比如说我目前在 Web 展示和发送邮件时较多的用到模板。通常模板用占位符创建的一个文本,或者串文本、输入流等。这些占位符可以用自己的流程控制代码,所以相应的就有的各种模板语言,例如 VTL(Velocity Template Language)、FTL(FreeMarker Template Language)、自然 JSP 也有算上。
有了模板,再把模型数据和模板进行归并就能得到我们真正想要的数据展现了,这当中的工作就是叫做模板引擎的干的。Groovy 中包含了抽象的 groovy.text.TemplateEngine 类和 groovy.text.Template 接口。可见 Groovy 表现的很开放,它们使得将任何模板引擎插入到 Groovy 中成为可能,比如 Velocity 或者 FreeMarker 引擎,可惜现在还没有。 Read More - 本篇讲述在 XML 中使用了 DTD 的情况下,用 JDOM 解析时如何加速,使用 Schema 验证 XML 的不在讨论之中。所用的是一个 Struts 1.3 的配置文件,大小为 102 K。我们用 JDOM 解析 XML 最简单的代码莫过于以下两行代码,不过为了测试我们在其前后加上记录执行时间的代码:
1long start = System.currentTimeMillis(); 2SAXBuilder builder = new SAXBuilder(); 3Document document = builder.build("struts-config.xml"); 4System.out.println("耗时:" + (System.currentTimeMillis()-start)+" 毫秒.");
在这个 struts-config.xml 中的 DTD 声明如下: Read More - 在 Java 领域中我们结识过多个 XXXlet 的东西,比如 Applet、Servlet、Scriptlet,这里的 let 作为一个后缀,代表小的意思,或者引申为简短、精巧。
Applet ---- Application let 小应用程序
Servlet ---- Service let 小服务程序
Scriptlet ---- Script let 一小段脚本,在 jsp 中用这样的标签 <jsp:scriptlet>
另外还有一种叫做 text/x-scriptlet 的 MIME 类型。
而本篇所要介绍的角色也用了 let 后缀,叫做 Groovlet,不能简单识作为 Groovy let ---- 小 Groovy 程序。不尽对,确切来说它是 GroovyServlet、进一步 Groovy Service let 的简称,没错,它实质上也是一个 Servlet,也就是 Servlet 的扩展。简单讲就是用 Groovy 脚本替代 Java 语言来写 Servlet 程序,再明白点讲就是:比如我们在浏览器中用 http://localhost:8080/groovlet/hello.groovy 访问某个脚本就像访问某个 php/perl 一样的效果。 Read More - 引子
我们在网上经常会碰到一些向导式的表单页面,比如 第一步 >> 第二步 >> 第三步…、基本信息 >> 联系方式 >> 兴趣爱好…。它们都是按类型分到多个有序的页面要你来完成填写的。当然,你也可以把它们全部罗列在一个页面里,那样用户就会感觉茫茫然,分不清主次,可能不会很好的予以配合。
然而像 Struts、WebWork 那样的 MVC 框架未提供类似的实现,都需自己采用某种方式来实现向导,可以用层的隐现方式,或逐步把填写的部分数据放 Session 中,最后汇总处理。幸运的是 Spring MVC 考虑到了这种应用需求,它提供了一个 org.springframework.web.servlet.mvc.AbstractWizardFormController 来满足你。 Read More - Java 的一个很值得称道的特性是在语言级支持多线程。定义了 Runnable 接口,并在根类 Object 中提供了 wait/notify 方法,还有 synchronized 关键字的支持。我们常说实现多线程的方式有两种:继承 Thread 和实现 Runnable,实质上工作者线程执行的都是 Runnable 接口中定义的 run() 方法,Thread 本身实现了 Runnable 接口,它不过是为线程的调度使用提供了许多有用的方法。
而 Groovy 作为 Java 家族的皇储(安心做储君就行了),多线程方面自然不会甘拜下风。Groovy 通过 MetaClass 对 java.lang.Thread 进行了扩展,即所谓的 GDK - Groovy methods added to Java SE classes。
在原 java.lang.Thread 类中增加了两个方法,分别是: Read More - 1. 你们的项目组使用源代码管理工具了么?
MVM:应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。
2. 你们的项目组使用缺陷管理系统了么?
MVM:应该用。ClearQuest太复杂,我的推荐是BugZilla。
3. 你们的测试组还在用Word写测试用例么?
MVM:不要用Word写测试用例(Test Case)。应该用一个专门的系统,可以是Test Manager,也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。
4. 你们的项目组有没有建立一个门户网站?
MVM:要有一个门户网站,用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现,15分钟就搞定。买不起SPS 2003可以用WSS (Windows Sharepoint Service)。 Read More - 现在基本用 Eclipse,所有的操作都在无声无息中进行的,除了操作系统带来的咔嚓声还有你的呼哧声。怀念起使用 JBuilder 的时代了,在 JBuilder 中编译、执行程序或 Ant 脚本,在成功或失败时都有不同的声音提醒。
那我们不妨也来用 JFugue 让 Ant 构建成功或失败时发出不同的声音,关于 JFugue 的使用在 让 Java 轻松乐动起来,使用 JFugue 制作自己的音乐 介绍过。这样我们就能在闭目养神中完成 Ant 的构建,听声音就知道成功还是失败。当然,敏捷过程中多是在晚上无人值守的时候完成自动构建,那晚上可要小心,别吓着鬼了。
实现原理,启动 ant 时用参数 -logger YourLoggerClass 指定你自己的 Logger 类(也是一个监听器),在你的 Logger 类的 buildFinished(BuildEvent event) 时,发现无异常,表示成功,用 JFugue 发出一种声音,有异常时,表时失败,用 JFugue 发出另外一种声音。 Read More - 不夸张的说,Groovy 在使用 JDBC 对数据库的操作上是简化到了极致。Groovy 中的 SQL 支持在 groovy.sql 包中,而其中最耀眼的明星就数 groovy.sql.Sql 了。
现在我们就来体验一下 GroovySQL 给我们带来的快感。这里所用的示例数据库是 derbyDB, JDK 1.6 中附带了这个数据库(叫做 JavaDB),MyEclipse 6.X 也带了 DerbyDB。假设我们把它安装在 C:\Java\JavaDB,那么在 C:\Java\JavaDB\demo\databases 下有一个 toursdb(目录) 数据库。我们就用这个,当然你可以使用你手边已有的或最拿手的数据库。 Read More - 一:Java 与 Groovy 读文件操作比较
Groovy 对 java.io.File 进行了扩展,增加了一些接受闭包参数和简化文件操作的方法。作为对比,我们还是先来看看 java 中读取文件的两种常方法,分别是行读取和字节缓冲区读取:1//--BufferedReader 行读取 2BufferedReader br = null; 3try { 4 br = new BufferedReader(new FileReader("foo.txt")); 5 List<String> content = new ArrayList<String>(); 6 String line = null; 7 while((line=br.readLine())!=null){ 8 content.add(line); 9 } 10} catch (FileNotFoundException e) { 11} catch(IOException e){ 12} finally{ 13 if(br != null){ 14 try { 15 br.close(); 16 } catch (IOException e) { 17 } 18 } 19}1//--借助于 buffer 缓冲区来读字节 2InputStream is = null; 3try { 4 is = new FileInputStream("foo.txt"); 5 StringBuffer content = new StringBuffer(); 6 int read = -1; 7 byte[] buffer = new byte[1024]; 8 while((read=is.read(buffer))!=-1){ 9 content.append(new String(buffer,0,read)); 10 } 11} catch (FileNotFoundException e) { 12} catch(IOException e){ 13} finally{ 14 if(is != null){ 15 try { 16 is.close(); 17 } catch (IOException e) { 18 } 19 } 20}
从上面可看到,采用 Java 传统方式来读取文件内容,不仅代码行多,而且还必须自己用 try/catch/finally 来处理异常和资源的关闭。现在马上来看看 Groovy 完成以上工作的代码是怎么的,只要一行代码: Read More - 学过或用过 Basic 的朋友大约还会记得,在 Basic 里要演奏(当时还是从 PC 喇叭里发出的,现在也能走声卡了)一段 哆来咪发唆拉西哆 可以写成:直接用 JDK 可没有这么简单,虽然 JDK 1.3 开始就引入了 Java Sound API 处理 MIDI(Musical Instrument Digital Interface),可是它的接口很难使用, 另外,Sun 也专为视、音频的捕获、回放、格式转换提供了 Java Media Framework API (JMF),但不能用来创作。有一个开源的组件 JFugue(http://www.jfugue.org/), 它能让你尽显音乐方面的天赋,给你一个高级易用的接口来操作 Java Sound,制作自己的 MIDI 音乐。 Read More
1PLAY "C D E F G A B O6C"