精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用AppFuse的七個理由

開發 后端
AppFuse 是一個開放源碼的項目和應用程序,它使用了在 Java 平臺上構建的開放源碼工具來幫助我們快速而高效地開發 Web 應用程序。我最初開發它是為了減少在為客戶構建新 Web 應用程序時所花費的那些不必要的時間。

開始學習在 Java™ 平臺上使用諸如 Spring、Hibernate 或 MySQL 之類的開放源碼工具時可能非常困難。再加上 Ant 或 Maven,以及與 DWR 一起的小 Ajax,還有 Web 框架 —— 即 JSF,我們必須睜大眼睛盯著如何配置應用程序。AppFuse 減少了集成開放源碼項目的痛苦。它可以把測試變成一等公民,讓我們可以從數據庫表生成整個 UI,并使用 XFire 來支持 Web 服務。另外,AppFuse 的社區也非常健全,這是不同 Web 框架用戶可以一起融洽相處的地方之一。

AppFuse 是一個開放源碼的項目和應用程序,它使用了在 Java 平臺上構建的開放源碼工具來幫助我們快速而高效地開發 Web 應用程序。我最初開發它是為了減少在為客戶構建新 Web 應用程序時所花費的那些不必要的時間。從核心上來說,AppFuse 是一個項目骨架,類似于通過向導創建新 Web 項目時 IDE 所創建的東西。當我們使用 AppFuse 創建一個項目時,它會提示我們將使用開放源碼框架,然后才創建項目。它使用 Ant 來驅動測試、代碼生成、編譯和部署。它提供了目錄和包結構,以及開發基于 Java 語言的 Web 應用程序所需要的庫。

與大部分 “new project” 向導不同,AppFuse 創建的項目從最開始就包含很多類和文件。這些文件用來實現特性,不過它們同時也會在您開發應用程序時被用作示例。通過使用 AppFuse 啟動新項目,我們通常可以減少一到兩周的開發時間。我們不用擔心如何將開放源碼框架配置在一起,因為這都已經完成了。我們的項目都已提前配置來與數據庫進行交互,它會部署到應用服務器上,并對用戶進行認證。我們不必實現安全特性,因為這都早已集成了。

當我最初開發 AppFuse 時,它只支持 Struts 和 Hibernate。經過幾年的努力,我發現了比 Struts 更好的 Web 框架,因此我還添加了為這些 Web 框架使用的選項。現在,AppFuse 可以支持 Hibernate 或 iBATIS 作為持久性框架。對于 Web 框架來說,我們可以使用 JavaServer Faces(JSF)、Spring MVC、Struts、Tapestry 或 WebWork。

AppFuse 提供了很多應用程序需要的一些特性,包括:

認證和授權

用戶管理

Remember Me(這會保存您的登錄信息,這樣就不用每次都再進行登錄了)

密碼提醒

登記和注冊

SSL 轉換

E-mail

URL 重寫

皮膚

頁面修飾

模板化布局

文件上載

這種 “開箱即用” 的功能是 AppFuse 與其他 CRUD 代 框架的區別之一(CRUD 取自創建、檢索、更新 和刪除 幾個操作的英文首字母),包括 Ruby on Rails、Trails 和 Grails。上面提到的這些框架,以及 AppFuse,都讓我們可以從數據庫表或現有的模型對象中生成主頁/細節頁。

圖 1 闡述了一個典型 AppFuse 應用程序的概念設計:

圖 1. 典型的 AppFuse 應用程序

 

典型的 AppFuse 應用程序

 

清單 1 給出了我們在創建 devworks 項目時所使用的命令行交互操作,同時還給出了所生成的結果。這個項目使用了 WebWork 作為自己的 Web 框架(請參考下面 參考資料 一節給出的鏈接)。

