使用 AppFuse 的七个理由

mvn -e  archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts-archetype -DarchetypeVersion=3.5.0 -DgroupId=net.novogrodsky -DartifactId=myprojecthtml

 

http://www.ibm.com/developerworks/cn/java/j-appfuse/java

 

AppFuse 是一个开放源码的项目和应用程序,它使用了在 Java 平台上构建的开放源码工具来帮助咱们快速而高效地开发 Web 应用程序。我最初开发它是为了减小在为客户构建新 Web 应用程序时所花费的那些没必要要的时间。从核心上来讲,AppFuse 是一个项目骨架,相似于经过向导建立新 Web 项目时 IDE 所建立的东西。当咱们使用 AppFuse 建立一个项目时,它会提示咱们将使用开放源码框架,而后才建立项目。它使用 Ant 来驱动测试、代码生成、编译和部署。它提供了目录和包结构,以及开发基于 Java 语言的 Web 应用程序所须要的库。程序员

与大部分 “new project” 向导不一样,AppFuse 建立的项目从最开始就包含不少类和文件。这些文件用来实现特性,不过它们同时也会在您开发应用程序时被用做示例。经过使用 AppFuse 启动新项目,咱们一般能够减小一到两周的开发时间。咱们不用担忧如何将开放源码框架配置在一块儿,由于这都已经完成了。咱们的项目都已提早配置来与数据库进 行交互,它会部署到应用服务器上,并对用户进行认证。咱们没必要实现安全特性,由于这都早已集成了。web

当我最初开发 AppFuse 时,它只支持 Struts 和 Hibernate。通过几年的努力,我发现了比 Struts 更好的 Web 框架,所以我还添加了为这些 Web 框架使用的选项。如今,AppFuse 能够支持 Hibernate 或 iBATIS 做为持久性框架。对于 Web 框架来讲,咱们可使用 JavaServer Faces(JSF)、Spring MVC、Struts、Tapestry 或 WebWork。spring

AppFuse 提供了不少应用程序须要的一些特性,包括:数据库

  • 认证和受权
  • 用户管理
  • Remember Me(这会保存您的登陆信息,这样就不用每次都再进行登陆了)
  • 密码提醒
  • 登记和注册
  • SSL 转换
  • E-mail
  • URL 重写
  • 皮肤
  • 页面修饰
  • 模板化布局
  • 文件上载

这种 “开箱即用” 的功能是 AppFuse 与其余 CRUD 代 框架的区别之一(CRUD 取自建立、检索、更新删除 几个操做的英文首字母),包括 Ruby on Rails、Trails 和 Grails。上面提到的这些框架,以及 AppFuse,都让咱们能够从数据库表或现有的模型对象中生成主页/细节页。apache

图 1 阐述了一个典型 AppFuse 应用程序的概念设计:安全

图 1. 典型的 AppFuse 应用程序

典型的 AppFuse 应用程序

清单 1 给出了咱们在建立 devworks 项目时所使用的命令行交互操做,同时还给出了所生成的结果。这个项目使用了 WebWork 做为本身的 Web 框架(请参考下面 参考资料 一节给出的连接)。服务器

清单 1. 使用 AppFuse 建立新项目
alotta:~/dev/appfuse mraible$ ant new
Buildfile: build.xml

clean:
     [echo] Cleaning build and distribution directories

init:

new:
     [echo] 
     [echo] +-------------------------------------------------------------+
     [echo] |    -- Welcome to the AppFuse New Application Wizard! --     |
     [echo] |                                                             |
     [echo] | To create a new application, please answer the following    |
     [echo] | questions.                                                  |
     [echo] +-------------------------------------------------------------+

    [input] What would you like to name your application [myapp]?
devworks
    [input] What would you like to name your database [mydb]?
devworks
    [input] What package name would you like to use [org.appfuse]?
com.ibm
    [input] What web framework would you like to use [webwork,tapestry,spring,js
f,struts]?
webwork
     [echo] Creating new application named 'devworks'...
     [copy] Copying 359 files to /Users/mraible/Work/devworks
     [copy] Copying 181 files to /Users/mraible/Work/devworks/extras
     [copy] Copying 1 file to /Users/mraible/Work/devworks
     [copy] Copying 1 file to /Users/mraible/Work/devworks

