天天看點

AppFuse項目筆記(1)

AppFuse項目筆記(1)

一、Appfuse簡介

參考資料:

二、Appfuse架構快速入門

AppFuse項目的主要目的是幫助開發人員減少在開始一個項目時所要做的工作。以下是使用它建立一個項目的基本步驟:

1、下載下傳或從CVS (cvs -d :pserver:[email protected]:/cvs co appfuse)檢出appfuse最新版本之源碼。

2、安裝J2SE 1.4+, 正确設定JAVA_HOME環境變量, 安裝Ant 1.6.2+, 設定ANT_HOME環境變量。

3、安裝MySQL 3.23.x+ (建議使用 4.1.7版本)和Tomcat 4.1.x+ (建議使用 5.0.28版本),設定CATALINA_HOME環境變量指向你Tomcat安裝目錄。

注意: 如果你準備使用MySQL 4.1.7,那麼你必須将其預設的字元集設定為UTF-8字元集,并且将其預設的表類型設定為InnoDB類型。也就是說,你要在你的c:\Windows\my.ini 或者/etc/my.cnf 檔案中添加以下幾行:

[mysqld]

default-character-set=utf8

default-table-type=innodb

4、安裝一個本地的SMTP伺服器,或者如果你已經有一個可用的SMTP伺服器的話,你可以去修改mail.properties (在web/WEB-INF/classes目錄下) 和build.properties (在根目錄下 -- 為 log4j資訊) 以指向你的SMTP伺服器 - 預設地它是指向你的本機的SMTP伺服器的。

5、将lib/junit3.8.1/junit.jar檔案拷貝到$ANT_HOME/lib目錄下。

6、執行 ant new -Dapp.name=YOURAPPNAME -Ddb.name=YOURDBNAME 指令。這将建立一個名為“YOURAPPNAME”的目錄。

警告: 該指令對于某些app.name值将不執行 - 不要使用 "test",任何包含 "appfuse" 在其中的名你,或者任何以數字、兩個存折号(-) 等等混合出來的名稱。

7、轉到新的目錄,執行ant的setup任務建立資料庫,同時将你的應用釋出到Tomcat伺服器上。隻有當你的root使用者沒有密碼建庫的任務才會工作。你也可以在需要的時候打開build.properties檔案去更改這root使用者的密碼。如果你想進行測試并且希望了解是否所有方面均可以工作完好,那麼你可以執行ant的test-all任務進行全面的測試 -當然前提是當你做測試的時候先将Tomcat伺服器停止。

8、執行ant的test-reports任務 - 當這個任務執行完後,會有一條消息告訴你如何檢視那些産生的測試報告。

當你确定你通過以上步驟配置好你的AppFuse開發環境後 - 下面你需要做的事就是學習一下指南來了解如何使用 AppFuse 進行你的開發。

可選擇的安裝

如果你願意選擇用iBATIS做為你的持久層架構,請專門去看一下extras/ibatis目錄下的 README.txt 檔案。

如果你願意選擇用Spring做為你的WEB層架構,請專門去看一下extras/spring目錄下的 README.txt 檔案。

如果你願意選擇用WebWork做為你的WEB層架構,請專門去看一下extras/webwork目錄下的 README.txt 檔案。

如果你願意選擇Tapestry做為你的web層架構,請專門去看一下extras/tapestry目錄下的 README.txt 檔案。

如果你願意選擇JSF做為你的web層架構,請專門去看一下extras/jsf目錄下的 README.txt 檔案。

 

如果你希望你能夠通過腳本來自動地完成建立和測試,那麼可以參考以下的腳本:

rm -r ../appfuse-spring

ant new -Dapp.name=appfuse-spring -Ddb.name=ibatis

cd ../appfuse-spring

ant install-ibatis install-springmvc

cd extras/ibatis

ant uninstall-hibernate

cd ../..

ant setup

ant test-all test-reports

