本文不得轉載。
一.AppFuse簡介
Appfuse是一個開放源碼的項目和應用程序,它由Matt Raible 開發,它繼承了流行的Spring、Hibernate、ibatis、struts、Xdcolet、junit等基礎框架,并提供了對Taperstry和JSF等的支持。在用AppFuse開發時,用戶可以自由選擇Struts、Spring MVC、Webwork、Taperstry和JSF這幾個MVC框架。它采用測試驅動(TDD)的開發方式,使用JUnit測試各層。
它使用Ant來驅動測試、代碼生成、編譯和部署。在用AppFuse創建一個項目時,與大部分IDE提供的“new project”向導不同,它創建的項目最開始就包含很多的類和文件,這些文件用來實現特性。用AppFuse創建項目,減少了我們編寫繁瑣而枯燥的CRUD代碼所需的大部分時間,提高了我們的編碼效率。并且它提供了很多應用程序的一些特性:認證和授權、用戶管理、密碼提醒、登記和注冊、URL重寫、模塊化布局等功能,進一步提高了我們的效率。
二.AppFuse安裝
1. JDK的安裝
下載并安裝JDK1.5,并設定如下環境變量:
JAVA_HOME:jdk安裝的路徑,eg. C:\Program Files\Java\jdk
CLASSPATH:.;%JAVA_HOME%\lib
Path:在該變量中增加項:%JAVA_HOME%\bin
測試安裝是否成功的方法:在命令行中輸入:java –version,將輸出JDK的版本信息。
2. ANT的安裝
下載Ant并將其解壓到某目錄,eg. E:\apache-ant-
ANT_HOME:Ant的安裝路徑,eg. E:\apache-ant-
Path:在該變量中增加項:%ANT_HOME%\bin
測試安裝是否成功的方法:在命令行中輸入:ant –version,將輸出Ant的版本信息。
注意:為了AppFuse的正常工作,還需要將junit.jar包拷貝到%ANT_HOME%/lib目錄下。
3. Tomcat的安裝
下載并安裝Tomcat
CATALINA_HOME:E:\Tomcat
Path:在該變量中增加項:%CATALINA_HOME %\bin
測試安裝是否成功的方法:啟動Tomcat后,在瀏覽器中輸入如下地址:http://localhost:8080,將顯示Tomcat頁面。
4. mysql的安裝
安裝MySQL Server 5.0,設置字符集為UTF-8,設置如下環境變量:
MYSQL_HOME:MySQL的安裝路徑,eg. C:\Program Files\MySQL\MySQL Server 5.0
Path:在該變量中增加項:%MYSQL_HOME %\bin
5. AppFuse的安裝
在https://appfuse.dev.java.net/下載Appfuse。筆者下載的是
修改文件database.properties.reference為database.properties,并去掉你不用的數據庫的設置,保留你所使用的數據庫,并設置連接地址,用戶名和密碼等信息。
三.用AppFuse構建項目
1. 建立新的項目(ant new)
在命令行中進入appfuse所在目錄,輸入ant new命令,系統顯示如下信息:
E:\appfuse>ant new
Buildfile: build.xml
Trying to override old definition of datatype resources
……
[input] What would you like to name your application [myapp]? [myapp]
命令行提示輸入應用程序的名稱,例如輸入testAppfuse,要注意項目名稱不能使用"test"或者包含"appfuse"或者以數字開頭,命令行顯示如下語句提示輸入數據庫的名稱:
[input] What would you like to name your database [mydb]? [mydb]
輸入數據庫名appfuse,命令行顯示如下語句提示輸入包名:
[input] What package name would you like to use [org.appfuse]? [org.appfuse]
輸入包名org.amigo,命令行顯示選擇Web MVC框架:
[input] What web framework would you like to use [webwork,tapestry,spring,jsf,struts]? [struts]
輸入選擇的Web MVC框架struts,命令行顯示如下:
[echo] Creating new application named 'testAppFuse'...
[copy] Copying 358 files to E:\testAppFuse
……
BUILD SUCCESSFUL
Total time: 10 minutes 12 seconds
在末尾可看到BUILD SUCCESSFUL字樣,顯示操作成功。在appfuse同級目錄E:下,可看到新建的項目testAppFuse,在該目錄下生成了項目源碼。
2. 建立數據庫與編譯源碼(ant setup)
進入在1中建立的項目目錄E:\testAppFuse,運行ant setup,這一命令將會在MySql中創建前面指定的名稱的數據庫,并編譯源碼,打包發布到Tomcat中。
注意:AppFuse默認情況下認為數據庫的root帳號密碼為空,如果你給數據庫設置了密碼,需要修改根目錄下的properties.xml文件。搜索屬性名為database.admin.password的標簽,將value改寫為實際的數據庫密碼。
輸入ant setup后,顯示操作信息,末尾顯示“BUILD SUCCESSFUL”表示操作成功。該操作成功后,將會看到數據庫中新增了數據庫appfuse,包含app_user,role和user_role三個表。在CATALINA_HOME\webapps下新增了一個項目:testAppFuse。啟動Tomcat后,在瀏覽器中輸入:http://localhost:8080/testAppFuse,可看到登錄頁面。
3.使用 AppGen生成CRUD相關代碼(install-detailed)
AppGen 是AppFuse 中提供的一個基于 Ant 和 XDoclet 的代碼生成工具。默認情況下,常見的 DAO 和管理器都可以允許我們對任何普通老式 Java 對象(POJO)進行 CRUD 操作,但是在 Web 層上這樣做有些困難。
下面讓我們看看AppGen是如何工作的。
1)首先在第二步中創建的數據庫appfuse中創建friends表,建表語句如下:
create table friends ( address varchar(100) null, |
2)進入E:\testAppFuse\extras\appgen 目錄,運行ant install-detailed,顯示如下:
E:\testAppFuse\extras\appgen>ant install-detailed
Buildfile: build.xml
clean:
init:
[mkdir] Created dir: E:\testAppFuse\extras\appgen\build
……
[input] Would you like to generate code from a table or POJO? (table, pojo)
3)提示是從table還是從POJO產生代碼,輸入table,選擇從table生成代碼,屏幕輸出如下:
[input] What is the name of your table (i.e. person)?
4)提示輸入表名,輸入剛才創建的表的名字friends,輸出如下:
[input] What is the name, if any, of the module for your table (i.e. organiz
ation)?
5)提示輸入表的模塊的名字,若無,按Enter鍵,開始生成代碼。操作成功后可看到項目下已經生成對friends表的CRUD代碼。
6)要查看頁面來觀察結果,還需做如下操作:為 Hibernate 添加 Friend.hbm.xml 映射文件。方法如下:
將 Friend.hbm.xml 添加到E:\testAppFuse\src\dao\org\amigo\dao\hibernate下的applicationContext-hibernate.xml文件中,需修改sessionFactory bean:










7)運行 ant setup deploy
之后,我們可以在部署的應用程序中對 friends表執行 CRUD 操作,并且在friends表中,AppFuse已經為我們插入了測試數據。
四.AppFuse中的xdoclet
Xdoclet是一個自動生成代碼的工具。它的任務就是Ant的自定義任務。Xdoclet與Ant緊密關聯。它有兩個重要的組件:即進行特殊標記的Java 源文件和預先定義的模板。
Apache Ant 在運行的時候控制著 XDoclet 的配置和操作。XDoclet 解析輸入的 Java 源代碼,并在內存中生成結構模型。模板引擎通過處理一組模板和標簽處理器,生成輸出文件。
1.進行特殊標記的Java源文件
AppGen生成的文件缺少hbm.xml、Action Form Bean、web.xml、struts-config.xml和validation.xml等文件,那這些文件是怎么生成的呢?
原來,這些文件都是在我們執行ant setup命令時build.xml使用xdoclet自動生成的。 甚至連數據庫和表、表里的數據也可以自動生成。
XDoclet 對包含嵌入式 XDoclet 標簽的輸入 Java 源代碼進行解析,并為代碼建立非常詳細的結構模型。結構模型中的每個元素都代表源代碼中的一個 Java 結構。
查看User.java、Role.java以及Address.java發現,這些POJO文件中有很多注釋,有@hibernate開頭的,@struts開頭的,這些都是xdoctlet的標簽。AppFuse中主要用到的xdoclet標簽如下:
1)@struts.form:用來生成Form Bean。
include-all="true":表示該POJO中每一個屬性在Form Bean中都要有;
extends="BaseForm":表示生成的Form Bean文件要繼承BaseForm;@struts.form-field:表示該屬性要在FormBean中生成。如果我們要在FormBean中添加一些POJO沒有的屬性或方法怎么做呢?打開metadata\web文件夾,可以看到有一個xdoclet-UserForm.java文件,里面是User.java在生成Form Bean時新加入的代碼,我們同樣可以把我們自己在FormBean中增加的代碼新建到一個xdoclet-POJOFrom.java文件中就好了。
2)@struts.validator:用來生成validation.xml文件。
type="required":表示該屬性在表單中需要有必填的驗證。validation還有一項配置是自定義的校驗規則,使用正則表達式表示。metadata\web中有一個文件validation-global.xml,里面就有郵編等規則的配置。
3)@hibernate:用來生成hbm.xml文件。內容與hbm.xml基本一致。
4)@struts.action/@struts.action-forward:POJO不能生成struts-config.xml,這個標簽是要寫到Action中的。如果使用AppGen生成Action,你會看到@struts.action已經寫好了,這個標簽的作用就是生成當前Action在struts-config.xml中的映射代碼,寫法與struts-config.xml中一致,其實就是把xml中的配置移植到Action中。還有一個問題,如果我們要在struts-config.xml中進行與Action無關的全局的配置,如global-forwards呢?瀏覽metadata\web文件夾你會發現里面有多個xml文件,其中以global和struts開頭的文件就是寫這些配置的。build.xml在setup時會自動將這些文件聯合Action中的注釋生成一個完整的struts-config.xml文件。
接下來還有web.xml文件,它需要在metadata\web中配置。除了剛才提到的那些xml文件,剩下的基本都是用于配置web.xml的了。我們自定義的filter和listener是有具體類的,所以我們同樣可以在這些filter和listener類中添加注釋。
進行了所有配置后,運行ant setup,build.xml會生成對應的xml文件和form bean等,并在數據庫中創建相應的表。
2.預先定義的模版
XDoclet使用代碼模板來生成代碼。模板(template)是你想生成文件的原型。模板里使用一些XML標簽來指導模板引擎如何根據輸入類以及它們的元數據來調整代碼的生成。
模板包含文件和XML標簽,生成輸出文件時XML標簽會被解析,然后生成文本并顯示在XML標簽所處的位置上。除了以xdt為命名空間打頭的XML標簽會被XDoclet引擎解析以外,其余的XML標簽XDoclet會忽略不管。
AppFuse中用到很多預先定義的模版,例如,AppFuse中生成Action類的XDoclet模板,部分內容如下所示:



