install:
     [echo] Copying WebWork JARs to ../../lib
     [copy] Copying 6 files to /Users/mraible/Work/devworks/lib
     [echo] Adding WebWork entries to ../../lib.properties
     [echo] Adding WebWork classpath entries
     [echo] Removing Struts-specific JARs
   [delete] Deleting directory /Users/mraible/Work/devworks/lib/struts-1.2.9
   [delete] Deleting directory /Users/mraible/Work/devworks/lib/strutstest-2.1.3
     [echo] Deleting struts_form.xdt for XDoclet
   [delete] Deleting directory /Users/mraible/Work/devworks/metadata/templates
     [echo] Deleting Struts merge-files in metadata/web
   [delete] Deleting 7 files from /Users/mraible/Work/devworks/metadata/web
     [echo] Deleting unused Tag Libraries and Utilities
   [delete] Deleting 2 files from /Users/mraible/Work/devworks/src/web/org/appfu
se/webapp
     [echo] Modifying appgen for WebWork
     [copy] Copying 12 files to /Users/mraible/Work/devworks/extras/appgen
     [echo] Replacing source and test files
   [delete] Deleting directory /Users/mraible/Work/devworks/src/web/org/appfuse/
webapp/form
   [delete] Deleting directory /Users/mraible/Work/devworks/src/web/org/appfuse/
webapp/action
     [copy] Copying 13 files to /Users/mraible/Work/devworks/src
   [delete] Deleting directory /Users/mraible/Work/devworks/test/web/org/appfuse
/webapp/form
   [delete] Deleting directory /Users/mraible/Work/devworks/test/web/org/appfuse
/webapp/action
     [copy] Copying 5 files to /Users/mraible/Work/devworks/test
     [echo] Replacing web files (images, scripts, JSPs, etc.)
   [delete] Deleting 1 files from /Users/mraible/Work/devworks/web/scripts
     [copy] Copying 34 files to /Users/mraible/Work/devworks/web
   [delete] Deleting: /Users/mraible/Work/devworks/web/WEB-INF/validator-rules-c
ustom.xml
     [echo] Modifying Eclipse .classpath file
     [echo] Refactoring build.xml
     [echo] ----------------------------------------------
     [echo] NOTE: It's recommended you delete extras/webwork as you shouldn't ne
ed it anymore.
     [echo] ----------------------------------------------
     [echo] Repackaging info written to rename.log
     [echo] 
     [echo] +-------------------------------------------------------------+
     [echo] |           -- Application created successfully! --           |
     [echo] |                                                             |
     [echo] | Now you should be able to cd to your application and run:   |
     [echo] | > ant setup test-all                                        |
     [echo] +-------------------------------------------------------------+

BUILD SUCCESSFUL
Total time: 15 seconds

为何使用 WebWork?

Struts 社区最近在热情地拥抱 WebWork,这种结合致使为 Java 平台提供了一个很是优秀的新 Web 框架:Struts 2。固然,Spring MVC 是一个很是优秀的基于请求的框架,可是它不能像 Struts 2 同样支持 JSF。基于内容的框架(例如 JSF 和 Tapestry)也都很好,可是我发现 WebWork 更为直观,更容易使用(更多有关 Structs 2 和 JSF 的内容请参看 参考资料)。session

在建立一个新项目以后,咱们就获得了一个相似于图 2 所示的目录结构。Eclipse 和 Intellij IDEA 项目文件都是做为这个过程的一部分建立的。

图 2. 项目的目录结构

项目的目录结构

这 个目录结构与 Sun 为 Java 2 Platform Enterprise Edition(J2EE)Web 应用程序推荐的目录结构很是相似。在 2.0 版本的 AppFuse 中,这个结构会变化成适合 Apache Maven 项目的标准目录结构(有关这两个目录介绍的内容,请参看 参考资料 中的连接)。AppFuse 还会从 Ant 迁移到 Maven 2 上,从而得到相关下载的能力和对生成 IDE 项目文件的支持。目前基于 Ant 的系统要求提交者维护项目文件,而 Maven 2 能够经过简单地使用项目的 pom.xml 文件生成 IDEA、Eclipse 和 NetBeans 项目文件。(这个文件位于您项目的根目录中,是使用 Maven 构建应用程序所须要的主要组件)。它与利用 Ant 所使用的 build.xml 文件很是相似。)