清單 1. 使用 AppFuse 創建新項目

 

  1. alotta:~/dev/appfuse mraible$ ant new  
  2. Buildfile: build.xml  
  3.  
  4. clean:  
  5.      [echo] Cleaning build and distribution directories  
  6.  
  7. init:  
  8.  
  9. new:  
  10.      [echo]   
  11.      [echo] +-------------------------------------------------------------+  
  12.      [echo] |    -- Welcome to the AppFuse New Application Wizard! --     |  
  13.      [echo] |                                                             |  
  14.      [echo] | To create a new application, please answer the following    |  
  15.      [echo] | questions.                                                  |  
  16.      [echo] +-------------------------------------------------------------+  
  17.  
  18.     [input] What would you like to name your application [myapp]?  
  19. devworks  
  20.     [input] What would you like to name your database [mydb]?  
  21. devworks  
  22.     [input] What package name would you like to use [org.appfuse]?  
  23. com.ibm  
  24.     [input] What web framework would you like to use [webwork,tapestry,spring,js  
  25. f,struts]?  
  26. webwork  
  27.      [echo] Creating new application named 'devworks'...  
  28.      [copy] Copying 359 files to /Users/mraible/Work/devworks  
  29.      [copy] Copying 181 files to /Users/mraible/Work/devworks/extras  
  30.      [copy] Copying 1 file to /Users/mraible/Work/devworks  
  31.      [copy] Copying 1 file to /Users/mraible/Work/devworks  
  32.  
  33. install:  
  34.      [echo] Copying WebWork JARs to ../../lib  
  35.      [copy] Copying 6 files to /Users/mraible/Work/devworks/lib  
  36.      [echo] Adding WebWork entries to ../../lib.properties  
  37.      [echo] Adding WebWork classpath entries  
  38.      [echo] Removing Struts-specific JARs  
  39.    [delete] Deleting directory /Users/mraible/Work/devworks/lib/struts-1.2.9  
  40.    [delete] Deleting directory /Users/mraible/Work/devworks/lib/strutstest-2.1.3  
  41.      [echo] Deleting struts_form.xdt for XDoclet  
  42.    [delete] Deleting directory /Users/mraible/Work/devworks/metadata/templates  
  43.      [echo] Deleting Struts merge-files in metadata/web  
  44.    [delete] Deleting 7 files from /Users/mraible/Work/devworks/metadata/web  
  45.      [echo] Deleting unused Tag Libraries and Utilities  
  46.    [delete] Deleting 2 files from /Users/mraible/Work/devworks/src/web/org/appfu  
  47. se/webapp  
  48.      [echo] Modifying appgen for WebWork  
  49.      [copy] Copying 12 files to /Users/mraible/Work/devworks/extras/appgen  
  50.      [echo] Replacing source and test files  
  51.    [delete] Deleting directory /Users/mraible/Work/devworks/src/web/org/appfuse/  
  52. webapp/form  
  53.    [delete] Deleting directory /Users/mraible/Work/devworks/src/web/org/appfuse/  
  54. webapp/action  
  55.      [copy] Copying 13 files to /Users/mraible/Work/devworks/src  
  56.    [delete] Deleting directory /Users/mraible/Work/devworks/test/web/org/appfuse  
  57. /webapp/form  
  58.    [delete] Deleting directory /Users/mraible/Work/devworks/test/web/org/appfuse  
  59. /webapp/action  
  60.      [copy] Copying 5 files to /Users/mraible/Work/devworks/test  
  61.      [echo] Replacing web files (images, scripts, JSPs, etc.)  
  62.    [delete] Deleting 1 files from /Users/mraible/Work/devworks/web/scripts  
  63.      [copy] Copying 34 files to /Users/mraible/Work/devworks/web  
  64.    [delete] Deleting: /Users/mraible/Work/devworks/web/WEB-INF/validator-rules-c  
  65. ustom.xml  
  66.      [echo] Modifying Eclipse .classpath file  
  67.      [echo] Refactoring build.xml  
  68.      [echo] ----------------------------------------------  
  69.      [echo] NOTE: It's recommended you delete extras/webwork as you shouldn't ne  
  70. ed it anymore.  
  71.      [echo] ----------------------------------------------  
  72.      [echo] Repackaging info written to rename.log  
  73.      [echo]   
  74.      [echo] +-------------------------------------------------------------+  
  75.      [echo] |           -- Application created successfully! --           |  
  76.      [echo] |                                                             |  
  77.      [echo] | Now you should be able to cd to your application and run:   |  
  78.      [echo] | > ant setup test-all                                        |  
  79.      [echo] +-------------------------------------------------------------+  
  80.  
  81. BUILD SUCCESSFUL  
  82. Total time: 15 seconds  