如果你并不想安裝iBATIS, Spring MVC 或者 WebWork,在你将你的項目放入代碼控制倉庫前你應該删除掉它們在extras目錄中的安裝内容。

--------------------------------------------------------------------------------

通常當你完成了以上所有步驟并使它們可以工作後,最可能的事是你會希望把“org.appfuse”包名,改為類似“com.company”這樣的包名。現在做這件事已經非常簡單了,所有你需要做的事就是下載下傳一個改包名的工具,看看它的README檔案,以了解它的安裝和使用。

注意: 使用這個工具前你最好是将你的項目做一個備份,進而保證能夠恢複它。

如果你将org.appfuse.webapp.form包改為如test.web.form這樣的包名,你得同時去修改一下src/service包中的ConverterUtil類,getOpposingObject方法是你的朋友,讓我們來看一下:

name = StringUtils.replace(name, "model", "webapp.form");

name = StringUtils.replace(name, "webapp.form", "model");

三、AppFuse 開發指南

如果你已經下載下傳了AppFuse并且想在你的機器上安裝它,你最好按照快速入門中的步驟進行安裝。一旦你已經将所有的内容安裝好後,以下的指南是你學習如何使用AppFuse進行開發的最好的教程。

注意: 這個開發指南在AppFuse的釋出版本中同樣包含一份,如果你想更新在你的工程中的那份拷貝(它在docs目錄中),可以通過執行 "ant wiki"來完成。

對于AppFuse 1.6.1, 你能夠本指南中告訴你的方法生成大部分代碼。如果你正在使用的是Struts+Hibernate這樣一個組合,你甚至可以完全生成它們。而如果你的web層架構選擇了Spring或者WebWork就不那麼幸運了, 對于它們來說要寫一個自動化的安裝腳本存在許多困難,是以你就不得不自己動手來配置那些Controllers和Actions了。這主要是因為我沒有對這些web層架構使用XDoclet,同時也是由于使用Ant工具作為安裝工具的局限性所緻。自動生成代碼的工具我稱之為 AppGen ,我在 Part I 中講解如何使用它。

Part I: 在AppFuse中建立新的 DAOs 和對象 - 這是一個關于如何建立一個基于資料為中表的Java對象以及如何建立Java類進而持久化對象到資料庫中的教程。

1、關于這個指南:

本指南将向你展示如何在資料庫中建立一個新的表,以及如何建立通路這個表的Java代碼。

我們将建立一個對象和一些其他的類來将這個對象持久化(儲存、裝載、删除)到資料庫中。用 Java 的語言來說,我們稱這個對象是一個POJO對象(Plain Old Java Object ),這個對象基本上與資料庫中的某張表是相對應的,其他的類将是:

一個資料通路對象(也稱為是一個DAO),一個接口,一個 Hibernate 實作類。

一個 JUnit 類,用來測試我們的 DAO 對象是否可以正确工作。

注意:如果你是在使用 MySQL 并且如果你想要使用事務 (一般說來你肯定會選擇使用的),那麼你必須将 table-type設定為 InnoDB。你可以這樣做,将下面的内容加到你的 mysql 配置檔案 (/etc/my.cnf or c:\Windows\my.ini) 中。第二個設定(用來設定UTF-8字元集)是mysql 4.1.7+所需要的。

如果你使用 PostgreSQL 遇到批處理發生混淆的錯誤,可以試着在你的src/dao/**/hibernate/applicationContext-hibernate.xml檔案中加入0配置來關閉批處理。

AppFuse 使用 Hibernate 作為它預設的持久層。 Hibernate 是一個對象關系映射架構,它使你将你的Java對象與資料庫的表建立起一種映射。使你可以很容易地在你的對象上執行CRUD (Create, Retrieve, Update, Delete) 操作。