如今咱们对 AppFuse 是什么已经有一点概念了,在本文剩下的部分中,咱们将介绍使用 AppFuse 的 7 点理由。即便您选择不使用 AppFuse 来开始本身的项目,也会看到 AppFuse 能够为您提供不少样板代码,这些代码能够在基于 Java 语言的 Web 应用程序中使用。因为它是基于 Apache 许可证的,所以很是欢迎您在本身的应用程序中重用这些代码。

理由 1:测试

测试是在软件开发项目中不多被 给予足够信任的一个环节。注意我并非说在软件开发的一些刊物中没有获得足够的信任!不少文章和案例研究都给出了测试优先的开发方式和足够的测试覆盖面以 提升软件的质量。然而,测试一般都被看做是一件只会延长项目开发时间的事情。实际上,若是咱们使用测试优先的方法在编写代码以前就开始撰写测试用例,我相 信咱们能够发现这实际上会加速 开发速度。另外,测试优先也可使维护和重用更加 容易。若是咱们不编写代码来测试本身的代码,那么就须要手工对应用程序进行测试 —— 这一般效率都不高。自动化才是关键。

当咱们首次开始使用 AppFuse 时,咱们可能须要阅读这个项目 Web 站点上提供的快速入门指南和教程(请参看 参考资料 中的连接)。这些教程的编写就是为了您能够首先编写测试用例;它们直到编写接口和/或实现以后才能编译。若是您有些方面与我同样,就会在开始编写代码以前 就已经编写好测试用例了;这是真正能够加速编写代码的唯一方式。若是您首先编写了代码的实现,经过某种方式验证它能够工做,那么您可能会对本身说,“哦, 看起来不错 —— 谁须要测试呢?我还有更多的代码须要编写!”这种状况不幸的一面是您一般都会作一些事情 来测试本身的代码;您简单地跳过了能够自动化进行测试的地方。

AppFuse 的文档展现了如何测试应用程序的全部 层次。它从数据库层开始入手,使用了 DbUnit(请参看 参考资料)在运行测试以前提早使用数据来填充本身的数据库。在数据访问(DAO)层,它使用了 Spring 的 AbstractTransactionalDataSourceSpringContextTests 类(是的,这的确是一个类的名字!)来容许简单地加载 Spring 上下文文件。另外,这个类对每一个 testXXX() 方法封装了一个事务,并当测试方法存在时进行回滚。这种特性使得测试 DAO 逻辑变得很是简单,而且不会对数据库中的数据形成影响。

在服务层,jMock (请参看 参考资料)用来编写那些能够消除 DAO 依赖的真正 单元测试。这容许进行验证业务逻辑正确的快速测试;咱们不用担忧底层的持久性逻辑。

HtmlUnit 支持

HtmlUnit 团队在 1.8 发行版中已经完成了至关多的工做来确保包能够与流行的 Ajax 框架(Prototype 和 Scriptaculous)很好地工做。

在 Web 层,测试会验证操做(Struts/WebWork)、控件(Spring MVC)、页面(Tapestry)和管理 bean(JSF)如咱们所指望的同样进行工做。Spring 的 spring-mock.jar 能够很是有用地用来测试全部这些框架,由于它包含了一个 Servlet API 的仿真实现。若是没有这个有用的库,那么测试 AppFuse 的 Web 框架就会变得很是困难。

UI 一般是开发 Web 应用程序过程当中最为困难的一部分。它也是顾客最常常抱怨的地方 —— 这既是因为它并非很是完美,也是因为它的工做方式与咱们指望的并不同。另外,没有什么会比在客户面前做演示的过程当中看到看到异常堆栈更糟糕的了!您的 应用程序可能会很是可怕,可是客户可能会要求您作到十分完美。永远不要让这种事情发生。Canoo WebTest 能够对 UI 进行测试。它使用了 HtmlUnit 来遍历测试 UI,验证全部的元素都存在,并能够填充表单的域,甚至能够验证一个假想的启用 Ajax 的 UI 与咱们预期的工做方式同样。(有关 WebTest 和 HTMLUnit 的连接请参看 参考资料。)