在創建一個新項目之后,我們就得到了一個類似于圖 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 5、注釋和 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 的數據庫表

 

  1. create table cat (  
  2.     cat_id int(8) auto_increment,  
  3.     color varchar(20) not null,  
  4.     name varchar(20) not null,  
  5.     created_date datetime not null,  
  6.     primary key (cat_id)  
  7.   ) type=InnoDB;  

在 extras/appgen 目錄中,運行 ant install-detailed 。這個命令的輸出結果對于本文來說實在太長了,不過我們在清單 3 中給出了第一部分的內容:

清單 3. 運行 AppGen 的 install-detailed 目標

 

  1. $ ant install-detailed  
  2. Buildfile: build.xml  
  3.  
  4. init:  
  5.     [mkdir] Created dir: /Users/mraible/Work/devworks/extras/appgen/build  
  6.      [echo]   
  7.      [echo] +-------------------------------------------------------+  
  8.      [echo] |             -- Welcome to the AppGen! --              |  
  9.      [echo] |                                                       |  
  10.      [echo] | Use the "install" target to use the generic DAO and   |  
  11.      [echo] | Manager, or use "install-detailed" to general a DAO   |  
  12.      [echo] | and Manager specifically for your model object.       |  
  13.      [echo] +-------------------------------------------------------+  
  14.  
  15.     [input] Would you like to generate code from a table or POJO? (table,pojo)  
  16. table  
  17.     [input] What is the name of your table (i.e. person)?  
  18. cat  
  19.     [input] What is the name, if any, of the module for your table (i.e. organization)?  
  20.  
  21.      [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 中

  1.  <bean id="sessionFactory" class="..."> 
  2.     <property name="dataSource" ref="dataSource"/> 
  3.     <property name="mappingResources"> 
  4.         <list> 
  5.             <value>com/ibm/model/Role.hbm.xmlvalue> 
  6.             <value>com/ibm/model/User.hbm.xmlvalue> 
  7.             <value>com/ibm/model/Cat.hbm.xmlvalue> 
  8.  
  9.         list> 
  10.     property> 
  11.     ...  
  12. 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 開發的技術前沿上 —— 就像我們一樣!

原文載自:http://www.ibm.com/developerworks/cn/java/j-appfuse/index.html

【編輯推薦】

  1. 使用AppFuse快速構建J2EE應用
  2. Java Web應用開發中的一些概念
  3. Java EE 6引入的JPA 2.0四大新特性詳解
  4. Java EE 6總覽:平臺的主要目標
  5. 面向Java EE 6平臺的上下文和依賴性注入
責任編輯:金賀 來源: JavaEye博客
相關推薦

2022-08-11 11:43:01

CISO首席信息安全官

2014-03-18 16:12:00

代碼整潔編寫代碼

2011-07-20 09:29:34

2022-08-18 14:54:00

安全首席信息安全官信息安全

2015-04-20 10:49:19

2010-02-02 11:49:03

刀片服務器

2016-08-30 20:12:21

VimLinux開源

2016-11-02 10:03:51

Linux雙引導

2015-09-16 09:49:59

angularjsweb應用

2015-07-31 09:23:39

AngularJSWeb應用

2013-11-15 11:06:27

閉源開源

2016-04-13 13:56:43

IT討厭理由

2022-03-28 12:42:29

開源Threema

2021-11-22 12:13:54

Linuxwget 命令

2013-12-17 10:22:20

2025-01-08 08:47:56

2016-01-08 13:54:31

DebianLinux發行版

2014-09-24 09:58:51

2015-11-30 17:12:31

Git使用技巧

2022-06-15 10:24:13

Pytho裝飾器代碼
點贊
收藏

51CTO技術棧公眾號

欧美日韩国产第一页| 欧美日韩一区高清| 久久riav二区三区| 青青草视频在线观看免费| 日韩1区2区| 日韩精品专区在线影院重磅| 国产精品网站免费| av在线播放免费| 丁香婷婷综合色啪| 国产精品美乳一区二区免费| 免费无码毛片一区二区app| 美女午夜精品| 在线综合亚洲欧美在线视频| 看av免费毛片手机播放| 菠萝蜜视频国产在线播放| 99国内精品久久| 91精品在线一区| 免费视频久久久| 在线成人直播| 中文字幕精品一区二区精品| 精品无码av一区二区三区不卡| 成人爱爱网址| 亚洲在线视频一区| 国产成人精品免费看在线播放 | 五月天激情在线| 久久久精品免费免费| 成人av播放| 91精品国产乱码久久| 石原莉奈一区二区三区在线观看| 欧美国产亚洲精品久久久8v| 少妇的滋味中文字幕bd| 亚洲丁香日韩| 日韩av在线免费观看一区| 精产国品一区二区三区| 日韩毛片免费看| 在线免费观看日韩欧美| 国产亚洲综合视频| sm在线播放| 一区二区三区国产精品| 中文字幕一区综合| 中文字幕日本在线| 国产性做久久久久久| 久久久久久久免费| 无码国产精品高潮久久99| 高清国产一区二区| 福利视频久久| 东京干手机福利视频| 国产精品一区二区久激情瑜伽| 成人精品久久av网站| 91麻豆国产视频| 国内一区二区在线| 91亚洲精品久久久久久久久久久久| 亚洲一卡二卡在线| 捆绑调教一区二区三区| 国产伦精品一区二区三区精品视频| 波多野结衣mp4| 蜜臀av一区二区在线免费观看 | 久热精品视频在线免费观看| 91制片厂在线| 午夜欧美在线| 久久久久99精品久久久久| 三级黄色在线观看| 永久91嫩草亚洲精品人人| 九色精品美女在线| 最新久久zyz资源站| 欧美一个色资源| 国产精华一区| xxxx18国产| 国产成人在线色| 国产精品伊人日日| 香蕉视频911| 国产视频一区不卡| 亚洲午夜精品久久久久久浪潮| 五月天婷婷在线视频| 综合色中文字幕| 国产日产欧美一区二区| 激情av在线播放| 欧美日韩日本国产| 久久久久免费精品| 亚洲美女色播| 精品久久国产字幕高潮| 短视频在线观看| 日韩专区精品| 久久久噜噜噜久久中文字免| 日本a级c片免费看三区| 精品一区二区三区在线视频| 99国产在线观看| 男人的天堂在线视频| 国产精品传媒入口麻豆| 国产精品专区在线| 香蕉成人影院| 欧美不卡在线视频| av电影网站在线观看| 亚洲精品成人影院| 欧美一级黑人aaaaaaa做受| 中文字幕 自拍偷拍| 床上的激情91.| 日韩欧美视频第二区| 免费在线观看的电影网站| 一本大道av伊人久久综合| 制服下的诱惑暮生| 深夜福利久久| 欧美大片免费看| а中文在线天堂| 成人性生交大合| 亚洲一区二区三区色| 国产盗摄——sm在线视频| 欧美日韩精品系列| 欧美三级日本三级少妇99| 欧美激情极品视频| 久久久久久福利| 强制捆绑调教一区二区| 国产高清精品一区| 亚洲乱亚洲乱妇| 精品免费在线观看| 亚欧美一区二区三区| 神马影视一区二区| 午夜精品理论片| 国产黄色小视频在线观看| 亚洲国产精品黑人久久久| 久久久亚洲精品无码| 久久丁香四色| 色系列之999| 日韩一级在线视频| av电影在线观看完整版一区二区| 人人妻人人澡人人爽精品欧美一区| 在线看片福利| 亚洲国产欧美一区二区三区同亚洲| 国产色无码精品视频国产| 久久综合九色综合欧美狠狠| 狠狠色综合色区| 色老头在线观看| 91精品综合久久久久久| 超碰人人人人人人人| 丝袜美腿亚洲色图| 麻豆av一区| 国产精品一区二区日韩| 精品久久久久久最新网址| 艳妇荡乳欲伦69影片| 精品一区二区三区欧美| 在线精品日韩| 成人黄色在线| 尤物99国产成人精品视频 | 欧美日韩性生活视频| 亚洲av无码专区在线播放中文| 在线成人激情| 99久久99| 高清视频在线观看三级| 精品精品国产高清一毛片一天堂| 日本二区在线观看| 亚洲黄色影院| 精品在线视频一区二区三区| 成人一级福利| 亚洲码在线观看| 久草视频一区二区| 国产日韩精品一区二区三区在线| jizz欧美激情18| 青青草成人影院| 国产一区二区丝袜高跟鞋图片| 91这里只有精品| 欧美精品第1页| 欧美激情精品久久| va亚洲va日韩不卡在线观看| 国产精品333| 国模吧精品视频| 国产欧美精品在线播放| av在线官网| 亚洲精品电影网| 激情网站在线观看| 亚洲人午夜精品天堂一二香蕉| 午夜一级免费视频| 欧美精品首页| 六月婷婷久久| 日本免费一区二区三区等视频| 欧美理论电影在线观看| 天堂а√在线8种子蜜桃视频 | 欧美日韩一区二区三区视频播放| 国产欧美日韩丝袜精品一区| 综合久久2019| 亚洲精品在线不卡| 国产精品日韩无码| 五月天亚洲精品| 青青青手机在线视频| 国产成人综合网站| 国产日韩一区二区在线| 99热在线成人| 好吊妞www.84com只有这里才有精品| 综合在线影院| 欧美激情综合亚洲一二区| 欧美日韩免费做爰大片| 91精品国产色综合久久不卡电影| 国产主播在线播放| 国产精品无遮挡| 久久av一区二区三| 蜜桃91丨九色丨蝌蚪91桃色| 久久精品无码中文字幕| 日韩av专区| 国产亚洲一区二区三区在线播放| 国产91在线精品| 午夜精品久久久久久久99热 | 日韩精品福利网| 欧美一级高清免费播放| 91看片在线观看| 亚洲国产精品国自产拍av秋霞| 又污又黄的网站| 天天影视色香欲综合网老头| 影音先锋男人看片资源| www.日韩在线| 色男人天堂av| 美女在线视频一区| 人妻少妇被粗大爽9797pw| 91成人精品| 亚洲草草视频| 亚洲三级性片| 精品国产乱码久久久久久丨区2区| 日韩综合av| 国产精品高潮呻吟久久av无限 | 欧美高清视频在线观看mv| 国产一区在线免费观看| 久久九九精品视频| 国产啪精品视频网站| 中文字幕影音在线| 久久久综合av| 五月花成人网| 久久精品国产精品| 午夜激情视频在线观看| 亚洲欧美日本另类| 日韩一级片免费| 日韩美女一区二区三区四区| 国产女人18毛片水18精| 欧美精品一二三区| 亚洲视频在线免费播放| 色老汉av一区二区三区| 久草视频一区二区| 欧美性感美女h网站在线观看免费| 久久网免费视频| 一区二区三区在线免费观看 | 免费在线超碰| 亚洲乱亚洲乱妇无码| 青青草在线免费观看| 精品五月天久久| 婷婷色在线观看| 亚洲国产成人爱av在线播放| 免费观看黄色av| 精品999久久久| 少妇精品视频一区二区| 亚洲成色www8888| 天天射,天天干| 日韩精品小视频| 日韩成人黄色| 亚洲一区二区久久| 国产精品一区在线看| 亚洲小视频在线观看| av在线免费播放网站| 2020国产精品| 国产伦一区二区三区色一情| 欧洲大片精品免费永久看nba| 亚洲va男人天堂| 日本少妇精品亚洲第一区| 999视频在线免费观看| 99久久香蕉| 九色91在线视频| 欧美一区二区三区激情视频| 亚洲第一在线综合在线| 亚欧美无遮挡hd高清在线视频| 久久久久久久久久伊人| 激情一区二区| 少妇性l交大片| 久久精品av麻豆的观看方式| 性一交一黄一片| 9色porny自拍视频一区二区| 亚洲一级中文字幕| 成人免费在线视频| 国产一级一片免费播放放a| 五月婷婷色综合| 亚洲国产无线乱码在线观看| 欧美一级黄色大片| 日本xxxx人| 在线观看欧美视频| 精品精品导航| 国产91色在线|| 麻豆久久一区| 欧美中日韩免费视频| 久久久久久美女精品| 拔插拔插海外华人免费| 日韩国产在线观看| 美女又黄又免费的视频| 久久久久亚洲蜜桃| 麻豆明星ai换脸视频| 五月天中文字幕一区二区| 真实新婚偷拍xxxxx| 日韩精品一区二区三区在线播放| 香蕉视频黄在线观看| 日韩视频亚洲视频| 欧美另类老肥妇| 亚洲a一级视频| 精品国产精品| www.日本少妇| 狠狠色丁香久久婷婷综合_中| 色呦呦一区二区| 亚洲欧美福利一区二区| 国产成人a v| 337p日本欧洲亚洲大胆精品| 91精品大全| 欧美一区二区三区精品电影| 国产精品va视频| 欧美日韩另类丝袜其他| 尤物精品在线| 一个人看的视频www| 国产欧美日韩不卡免费| 国产女同在线观看| 日韩欧美国产1| 理论片午午伦夜理片在线播放| 91豆花精品一区| 国产黄色片在线观看| 国产麻豆成人传媒免费观看| 岛国精品一区二区三区| 国产精品久久久久久户外露出 | 久久99精品国产99久久| 天天做天天爱综合| 中文字幕在线导航| 91蜜桃网址入口| 久久精品美女视频| 在线成人av影院| 成人高清网站| 国产精品高潮呻吟久久av黑人| 天海翼亚洲一区二区三区| 成人国产在线看| 国产一区二区三区在线看麻豆| 天天干天天操天天拍| 91久久精品网| 免费在线一级视频| 欧美一级免费视频| 欧美精品中文字幕亚洲专区| 99在线观看视频免费| 国产精品系列在线观看| 欧美三级小视频| 日韩一级成人av| 91极品在线| 成人av免费在线看| 欧美大片专区| 91精产国品一二三| 亚洲精品视频在线观看网站| 91丨porny丨在线中文 | 国产女人被狂躁到高潮小说| 欧美人与禽zozo性伦| 97超碰人人在线| 国产一区二区在线播放| 91视频综合| 亚洲天堂网站在线| 一个色在线综合| 日韩在线视频免费| 97国产在线视频| 久久久久97| 凹凸国产熟女精品视频| 久久精品男人天堂av| 久久久国产免费| 这里只有精品在线播放| 四虎国产精品免费久久| 国产麻豆电影在线观看| 国产成人在线观看| 国产成人精品亚洲男人的天堂| 亚洲精品suv精品一区二区| 成人免费看黄| 五月天亚洲综合情| 国产精品18久久久久| 国产一级做a爱免费视频| 亚洲激情在线观看| 激情亚洲影院在线观看| 一区二区在线中文字幕电影视频| 快射av在线播放一区| 亚洲福利在线视频| 亚洲伊人av| 在线不卡日本| 福利一区二区在线| 无码一区二区三区在线观看| x99av成人免费| 一区二区中文字幕在线观看| 91九色在线观看视频| 国产女人水真多18毛片18精品视频| 国产乱码久久久| 18性欧美xxxⅹ性满足| 日韩精品影视| 黄色激情在线观看| 在线视频你懂得一区| 成人高清免费在线| 乱一区二区三区在线播放| 精品在线观看视频| 日本一区二区欧美| 日韩在线观看网址| 给我免费播放日韩视频| 少妇一级淫免费放| 婷婷开心激情综合| 毛片网站在线免费观看| 国产伦精品一区二区三区照片| 蜜桃av一区二区三区电影| 久久久久成人精品无码| 日韩在线免费av| 任你躁在线精品免费| 17c国产在线|