你也同樣可以使用iBATIS 作為持久層的另一個可能的選擇。如果要在 AppFuse安裝iBATIS,請看一下extras/ibatis目錄中的 README.txt 檔案。如果你想用 iBATIS 替換 Hibernate,我希望你是有足夠的理由并且你應該對它是熟悉的。我也希望你能夠針對如何在AppFuse中使用iBATIS 為本指南提出好的建議。 ;-)

下面我将用文字來告訴你在實際的開發過程中我是如何做的。

讓我們從在AppFuse項目結構中建立一個新的對象,一個DAO和一個測試用例來開始。

内容清單

[1] 建立一個新的對象并且加入 XDoclet 标簽

[2] 使用Ant,基于我們建立的對象建立一個新的資料庫表

[3] 建立一個新的 DAOTest 以便對于DAO 進行JUnit測試

[4] 建立一個新的 DAO 對于我們這個對象執行 CRUD 操作

[5] 為Person對象和PersonDAO配置Spring配置檔案

[6] 運作 DAOTest 進行測試

我們需要做的第一件事就是建立一個對象去持久化它。讓我們建立一個簡單 "Person" 對象 (建立到 src/dao/**/model 目錄中) ,我們讓它有一個 id, 一個 firstName 和一個 lastName (作為這個對象的屬性)。

package org.appfuse.model;

public class Person extends BaseObject {

private Long id;

private String firstName;

private String lastName;

/*

Generate your getters and setters using your favorite IDE:

In Eclipse:

Right-click -> Source -> Generate Getters and Setters

*/

}

這個類應該繼承自 BaseObject,由于BaseObject有 3 個抽象方法: (equals(), hashCode() and toString()) ,是以你必須在這個Person類中實作它們。前兩個方法是 Hibernate 要求的,最簡單的方法是使用工具(如:Commonclipse)來完成它,如果你想知道關于使用這個工具的更多的資訊你可以去Lee Grey的網站去找。另外一個你可以使用的工具是Commons4E,它是一個 Eclipse Plugin ,我沒有用過,是以我無法告訴你它有什麼功能。

如果你使用的是 IntelliJ IDEA ,你可以生成 equals() 和 hashCode(),但是生成不了 toString(),當然有一個 ToStringPlugin,但我從來沒有親自用過。

現在我們已經有了一個建立好的 POJO ,我們需要在裡面加上 XDoclet 标簽以便由它生成 Hibernate 映射檔案。這個映射檔案是讓 Hibernate 來映射對象到表,映射屬性到表的列的。

首先,我們加入一個 @hibernate.class 标簽,這個标簽告訴 Hibernate 這個對象将映射哪一張表:

/**

* @hibernate.class table="person"

我們也必須加一個主鍵映射,否則當生成映射檔案的時候XDoclet将出現錯誤。注意所有這些@hibernate.* 标簽應該放置在你的POJO對象的 getter方法的 Javadocs 位置。

* @return Returns the id.

* @hibernate.id column="id"

* generator-class="increment" unsaved-value="null"

public Long getId() {

return this.id;

我使用 generator-class="increment" 代替 generate-class="native" ,因為我發現當在其他一些資料庫上使用"native"時存在一些問題。如果你隻打算使用MySQL,我推薦你使用"native",而我們的這個指南使用“increment”。

你可以通過運作"ant setup-db"來建立person表。這個任務建立一方面會建立Person.hbm.xml檔案,另一方面可以在資料庫中建立一張"person"表。從ant的控制台,你可以看到Hibernate為你建立的表模型:

[schemaexport] create table person (

[schemaexport] id bigint not null,

[schemaexport] primary key (id)

[schemaexport] );

如果你想看一下Hibernate為你生成的 Person.hbm.xml 檔案的内容,你可以去 build/dao/gen/**/model 目錄去看,下面我列出其内容:

"-//Hibernate/Hibernate Mapping DTD 2.0//EN"

name="org.appfuse.model.Person"

table="person"

dynamic-update="false"

dynamic-insert="false"

>

name="id"

column="id"

type="java.lang.Long"

unsaved-value="null"