为了进一步简化 Web 的测试,Cargo(请参看 参考资料)对 Tomcat 的启动和中止(分别在运行 WebTest 测试以前和以后)进行了自动化。

理由 2:集成

正如我在本文简介中提到的同样,不少开放源码库都已经预先集成到 AppFuse 中了。它们能够分为如下几类:

  • 编译、报告和代码生成:Ant、Ant Contrib Tasks、Checkstyle、EMMA、Java2Html、PMD 和 Rename Packages
  • 测试框架:DbUnit、Dumbster、jMock、JUnit 和 Canoo WebTest
  • 数据库驱动程序:MySQL 和 PostgreSQL
  • 持久性框架:Hibernate 和 iBATIS
  • IoC 框架:Spring
  • Web 框架:JSF、Spring MVC、Struts、Tapestry 和 WebWork
  • Web 服务:XFire
  • Web 工具:Clickstream、Display Tag、DWR、JSTL、SiteMesh、Struts Menu 和 URL Rewrite Filter
  • Security:Acegi Security
  • JavaScript 和 CSS:Scriptaculous、Prototype 和 Mike Stenhouse 的 CSS Framework

除 了这些库以外,AppFuse 还使用 Log4j 来记录日志,使用 Velocity 来构建 e-mail 和菜单模板。Tomcat 能够支持最新的开发,咱们可使用 1.4 或 5 版本的 Java 平台来编译或构建程序。咱们应该能够将 AppFuse 部署到任何 J2EE 1.3 兼容的应用服务器上;这已经通过了测试,咱们知道它在全部主要版本的 J2EE 服务器和全部主要的 servlet 容器上均可以很好地工做。

图 3 给出了上面建立的 devworks 项目的 lib 目录。这个目录中的 lib.properties 文件控制了每一个依赖性的版本号,这意味着咱们能够简单地经过把这些包的新版本放到这个目录中并执行诸如 ant test-all -Dspring.version=2.0 之类的命令来测试这些包的新版本。

图 3. 项目依赖性

AppFuse 项目依赖性

预先集成这些开放源码库能够在项目之初极大地提升生产效率。尽管咱们能够找到不少文档介绍如何集成这些库,可是定制工做示例并简单地使用它来开发应用程序要更加简单。

除了能够简化 Web 应用程序的开发以外,AppFuse 让咱们还能够将 Web 服务简单地集成到本身的项目中。尽管 XFire 也在 AppFuse 下载中一块儿提供了,不过若是咱们但愿,也能够本身集成 Apache Axis(请参看 参考资料 中有关 Axis 集成的教程)。另外,Spring 框架和 XFire 能够一块儿将服务层做为 Web 服务很是简单地呈现出来,这就为咱们提供了开发面向服务架构的能力。

另 外,AppFuse 并不会将咱们限定到任何特定的 API 上。它只是简单地对可用的最佳开放源码解决方案从新进行打包和预先集成。AppFuse 中的代码能够处理这种集成,并实现了 AppFuse 的基本安全性和可用性特性。只要可能,就会减小代码,以便向 AppFuse 的依赖框架添加一个特性。例如,AppFuse 自带的 Remember Me 和 SSL 切换特性最近就由于相似的特性而从 Acegi Security 中删除了。

理由 3:自动化

Ant 使得简化了从编译到构建再到部署的自动化过程。Ant 是 AppFuse 中的一等公民,这主要是由于我发如今命令行中执行操做比从 IDE 中更加简单。咱们可使用 Ant 实现编译、测试、部署和执行任何代码生成的任务。

尽 管这种能力对于有些人来讲很是重要,可是它并不适用于全部的人。不少 AppFuse 用户目前都使用 Eclipse 或 Intellij IDEA 来构建和测试本身的项目。在这些 IDE 中运行 Ant 的确能够工做,可是这样作的效率一般都不如使用 IDE 内置的 JUnit 支持来运行测试效率高。

幸运的是,AppFuse 支持在 IDE 中运行测试,不过管理这种特性对于 AppFuse 开发人员来讲就变得很是困难了。最大的痛苦在于 XDoclet 用来生成 Hibernate 映射文件和 Web 框架所使用的一些工件(例如 ActionForms 和 Struts 使用的 struts-config.xml)。IDE 并不知道须要生成的代码,除非咱们配置使用 Ant 来编译它们,或者安装了一些能够认识 XDoclet 的插件。

