AppFuse知识大全
AppFuse知识大全
开源框架之集大成 AppFuse
有很多关于J2EE 开发的初始教程。也有很多开放源码的Web应用开发工具。要决定使用哪一种技术是非常困难的—而实际开始使用它们却更加困难。一旦你决定使用Struts 和 Hibernate, 你将如何实现他们?如果你访问Hibernate和Struts的网站,也许你可以找到一些关于如何集成他们的信息。但是如果你又想再混和使用Spring呢? 作为一个开发人员,最好的学习方式就是开一些示例和教程,来解释这些东西如何扩展到实际应用。为了学习如何集成各种开源技术,比如Hibernate, Spring, Struts, 以及Ant/XDoclet, 创建了AppFuse。 AppFuse 的迷人之处在于你可以开始接触Hibernate, Spring, 以及Struts 而不用对他们了解甚多。使用测试驱动的开发, AppFuse 以及其教程叫告诉你如何快速有效的开发J2EE web 应用。
AppFuse的诞生
2002年早些时候,我想要获得一个合同,那时候我还是一个独立开发人员。我自己要完成所有的事情,从收集需求到创建数据库到前端的DHTML 页面。虽然我有多年的前端开发经验,Struts, HTML, 等等,但是业务逻辑对我来说却是新的。所以我不停的查找J2EE 模式来完成我的新客户的这个新工作。最后我实现了业务代表(Business Delegates), DAO, 和服务定为器(ServiceLocator) --这些都是在J2EE蓝图所述。当该合同完成的时候,我又获得一个新的差事,撰写一本关于JSP 2.0的书。出版商是Wrox ,书名是Professional JSP 2.0。我写了两章,一章是关于Struts,另一章是web 安全。
在撰写技术书籍的时候,一般都要使用例子程序来帮助说明概念。但是对于那些广泛传播的例子来说,我已经读够了。所以我决定写一个漂亮的,而且在写作晚了之后还能够使用的例子。起初的想法是能够有一个应用能够帮助我说明如何入门Struts以及使用XDoclet 来完成大量繁重的工作。它也必须具有很多安全特征,以便我能够将它用在我写作的另外一章,Web安全中。所以我开始开发struts-xdoclet。
数周后,我认为"struts-xdoclet" 难以说明,所以我将它命名为Appuse。我为Struts章节开发了一个示例程序StrutsResume。在发布Struts Resume之后,我需要提取一些素材来完成我想要的通用的起始程序AppFuse。它花了我差不多3个月,不过最终我在April 2003发布了AppUse的第一个正式版本。
从初始发布版本, AppFuse 已经进行了很多改动和改进。根据经验作了大量的技术决策。最令人痛苦的是让我的值对象(VO) 和ActionForms 保持同步,所以ActionsForm 我使用XDoclet来产生。我发现编写JDBC 是很令人乏味的事情,而更令人乏味的是在添加了新的数据库列之后更新SQL语句和VO。为了解决这个问题,我选择了使用 Hibernate 作为持久层,并使用Ant/XDoclet来动态创建数据库表。为了不丢失表中的数据,我集成了DBUnit, 他在每次单元测试的时候都可以手工使用。我决定使用Tomcat/MySQL 来作为默认的服务器和数据库,因为我最熟悉它们。我集成了大量的单元/继承测试,所以我必须进行测地的修改来校验所有的东西是否都能正确工作,包括JSP,这时通过ant test-all 的一个配置来实现的。
在 2004年3月,我将AppFuse 项目从SF转移到java.net.。有好些原因是我这样做。首先,它是SF的一个子项目,并且其用户基础增长很快。它需要专门的邮件列表和论坛。第二,java.net 好像在项目的推广方面很有特色,而且我听说他们的CVS 系统要稳定一些。我在java.net 的经验更加好,它是一个非常稳定的系统,管理员非常支持项目而且帮助推广它。
什么是AppFuse?
那么,介绍了这些历史之后,什么是AppFuse呢? 在其最核心的部分, AppFuse 是一个web 应用,你可以将其包装为一个.war 并且部署到一个J2EE 1.3-兼容的应用服务器。其设计师帮助你能够使用其build.xml文件中的新target创建一个新的项目。new target允许你指明一个新的项目名称,和数据库名称。一旦你创建了一个项目,你可以使用 ant setup创建MySQL数据库并将它部署到Tomcat 中。
此外,你可以使用ant test-all来校验你的新应用的基本功能。这样,你可以冷笑着说, "者有什么大不了的?每个人都可以创建一个.war 文件并部署到Tomcat." 。呵呵,我同意。但是你是否有一个setup-tomcat target 可以配置Tomcat 的JNDI 连接池资源和mail services? AppFuse 所作的大部分事情都不是造火箭的高科技。实际上,大不了是目录创建,构建文件,以及一系列基础类。但是它却大大的加速了开发高质量,良好测试的应用的开始。
AppFuse 试图尽可能的简化build, test, 和 deploy 应用的负担。它基本上消除了设置和配置的工作,这通常是比较麻烦的事情。而且像Ant, JUnit, XDoclet, Hibernate, 以及Spring 这样的工具是很难入门的。另外,像认证, 密码提示,"remember me," 用户注册,以及用户管理等几乎是每一个web 应用都需要的特征。AppFuse 还提供了一个教程,涉及到开发DAOs, business delegate, Struts actions(Spring controllers), 集成tiles 和validation, 以及使用基于Ant-的XDoclet 任务来从模型对象产生master/detail JSP 。它使用了一些灵活的标记苦,比如Struts Menu和Display Tag。
在我看来,其最好的部分,是他强调了Java 社区的理念和建议。目录结构和build 文件使用了Erik Hatcher 和Steve Loughran'的精彩书籍Java Development with Ant这本书。在这本书中,Erik构建了一个示例应用,这也激励了我使用Ant 和XDoclet – 并用在我的Struts 开发之中。
当我开始学习使用Hibernate时,我犯了很多错误。首先,我在每个DAO方法中都打开和关闭其会话对象。当Gavin 告诉我这是一个不好的想法,我才将它修改成使用OpenSessionInView 模式。我将每一个session object 传递到每一个方法体中,这件事社区中反复问我这样做的逻辑。我回答说: "我想让它们更加有效的工作—你有什么好主意吗?" 而更好的办法是让Session 作为是构造期的参数,这样他工作的很好。
接下来,去年,我发现Spring framework,并发现它是我看到的最漂亮的方案。使用它的ORM 支持,可以消除AppFuse中的一些Session 处理;因为Spring 可以优雅的处理它们。AppFuse 现在使用Spring'的OpenSessionInViewFilter。我所需要做的就是在web.xml中配置它,而它自己管理我的会话打开和关闭。在集成Spring 到AppFuse的表现层的时候,我删除了2,3个类,并将LOC减少到大约75%。以前遇到的所有Hibernate 问题都迎刃而解。另外,我也能够快速的添加使用iBATIS的DAO实现, 而该实现在前一年还是一个对象。在该项目中,我发现iBATIS 非常容易使用,并且在复杂的数据库方案下面也工作的很好。
AppFuse i不仅是你的Web应用的起跳点,也是一个展示集成Hibernate, Spring, 和Struts的例子。教程中具体说明了如何继承这些不同的开放源码组件。某种意义上说, AppFuse 是一个各种开源技术的粘合剂。在我发现Spring的时候,它非常的适合,因为它是一个粘合配置组件,以及不同层之间的送达耦合。Erik'的书已经说明了这种优势。Spring 大大简化了我对AppFuse 的开发而使我更加关注于最佳的J2EE实践。简言之,这时我所用的最好的J2EE工具。我也知道Spring 并不是J2EE 应用的终结者,因为以前的AppFuse 也运行得很好。但是,它有助于回答以前所有的"我应该怎样..."的问题,这就是妙药。
未来如何?
AppFuse 1.5在5月发布。其主要特征是可以使用Spring MVC 而不是Struts。所有的教程也都作了更新,以教育用户如何使用Spring (或Struts)。对 AppFuse 1.6, 我计划添加对WebWork 和 SiteMesh的支持,以及使其可以更加容易地在Eclipse 和IDEA.中运行单元测试。到年底,我希望添加对Tapestry 和JSF 作为是MVC 的支持特征。中间层和侯端 (Spring + Hibernate) 将不会变的太多。I现在他已经非常不错了。这并不是说我认为AppFuse 是完美的。我希望能够继续收到建议和反溃这样才能驱使我继续改进他。
当我发现有更新的和更容易的方法来开发Web应用,都会应用到AppFuse中。有人问我为什么AppFuse 不支持Middlegen. 原因很简单: 我从没用过,或者需要项目中使用Middlegen 。所以我看不出有何原因添加对它的支持。如果我有个项目使用过Middlegen, 你可以打赌我将会在AppFuse中添加对它的支持。最近,我开始使用Spring的 MVC 框架来代替Struts. 首先,我发现它比较难以理解,所以我用Spring MVC实现了Web层。因为web 层包含了其他很多用在Web应用中的特征,比如模板,校验,文件上传,意外处理等等,我通过集成来学习Spring MVC的来龙去脉。
使用和学习AppFuse 是一个跟踪器最新发布和期依赖项目的好方法。并且因为AppFuse的单元测试覆盖率,我可以很容易的测试新的版本。这也可能通过测试AppFuse来找出Tomcat 和 MySQL之类的Bug。随我来说,它就是一个测试最新开源项目版本的测试工具。
AppFuse Light
Equinox是AppFuse的一个轻量版本。你可以把它看成是Struts中的struts-blank和Spring 中的webapp-minimal应用。这个初学者版本对我来说,以为他还不够强装。只是想简化它,没有构建时的依赖性。
其设计理念是向开发者展示如何构建Spring Live中的QuickStart一章的骨架Struts/Spring/Hibernate 应用。未来会添加更多的功能。但主要目标还是关注于骨架的实现。
如何使用?
最好的办法是download它,并阅读QuickStart Guide. AppFuse是Java Enterprise Community的一个部分。其主页是appfuse.dev.java.net.