Maven 开发者手册翻译进行中......

看到 Maven 不断的演进, 著名的  Appfuse 也摒弃了 Ant 而采用了 Maven 作为它的构建管理工具,各个 Java IDE 对于 Maven 的支持也是纷纷上马,所以急迫的感觉对于 Maven 的出现是不容忽视了。Ant 纵然是能满足于我们的需求,不过 Ant 的 build.xml 脚本总那么臃肿不堪,不利于阅读。

而 Maven 与 Ant 同出一族,为 Apache 门下的师兄弟。既然 Apache 会再发明这样一个新轮子,相比于 Ant 确有它的许多独到之处。Maven 依赖了 ant-x.x.x 包,但要说是建立在 Maven 之上的话恐有不太合适。

关于 Maven 与 Ant 之间比较的文章在网上能找到不少,如 maven和ant的比较。具体的不细说,略表几个 Maven 关键之处:1. 对依赖包的处理十分优雅;2. 有大量可用的插件支持;3. 便于与其他工具的支持;4. 适合于多项目的开发。本人也是接触不久,还有许多有待发掘。 阅读全文 >>

Maven 1 的 Unknown error downloading; status code was: 301 错误解决

现在早已是 Maven 2 了,可还是有机会用了一下 Maven 1,所用的版本是 Maven 1.0.2,刚开始尝试的时候出现以下两个问题:

1. 执行 maven genapp 时产生如下异常:

???????? commons-jelly-tags-interaction-20030211.143817.jar????
Error retrieving artifact from [http://www.ibiblio.org/maven/commons-jelly/jars/commons-jelly-tags-interaction-20030211.143817.jar]: java.net.ConnectException: Connection timed out: connect
?????? commons-jelly-tags-interaction-20030211.143817.jar ?????§°???
???????????????±???????¨??????????

commons-jelly-tags-interaction-20030211.143817.jar 阅读全文 >>

Spring 学习点滴,《Spring in Action》笔记(七)

  1. Spring MVC 还提供了一个特别点的 Controller 类型就是 ThrowawayController,它自成一个接口,ThrowawayController 和 Controller 的关系是平行的。什么叫做 ThrowawayController 呢,中文叫做一次性控制器,也就像一次性筷子那样用完即丢,下次要用又拿新的。表现在实例上就是相应 Bean 配置为 singleton="false",每次初始化一个新实例。与其他 Controller 的区别完全就是 WebWork 或 Struts2 的 Action 与 Struts1 的 Action 的区别。因为它是多例的,所以可以用实例变量来接受请求参数,执行方法无参数;而不像其他的 Controller ,因为共享实例,所以需要通过执行方法的来传递请求参数以保证线程安全(P273)

92. 在《Spring in Action》第一版 274 页说 DispatcherServlet 使用缺省 ControllerHandlerAdapter 时只会把控制权分发给 Controller 接口类型的类,而要配置 ThrowawayControllerHandlerAdapter 后,Dispatcherservlet 就把控制权分发给 ThrowawayController,配置如下: 阅读全文 >>

Spring MVC 中的 MultiActionController 用法详解

Spring MVC 中 Controller 的层次实在是多,有些眼花缭乱了。在单个的基础上,再新加两三个叫做丰富,再多就未必是好事,反而会令人缩手新闻片脚,无从定夺。多数 Controller 都是只完成一个任务,不过也有一个像 Struts 的 DispatchAction 的那样的 Conntroller,org.springframework.web.servlet.mvc.multiaction.MultiActionController,意即在一个 Controller 中处理多个动作,如同一个业务的增、删、改可以放在一起了。不至于增、删、改各自为政,造成代码混乱、重复难以维护。

本文中的 web.xml 的 org.springframework.web.servlet.DispatcherServlet 所处理的 url-pattern 是 *.html,如何搭建 Spring MVC 项目不细加说明,可参考我前面同系列的文章。

例如,下面的 UserController,有两个签名一样的 updateUser() 和 deleteUser() 方法 阅读全文 >>

Unmi 学习 Groovy 之模板

提起模板,在 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 引擎,可惜现在还没有。 阅读全文 >>

为 JDOM 解析 XML 文件成 Document 加速

本篇讲述在 XML 中使用了 DTD 的情况下,用 JDOM 解析时如何加速,使用 Schema 验证 XML 的不在讨论之中。所用的是一个 Struts 1.3 的配置文件,大小为 102 K。

我们用 JDOM 解析 XML 最简单的代码莫过于以下两行代码,不过为了测试我们在其前后加上记录执行时间的代码:

在这个 struts-config.xml 中的 DTD 声明如下: 阅读全文 >>

Unmi 学习 Groovy 之 Groovlet

在 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 一样的效果。 阅读全文 >>

用 Spring MVC 来处理向导式复杂表单

引子

我们在网上经常会碰到一些向导式的表单页面,比如 第一步 >> 第二步 >> 第三步…、基本信息 >> 联系方式 >> 兴趣爱好…。它们都是按类型分到多个有序的页面要你来完成填写的。当然,你也可以把它们全部罗列在一个页面里,那样用户就会感觉茫茫然,分不清主次,可能不会很好的予以配合。

然而像 Struts、WebWork 那样的 MVC 框架未提供类似的实现,都需自己采用某种方式来实现向导,可以用层的隐现方式,或逐步把填写的部分数据放 Session 中,最后汇总处理。幸运的是 Spring MVC 考虑到了这种应用需求,它提供了一个 org.springframework.web.servlet.mvc.AbstractWizardFormController 来满足你。 阅读全文 >>

Unmi 的 Struts2 学习笔记(十七)

当个人在撒谎时尚有害臊与尺度;而在代表着某一群体利益时,因其无具体担责人,故能弥天却不知廉耻,瞒得了众人吗?非也,只因暂无处述说罢。

Unmi 学习 Groovy 之多线程

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 类中增加了两个方法,分别是: 阅读全文 >>