这种对知识的缺少是 AppFuse 2.0 切换到 JDK 5 和 Maven 2 上的主要缘由。JDK 五、注释和 Struts 2 将让咱们能够摆脱 XDoclet。Maven 2 将使用这些生成的文件和动态类路径来生成 IDE 项目文件,这样对项目的管理就能够进行简化。目前基于 Ant 的编译系统已经为不一样的层次生成了一些工件(包括 dao.jar、service.jar 和 webapp.war),所以切换到 Maven 的模型上应该是一个很是天然的调整。

除了 Ant 以外(它对于编译、测试、部署和报告具备丰富的支持),对于 CruiseControl 的支持也构建到了 AppFuse 中。CruiseControl 是一个 Continuous Integration 应用程序,让咱们能够在源代码仓库中代码发生变化时自动运行全部的测试。extras/cruisecontrol 目录包含了咱们为基于 AppFuse 的项目快速、简单地设置 Continuous Integration 时所须要的文件。

设置 Continuous Integration 是软件开发周期中咱们首先要作的事情之一。它不但激发程序员去编写测试用例,并且还经过 “You broke the build!” 游戏促进了团队之间的合做和融合。

理由 4:安全特性和可扩展性

AppFuse 最初是做为我为 Apress 编写的书籍 Pro JSP 中示例应用程序的一部分开发的。这个示例应用程序展现了不少安全特性和用于简化 Struts 开发的特性。这个应用程序中的不少安全特性在 J2EE 的安全框图中都不存在。使用容器管理认证(CMA)的认证方法很是简单,可是 Remember Me、密码提示、SSL 切换、登记和用户管理等功能却都不存在。另外,基于角色的保护方法功能在非 EJB 环境中也是不可能的。

最初,AppFuse 使用本身的代码和用于 CMA 的解决方案彻底实现了这些特性。我在 2004 年年初开始学习 Spring 时就据说过有关 Acegi Security 的知识。我对 Acegi 所须要的 XML 的行数(175)与 web.xml 中所须要的 CMA 的行数(20)进行了比较,很快就决定丢弃 Acegi 了,由于它太过复杂了。

一年半以后 —— 在为另一本书 Spring Live 中编写了一章有关使用 Acegi Security 的内容以后 —— 我就改变了本身的想法。Acegi 的确(目 前仍然)须要不少 XML,可是一旦咱们理解了这一点,它其实是至关简单的。当咱们最终做出改变,使用 Acegi Security 的特性来所有取代 AppFuse 的特性以后,咱们最终删除了大量的代码。类之上的类都已经没有了,“Acegi handles that now” 中消失的部分如今所有进入了 CVS 的 Attic 中了。

Acegi Security 是 J2EE 安全模型中曾经出现过的最好模型。它让咱们能够实现不少有用的特性,这些特性在 Servlet API 的安全模型中都不存在:认证、受权、角色保护方法、Remember Me、密码加密、SSL 切换、用户切换和注销。它让咱们还能够将用户证书存储到 XML 文件、数据库、LDAP 或单点登陆系统(例如 Yale 的 Central Authentication Service (CAS) 或者 SiteMinder)中。

AppFuse 对不少与安全性相关的特性的实现从一开始都是很是优秀的。如今 AppFuse 使用了 Acegi Security,这些特性 —— 以及更多特性 —— 都很是容易实现。Acegi 有不少地方均可以进行扩充:这是它使用巨大的 XML 配置文件的缘由。正如咱们已经经过去年的课程对 Acegi 进行集成同样,咱们已经发现对不少 bean 的定义进行定制能够更加紧密地与 AppFuse 创建联系。

Spring IoC 容器和 Acegi Security 所提供的简单开发、容易测试的代码和松耦合特性的组合是 AppFuse 是这么好的一种开发平台的主要缘由。这些框架都是不可插入的,容许生成干净的可测试代码。AppFuse 集成了不少开放源码项目,依赖注入容许对应用程序层进行简单的集成。

理由 5:使用 AppGen 生成代码

