posts - 297,  comments - 1618,  trackbacks - 0
            原文出處:http://tech.it168.com/j/2007-08-27/200708271256784.shtml
            本文不得轉(zhuǎn)載。

          一.AppFuse簡介

             Appfuse是一個開放源碼的項目和應用程序,它由Matt Raible 開發(fā),它繼承了流行的SpringHibernateibatisstrutsXdcoletjunit等基礎框架,并提供了對TaperstryJSF等的支持。在用AppFuse開發(fā)時,用戶可以自由選擇StrutsSpring MVCWebworkTaperstryJSF這幾個MVC框架。它采用測試驅(qū)動(TDD)的開發(fā)方式,使用JUnit測試各層。

             它使用Ant來驅(qū)動測試、代碼生成、編譯和部署。在用AppFuse創(chuàng)建一個項目時,與大部分IDE提供的“new project”向?qū)Р煌鼊?chuàng)建的項目最開始就包含很多的類和文件,這些文件用來實現(xiàn)特性。用AppFuse創(chuàng)建項目,減少了我們編寫繁瑣而枯燥的CRUD代碼所需的大部分時間,提高了我們的編碼效率。并且它提供了很多應用程序的一些特性:認證和授權(quán)、用戶管理、密碼提醒、登記和注冊、URL重寫、模塊化布局等功能,進一步提高了我們的效率。

          二.AppFuse安裝

          1. JDK的安裝

           下載并安裝JDK1.5,并設定如下環(huán)境變量:

          JAVA_HOMEjdk安裝的路徑,eg. C:\Program Files\Java\jdk1.5.0

          CLASSPATH.;%JAVA_HOME%\lib

          Path:在該變量中增加項:%JAVA_HOME%\bin

          測試安裝是否成功的方法:在命令行中輸入:java –version,將輸出JDK的版本信息。

          2. ANT的安裝

           下載Ant并將其解壓到某目錄,eg. E:\apache-ant-1.6.5,設置如下環(huán)境變量:

           ANT_HOMEAnt的安裝路徑,eg. E:\apache-ant-1.6.5

           Path:在該變量中增加項:%ANT_HOME%\bin

          測試安裝是否成功的方法:在命令行中輸入:ant –version,將輸出Ant的版本信息。

          注意:為了AppFuse的正常工作,還需要將junit.jar包拷貝到%ANT_HOME%/lib目錄下。

          3. Tomcat的安裝

           下載并安裝Tomcat5.0.28到某目錄,eg. E:\Tomcat5.0.28,設置如下的環(huán)境變量:

           CATALINA_HOMEE:\Tomcat5.0.28

           Path:在該變量中增加項:%CATALINA_HOME %\bin

           測試安裝是否成功的方法:啟動Tomcat后,在瀏覽器中輸入如下地址:http://localhost:8080,將顯示Tomcat頁面。

          4. mysql的安裝

           安裝MySQL Server 5.0,設置字符集為UTF-8,設置如下環(huán)境變量:

           MYSQL_HOMEMySQL的安裝路徑,eg. C:\Program Files\MySQL\MySQL Server 5.0

           Path:在該變量中增加項:%MYSQL_HOME %\bin

          5. AppFuse的安裝

           https://appfuse.dev.java.net/下載Appfuse。筆者下載的是1.9.4版本。將其解壓到某目錄,eg. E:\appfuse

          修改文件database.properties.referencedatabase.properties,并去掉你不用的數(shù)據(jù)庫的設置,保留你所使用的數(shù)據(jù)庫,并設置連接地址,用戶名和密碼等信息。

          三.用AppFuse構(gòu)建項目

          1. 建立新的項目(ant new

           在命令行中進入appfuse所在目錄,輸入ant new命令,系統(tǒng)顯示如下信息:

          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"或者以數(shù)字開頭,命令行顯示如下語句提示輸入數(shù)據(jù)庫的名稱:

          [input] What would you like to name your database [mydb]? [mydb]

          輸入數(shù)據(jù)庫名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. 建立數(shù)據(jù)庫與編譯源碼(ant setup

             進入在1中建立的項目目錄E:\testAppFuse,運行ant setup這一命令將會在MySql中創(chuàng)建前面指定的名稱的數(shù)據(jù)庫,并編譯源碼,打包發(fā)布到Tomcat中。

          注意:AppFuse默認情況下認為數(shù)據(jù)庫的root帳號密碼為空,如果你給數(shù)據(jù)庫設置了密碼,需要修改根目錄下的properties.xml文件。搜索屬性名為database.admin.password的標簽,將value改寫為實際的數(shù)據(jù)庫密碼。

          輸入ant setup后,顯示操作信息,末尾顯示“BUILD SUCCESSFUL”表示操作成功。該操作成功后,將會看到數(shù)據(jù)庫中新增了數(shù)據(jù)庫appfuse,包含app_userroleuser_role三個表。在CATALINA_HOME\webapps下新增了一個項目:testAppFuse。啟動Tomcat后,在瀏覽器中輸入:http://localhost:8080/testAppFuse,可看到登錄頁面。

          3使用 AppGen生成CRUD相關(guān)代碼(install-detailed

          AppGen AppFuse 中提供的一個基于 Ant XDoclet 的代碼生成工具。默認情況下,常見的 DAO 和管理器都可以允許我們對任何普通老式 Java 對象(POJO)進行 CRUD 操作,但是在 Web 層上這樣做有些困難。

          下面讓我們看看AppGen是如何工作的。

          1)首先在第二步中創(chuàng)建的數(shù)據(jù)庫appfuse中創(chuàng)建friends表,建表語句如下:

          create table friends (
               
          friend_id int(8) auto_increment,
                name varchar(20) not null,
                gender varchar(20) not null,

          address varchar(100) null,
                created_date datetime not null,
                primary key (
          friend_id)
              ) type=InnoDB;

          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產(chǎn)生代碼,輸入table,選擇從table生成代碼,屏幕輸出如下:

          [input] What is the name of your table (i.e. person)?

          4)提示輸入表名,輸入剛才創(chuàng)建的表的名字friends,輸出如下:

          [input] What is the name, if any, of the module for your table (i.e. organiz

          ation)?

          5)提示輸入表的模塊的名字,若無,按Enter鍵,開始生成代碼。操作成功后可看到項目下已經(jīng)生成對friends表的CRUD代碼。

          6)要查看頁面來觀察結(jié)果,還需做如下操作: Hibernate 添加 Friend.hbm.xml 映射文件。方法如下:

          Friend.hbm.xml 添加到E:\testAppFuse\src\dao\org\amigo\dao\hibernate下的applicationContext-hibernate.xml文件中,需修改sessionFactory bean

          <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                  
          <property name="dataSource" ref="dataSource"/>
                  
          <property name="mappingResources">
                      
          <list>
                                
          <value>org/amigo/model/Friend.hbm.xml</value>  <value>org/amigo/model/Role.hbm.xml</value>
          <value>org/amigo/model/User.hbm.xml</value>
                      
          </list>
                  
          </property>
                  ……
              
          </bean>

          7運行 ant setup deploy 之后,我們可以在部署的應用程序中對 friends表執(zhí)行 CRUD 操作,并且在friends表中,AppFuse已經(jīng)為我們插入了測試數(shù)據(jù)。

          四.AppFuse中的xdoclet

          Xdoclet是一個自動生成代碼的工具。它的任務就是Ant的自定義任務。XdocletAnt緊密關(guān)聯(lián)。它有兩個重要的組件:即進行特殊標記的Java 源文件和預先定義的模板。

          Apache Ant 在運行的時候控制著 XDoclet 的配置和操作。XDoclet 解析輸入的 Java 源代碼,并在內(nèi)存中生成結(jié)構(gòu)模型。模板引擎通過處理一組模板和標簽處理器,生成輸出文件。

          1.進行特殊標記的Java源文件

          AppGen生成的文件缺少hbm.xmlAction Form Beanweb.xmlstruts-config.xmlvalidation.xml等文件,那這些文件是怎么生成的呢?

          原來,這些文件都是在我們執(zhí)行ant setup命令時build.xml使用xdoclet自動生成的。 甚至連數(shù)據(jù)庫和表、表里的數(shù)據(jù)也可以自動生成。

          XDoclet 對包含嵌入式 XDoclet 標簽的輸入 Java 源代碼進行解析,并為代碼建立非常詳細的結(jié)構(gòu)模型。結(jié)構(gòu)模型中的每個元素都代表源代碼中的一個 Java 結(jié)構(gòu)。
             
          查看User.javaRole.java以及Address.java發(fā)現(xiàn),這些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還有一項配置是自定義的校驗規(guī)則,使用正則表達式表示。metadata\web中有一個文件validation-global.xml,里面就有郵編等規(guī)則的配置。

          3@hibernate:用來生成hbm.xml文件。內(nèi)容與hbm.xml基本一致。
          4
          @struts.action/@struts.action-forwardPOJO不能生成struts-config.xml,這個標簽是要寫到Action中的。如果使用AppGen生成Action,你會看到@struts.action已經(jīng)寫好了,這個標簽的作用就是生成當前Actionstruts-config.xml中的映射代碼,寫法與struts-config.xml中一致,其實就是把xml中的配置移植到Action中。還有一個問題,如果我們要在struts-config.xml中進行與Action無關(guān)的全局的配置,如global-forwards呢?瀏覽metadata\web文件夾你會發(fā)現(xiàn)里面有多個xml文件,其中以globalstruts開頭的文件就是寫這些配置的。build.xmlsetup時會自動將這些文件聯(lián)合Action中的注釋生成一個完整的struts-config.xml文件。
             
          接下來還有web.xml文件,它需要在metadata\web中配置。除了剛才提到的那些xml文件,剩下的基本都是用于配置web.xml的了。我們自定義的filterlistener是有具體類的,所以我們同樣可以在這些filterlistener類中添加注釋。
             
          進行了所有配置后,運行ant setupbuild.xml會生成對應的xml文件和form bean等,并在數(shù)據(jù)庫中創(chuàng)建相應的表。

          2.預先定義的模版

             XDoclet使用代碼模板來生成代碼。模板(template)是你想生成文件的原型。模板里使用一些XML標簽來指導模板引擎如何根據(jù)輸入類以及它們的元數(shù)據(jù)來調(diào)整代碼的生成。

          模板包含文件和XML標簽,生成輸出文件時XML標簽會被解析,然后生成文本并顯示在XML標簽所處的位置上。除了以xdt為命名空間打頭的XML標簽會被XDoclet引擎解析以外,其余的XML標簽XDoclet會忽略不管。

          AppFuse中用到很多預先定義的模版,例如AppFuse中生成Action類的XDoclet模板,部分內(nèi)容如下所示:

          public final class <XDtClass:className/>Action extends BaseAction {
              
          public ActionForward delete(ActionMapping mapping, ActionForm form,                             HttpServletRequest request,                               HttpServletResponse response)
              
          throws Exception {
                  
          if (log.isDebugEnabled()) {
                      log.debug(
          "Entering 'delete' method");
                  }

                  ActionMessages messages 
          = new ActionMessages();
                  
          <XDtClass:className/>Form <XDtForm:classNameLower/>Form = (<XDtClass:className/>Form) form;
                  
          // Exceptions are caught by ActionExceptionHandler
                  Manager mgr = (Manager) getBean("manager");
                  mgr.removeObject(
          <XDtClass:className/>.classnew Long(<XDtForm:classNameLower/>Form.getId()));
                  messages.add(ActionMessages.GLOBAL_MESSAGE,
                              
          new ActionMessage("<XDtForm:classNameLower/>.deleted"));
                  
          // save messages in session, so they'll survive the redirect
                  saveMessages(request.getSession(), messages);
                  
          return search(mapping, form, request, response);
              }

          … …
          }


           在如上的模版中,可看到<XDtClass:className/><XDtForm:classNameLower/>等標簽,在生成代碼的時候,這些標簽會被解析,解析后在這些位置會填上對應的代碼。

          五.總結(jié)

          AppFuse是個大雜燴,在它里面有很多開源庫,主要分類如下:

          編譯相關(guān):AntAnt Contrib TasksCheckstyleJava2HtmlPMD

          測試框架:DbUnitjMockJUnit

          數(shù)據(jù)庫驅(qū)動程序:MySQL PostgreSQL

          持久層框架:Hibernate iBATIS

          IoCAOP 框架:Spring

          Web MVC框架:JSFSpring MVCStrutsTapestry WebWork

          安全:Acegi Security

          除了這些庫之外,AppFuse 還使用 Log4j 來記錄日志,使用 Velocity 來構(gòu)建 e-mail 和菜單模板等。

          另外,AppFuse 并不會將我們限定到任何特定的 API 上。它只是簡單地對可用的最佳開放源碼解決方案重新進行打包和預先集成。AppFuse 中的代碼可以處理這種集成,并實現(xiàn)了 AppFuse 的基本安全性和可用性特性。只要可能,就會減少代碼,以便向 AppFuse 的依賴框架添加一個特性。

             從本文可以看來,AppFuse通過減少編寫CRUD代碼的時間,大大提高了我們編碼的效率,是我們開發(fā)項目時的好幫手。

          posted on 2007-08-28 13:12 阿蜜果 閱讀(4153) 評論(11)  編輯  收藏 所屬分類: Auto Code


          FeedBack:
          # re: AppFuse學習進階
          2007-08-28 13:24 | paul
          springside功能上都差不多啊  回復  更多評論
            
          # re: AppFuse學習進階
          2007-08-28 13:36 | Thomas
          不錯,繼續(xù)努力!  回復  更多評論
            
          # re: AppFuse學習進階
          2007-08-28 18:41 | mortal
          姐姐好努力!  回復  更多評論
            
          # re: AppFuse學習進階[未登錄]
          2007-08-28 20:01 | -274°C
          姐姐好樣的!哈哈,以后你一發(fā)帖,后來回帖就一堆弟弟回帖。  回復  更多評論
            
          # re: AppFuse學習進階
          2007-08-29 16:55 | cresposhi
          springside比起它還是差遠了
          寫這么詳細,你都可以出書了!  回復  更多評論
            
          # re: AppFuse學習進階
          2007-08-29 16:57 | cresposhi
          你什么時候成了itpub的編輯?  回復  更多評論
            
          # re: AppFuse學習進階[未登錄]
          2007-08-30 08:56 | 阿蜜果
          @cresposhi
          不是編輯哦
          有空的時候幫他們寫了幾篇文章而已
          :)  回復  更多評論
            
          # re: AppFuse學習進階
          2007-08-30 12:45 | JAVA面試題
          好樣的  回復  更多評論
            
          # re: AppFuse學習進階
          2007-10-24 09:45 | 信鴿
          不錯。  回復  更多評論
            
          # re: AppFuse學習進階
          2007-11-01 15:31 | feihonggang
          太好了,我在這里說聲謝謝了  回復  更多評論
            
          # re: AppFuse學習進階
          2008-01-08 16:58 | sz(songze39@126.com)
          知道appfuse中hibernate session是怎么配置獲得的嗎?  回復  更多評論
            
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關(guān)注blog

          積分與排名

          • 積分 - 2296550
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 巴青县| 屏南县| 闽侯县| 彭山县| 新化县| 上林县| 七台河市| 景泰县| 明溪县| 丰顺县| 安新县| 安丘市| 南澳县| 顺义区| 安图县| 安平县| 原平市| 平谷区| 赤城县| 徐水县| 元氏县| 泰来县| 绍兴县| 额济纳旗| 宝坻区| 周口市| 沭阳县| 北安市| 扎囊县| 定远县| 高陵县| 稷山县| 平顶山市| 旅游| 乐陵市| 青川县| 安徽省| 宿州市| 广饶县| 商丘市| 德庆县|