在如上的模版中,可看到<XDtClass:className/>、<XDtForm:classNameLower/>等標簽,在生成代碼的時候,這些標簽會被解析,解析后在這些位置會填上對應的代碼。
五.總結
AppFuse是個大雜燴,在它里面有很多開源庫,主要分類如下:
編譯相關:Ant、Ant Contrib Tasks、Checkstyle、Java2Html、PMD 等
測試框架:DbUnit、jMock、JUnit 等
數據庫驅動程序:MySQL 和 PostgreSQL
持久層框架:Hibernate 和 iBATIS
IoC、AOP 框架:Spring
Web MVC框架:JSF、Spring MVC、Struts、Tapestry 和 WebWork
安全:Acegi Security
除了這些庫之外,AppFuse 還使用 Log4j 來記錄日志,使用 Velocity 來構建 e-mail 和菜單模板等。
另外,AppFuse 并不會將我們限定到任何特定的 API 上。它只是簡單地對可用的最佳開放源碼解決方案重新進行打包和預先集成。AppFuse 中的代碼可以處理這種集成,并實現了 AppFuse 的基本安全性和可用性特性。只要可能,就會減少代碼,以便向 AppFuse 的依賴框架添加一個特性。
從本文可以看來,AppFuse通過減少編寫CRUD代碼的時間,大大提高了我們編碼的效率,是我們開發項目時的好幫手。