有些人会将代码生成称为代码气味的散播(code smell)。在他们的观点中,若是咱们须要生成代码,那么极可能就会作一些错事。我倾向于这种肯定本身代码使用的模式和自动化生成代码的能力应该称为代码香味的弥漫(code perfume)。若是咱们正在编写相似的 DAO、管理器、操做或控件,而且不想为它们生成代码,那么这就须要根据代码的气味来生成代码。固然,当语言能够为咱们提供能够简化任务的特性时,一切都是那么美好;不过代码生成一般都是一个必需 —— 一般其生产率也很是高 —— 的任务。

AppFuse 中提供了一个基于 Ant 和 XDoclet 的代码生成工具,名叫 AppGen。默认状况下,常见的 DAO 和管理器均可以容许咱们对任何普通老式 Java 对象(POJO)进行 CRUD 操做,可是在 Web 层上这样作有些困难。AppGen 有几个特性能够用来执行如下任务:

  • (使用 Middlegen 和 Hibernate 工具)从数据库表中生成 POJO
  • 从 POJO 生成 UI
  • 为 DAO、管理器、操做/控制器和 UI 生成测试

在运行 AppGen 时,您会看到提示说 AppGen 要从数据库表或 POJO 中生成代码。若是在命令行中执行 ant install-detailed,AppGen 就会安装 POJO 特定的 DAO、管理器以及它们的测试。运行 ant install 会致使 Web 层的类重用通用的 DAO 和默认存在的管理器。

为了阐述 AppGen 是如何工做的,咱们在 devworks MySQL 数据库中建立了如清单 2 所示的表:

清单 2. 建立一个名为 cat 的数据库表
    create table cat (
      cat_id int(8) auto_increment,
      color varchar(20) not null,
      name varchar(20) not null,
      created_date datetime not null,
      primary key (cat_id)
    ) type=InnoDB;

在 extras/appgen 目录中,运行 ant install-detailed。这个命令的输出结果对于本文来讲实在太长了,不过咱们在清单 3 中给出了第一部分的内容:

清单 3. 运行 AppGen 的 install-detailed 目标
$ ant install-detailed
Buildfile: build.xml

init:
    [mkdir] Created dir: /Users/mraible/Work/devworks/extras/appgen/build
     [echo] 
     [echo] +-------------------------------------------------------+
     [echo] |             -- Welcome to the AppGen! --              |
     [echo] |                                                       |
     [echo] | Use the "install" target to use the generic DAO and   |
     [echo] | Manager, or use "install-detailed" to general a DAO   |
     [echo] | and Manager specifically for your model object.       |
     [echo] +-------------------------------------------------------+

    [input] Would you like to generate code from a table or POJO? (table,pojo)
table
    [input] What is the name of your table (i.e. person)?
cat
    [input] What is the name, if any, of the module for your table (i.e. organization)?

     [echo] Running Middlegen to generate POJO...

要对 cat 表使用这个新生成的代码,咱们须要修改 src/dao/com/ibm/dao/hibernate/applicationContext-hibernate.xml,来为 Hibernate 添加 Cat.hbm.xml 映射文件。清单 3 给出了咱们修改后的 sessionFactory bean 的样子:

清单 4. 将 Cat.hbm.xml 添加到 sessionFactory bean 中
    <bean id="sessionFactory" class="...">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources">
        <list>
            <value>com/ibm/model/Role.hbm.xml</value>
            <value>com/ibm/model/User.hbm.xml</value>
            <value>com/ibm/model/Cat.hbm.xml</value>
        </list>
    </property>
    ...
</bean>

在运行 ant setup deploy 以后,咱们就应该能够在部署的应用程序中对 cat 表执行 CRUD 操做了:

图 4. Cat 列表

所生成的主屏幕

图 5. Cat 表单

所生成的详细屏幕

咱们在上面的屏幕快照中看到的记录都是做为代码生成的一部分建立的,所以如今就有测试数据了。

理由 6:文档

咱们能够找到 AppFuse 各个风味的教程,而且它们都以 6 种不一样的语言给出了:中文、德语、英语、韩语、葡萄牙语和西班牙语。使用风味(flavor) 一词,个人意思是不一样框架的组合,例如 Spring MVC 加上 iBATIS、Spring MVC 加上 Hibernate 或 JSF 加上 Hibernate。使用这 5 种 Web 框架和两种持久框架,能够有好几种组合。有关它们的翻译,AppFuse 为本身的默认特性提供了 8 种翻译。可用语言包括中文、荷兰语、德语、英语、法语、意大利语、葡萄牙语和西班牙语。

除了核心教程以外,还添加了不少教程(请参看 参考资料) 来介绍与各类数据库、应用服务器和其余开放源码技术(包括 JasperReports、Lucene、Eclipse、Drools、Axis 和 DWR)的集成。

理由 7:社区

Apache 软件基金会对于开放源码有一个有趣的见解。它对围绕开放源码项目开发一个开放源码社区最感兴趣。它的成员相信若是社区很是强大,那么产生高质量的代码就是一个天然的过程。下面的内容引自 Apache 主页:

“咱们认为本身不只仅是一组共享服务器的项目,并且是一个开发人员和用户的社区。”

AppFuse 社区从 2003 年做为 SourceForge 上的一个项目(是 struts.sf.net 的一部分)启动以来,已经得到了极大的增加。经过在 2004 年 3 月转换到 java.net 上以后,它已经成为这里一个很是流行的项目,从 2005 年 1 月到 3 月成为访问量最多的一个项目。目前它仍然是一个很是流行的项目(有关 java.net 项目统计信息的连接,请参看 参考资料),不过在这个站点上它正在让位于 Sun 赞助的不少项目。

在 2004 年年底,Nathan Anderson 成为继我以后第一个提交者。此后有不少人都加入了进来,包括 Ben Gill、David Carter、Mika G?ckel、Sanjiv Jivan 和 Thomas Gaudin。不少现有的提交者都已经经过各类方式做出了本身的贡献,他们都帮助 AppFuse 社区成为一个迅速变化而且很是有趣的地方。

邮 件列表很是友好,咱们试图维护这样一条承诺 “没有问题是没有人理会的问题”。咱们的邮件列表归档文件中唯一一条 “RTFM” 是从用户那里发出的,而不是从开发者那里发出的。咱们绝对信奉 Apache 开放源码社区的哲学。引用我最好的朋友 Bruce Snyder 的一句话,“咱们为代码而来,为人们而留下”。目前,大部分开发者都是用户,咱们一般都喜欢有一段美妙的时间。另外,大部分文档都是由社区编写的;所以, 这个社区的知识是很是渊博的。

结束语

咱们应该尝试使用 AppFuse 进行开发,这是由于它容许咱们简单地进行测试、集成、自动化,并能够安全地生成 Web 应用程序。其文档很是丰富,社区也很是友好。随着其支撑框架愈来愈好,AppFuse 也将不断改进。

从 AppFuse 2.0 开始,咱们计划迁移到 JDK 5(仍然支持部署到 1.4)和 Maven 2 上去。这些工具能够简化使用 AppFuse 的开发、安装和升级。咱们计划充分利用 Maven 2 的功能来处理相关依赖性。咱们将碰到诸如 appfuse-hibernate-2.0.jar 和 appfuse-jsf-2.0.jar 之类的工件。这些工件均可以在 pom.xml 文件中进行引用,它们负责提取其余相关依赖性。除了在本身的项目中使用 AppFuse 基类以外,咱们还能够像普通的框架同样在 JAR 中对这些类简单地进行扩展,这应该会大大简化它的升级过程,并鼓励更多用户将本身但愿的改进提交到这个项目中。

若是没有其余问题,使用 AppFuse 可让您始终处于 Java Web 开发的技术前沿上 —— 就像咱们同样!

参考资料

学习

得到产品和技术

  • AppFuse on java.net:下载不一样风味的 AppFuse。
  • WebWork:了解这个易于使用的 Web 框架。
  • DbUnit:查看更多有关 JUnit 扩展的内容。
  • jMock:建立动态仿真对象来简化真正的单元测试。
  • Canoo WebTest:自动化 Web 应用程序的 UI 测试。
  • HtmlUnit:WebTest 的优秀 JavaScript 支持背后的基础。
  • Cargo:自动启动和中止容器。
  • Greenbox:一种代码生成框架。

讨论

相关文章
相关标签/搜索