使用AppFuse快速構建J2EE應用_第1頁
使用AppFuse快速構建J2EE應用_第2頁
使用AppFuse快速構建J2EE應用_第3頁
使用AppFuse快速構建J2EE應用_第4頁
使用AppFuse快速構建J2EE應用_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、使用 AppFuse 快速構建 J2EE 應用本文以一個 J2EE 開發(fā)者的角度,借助一個簡單的應用示例,在融合了個人經(jīng)驗的基礎上介紹了如何用 AppFuse 一步步地構建 J2EE 項目。通過閱讀本文,讀者不僅能夠學會用 AppFuse 進行開發(fā),而且能夠充分體會到 AppFuse 提供的“快速開發(fā)”的優(yōu)越性。0評論:沈 銳, 軟件工程師, IBM CSDL2006 年 10 月 19 日關于 AppFuse 的特性、架構以及為什么要使用 AppFuse,AppFuse 的創(chuàng)始人 Matt Raible 在使用 AppFuse 的七個理由一文中已經(jīng)做了很詳盡的闡述,這里就不再贅言。本文將著力

2、于實踐,即如何運用 AppFuse 開發(fā) J2EE 應用。使用 AppFuse,你需要對 Ant 有一些基本的了解,比如什么叫 target、什么是 build.xml 以及如何運行 Ant,等等。如果你現(xiàn)在還不知道 Ant 是什么,就需要找些相關資料學習一下。下表列出了本文中用到的也是較為常用的 AppFuse 的 target:表 1. Ant 中常用的 AppFuse targettarget說明所在文件new這個 target 是使用 AppFuse 必須要用到的,它用來在 AppFuse 同級的目錄下創(chuàng)建一個新項目。創(chuàng)建過程是交互式的,會讓用戶輸入項目名稱、數(shù)據(jù)庫名稱以及根包路徑。A

3、ppFuse 安裝目錄下的 build.xmlsetup用于初始化一個新的項目,它包含了從數(shù)據(jù)庫創(chuàng)建、Tomcat 設置到 war 文件的生成和部署等一系列操作。項目根目錄下的 build.xmldeploy如果你修改的代碼不涉及到數(shù)據(jù)庫的更改,那么可以使用這個 target,因為它只負責生成并重新部署 war 包。項目根目錄下的 build.xmlsetup-db如果你只是要對數(shù)據(jù)庫進行更改,使用這個 target。比如,重新創(chuàng)建數(shù)據(jù)庫,重新加載樣本數(shù)據(jù)等操作。項目根目錄下的 build.xmlinstallAppGen 的 target。如果你不希望使用 AppGen 幫你生成 dao 類

4、和 service 類以及其他的代碼,就使用這個 target。extras/appgen 目錄下的 build.xmlinstall-detailedAppGen 的 target。如果你希望使用 AppGen 幫你生成所有代碼,就使用這個 target。extras/appgen 目錄下的 build.xml本文將按如下順序展開敘述 : 示例介紹 搭建開發(fā)環(huán)境 新建項目 創(chuàng)建數(shù)據(jù)庫表 用 AppGen 生成代碼 根據(jù)項目需求調整代碼 其他功能o 語言國際化o 頁面布局和樣式o 系統(tǒng)安全o 事務控制o 日志o 郵件o 緩存示例介紹本文的示例實現(xiàn)對員工信息的增刪查改等基本功能。用 Tapest

5、ry 實現(xiàn)表示層,用 Hibernate 開發(fā)持久層,用 Spring 提供事務控制等跨模塊服務,并用 Acegi 進行安全管理。本示例只用到一個域模型:Employee,下面是它的 UML 圖。圖 1. Employee UML 圖回頁首搭建開發(fā)環(huán)境本文的代碼開發(fā)平臺采用的是 Windows 操作系統(tǒng),因此,以下環(huán)境設置也是針對 Windows 操作系統(tǒng)的。 從AppFuse 下載頁面下載,并解壓縮在任意目錄下。這個 zip 已經(jīng)定制了使用 Tapestry 作為表現(xiàn)層的實現(xiàn)框架,因而使用起來較為直接。 從下載最新的 JDK,并安裝或解壓縮到任意目錄下。本文采用。設置環(huán)境變量 JAVA_HO

6、ME 指向 JDK 所在的目錄,并在 PATH 中添加 %JAVA_HOME%/bin。 從下載最新版的 Tomcat,并安裝或解壓縮到任意目錄下。本文采用。設置環(huán)境變量 CATALINA_HOME 指向 Tomcat 的安裝目錄。 從下載最新版的 Ant,并解壓縮到任意目錄下。AppFuse 要求的最低版本是,本文采用的是。設置 ANT_HOME 指向 Ant 所在的目錄,并在 PATH 中添加 %ANT_HOME%/bin。另外,要拷貝一個 junit.jar 到 %ANT_HOME%/lib 下,如果 lib 下沒有 junit.jar,AppFuse 的腳本在運行時會給出警告信息。ju

7、nit.jar 可以從獲得,也可以從 %AppFuse%/lib/junit3.8.1 目錄下獲得。 從下載最新版的 MySQL,并安裝或解壓縮到任意目錄下。本文采用的是 5.0。 從下載 Eclipse 3.1 或 3.2,安裝到任意目錄下。AppFuse 的 Ant 腳本可以在命令行中運行,也可以在 Eclipse 里運行。有關如何在 Eclipse 里執(zhí)行 Ant 腳本,請參考用 Eclipse 開發(fā) AppFuse 應用。到此,我們已經(jīng)為 AppFuse 開發(fā)應用準備好了環(huán)境,下面讓我們開始使用 AppFuse 創(chuàng)建項目?;仨撌仔陆椖緼ppFuse 的便捷與強大之處在于它已經(jīng)為我們提

8、供了多種開源框架的集成,并且通過使用 Ant 將所有的構建過程自動化。另外,AppFuse 利用 XDoclet 能夠為我們生成絕大多數(shù)重要的代碼,例如 dao 類、service 類以及測試用例,等等,并且能夠將大量的配置文件也一并生成好,從而極大地節(jié)省了開發(fā)人員的時間。用 AppFuse 進行開發(fā)通常有三種模式:“自上而下”,“自下而上”以及“混合模式”。采用“自上而下”(由 Java 對象向數(shù)據(jù)庫對象創(chuàng)建的過程)的方式固然比較符合“面向對象”的設計思維,但是為此要編寫大量的 XDoclet 的 tag 也確是一件痛苦的事情。相比較而言,采用“自下而上”(由數(shù)據(jù)庫對象生成 Java 對象的

9、過程)就顯得簡單許多 - 只需要提供數(shù)據(jù)庫表結構。然而,對于較為復雜的系統(tǒng),尤其是類之間具有大量的關聯(lián)的情形,仍然需要采用“自上而下”的創(chuàng)建模式。因此,在實際的項目開發(fā)中,將兩種模式進行混合使用比較常見,這也就是“混合”模式。本文采用“自下而上”的模式。本文的 AppFuse 安裝在 c:opt 下面。打開命令行控制臺,進入 c:optappfuse,運行 “ant new”,為簡單起見,所有參數(shù)選用默認值,見圖 2。圖 2. ant new - 新建項目腳本運行成功后,新項目創(chuàng)建在 c:optmyapp 下(與 AppFuse 目錄同級),myapp 是 AppFuse 默認的項目名稱。將該

10、項目導入到 Eclipse 中,并根據(jù)用 Eclipse 開發(fā) AppFuse 應用進行必要的設置。以下是兩個你可能需要進行的配置: AppFuse 默認連接 MySQL 的用戶名是 root,密碼為空。如果你的 root 密碼不是空,需要修改 C:perties 中的 項,記得將注釋去掉。 AppFuse 默認不是用 utf-8 創(chuàng)建數(shù)據(jù)庫,如果你需要支持多語言,需要修改 C:optmyappmetadatasqlmysql-create.sql 中的創(chuàng)建數(shù)據(jù)庫的語句,修改如下:清單 1. 創(chuàng)建數(shù)據(jù)庫語句create database if not exis

11、ts DB-NAME CHARACTER SET utf8 COLLATE utf8_general_ci;注:AppFuse 會在構建期將 DB-NAME 替換成你指定的數(shù)據(jù)庫名(本文中為“mydb”)。在 c:optmyapp 下運行“ant setup test-all”?!皊etup” 完成了很多“設置”工作:創(chuàng)建數(shù)據(jù)庫、構建 dao 和 serive 類、加載樣本數(shù)據(jù)、創(chuàng)建 war 文件并部署到 tomcat,等等。“test-all” 運行所有的測試用例:對 dao,service 以及頁面的測試。如果這個腳本運行成功,說明開發(fā)環(huán)境一切就緒。這時,啟動 Tomcat,通過訪問 ht

12、tp:/localhost:8080/myapp 就能夠看到 AppFuse 的登錄界面了。AppFuse 預定義了兩個用戶:mraible 和 tomcat,密碼都是 tomcat。mraible 屬于管理員角色(能夠管理用戶信息),tomcat 屬于普通用戶角色。用 mraible 登錄可以看到圖 3的界面。圖 3. AppFuse 的初始界面或許此時,你已驚奇地發(fā)現(xiàn),自己不過只運行了一次 Ant 腳本,但是系統(tǒng)已經(jīng)擁有“用戶管理”、“郵件”、“文件上傳” 等功能 - 這就是 AppFuse “開箱即用”的優(yōu)勢。接下來讓我們開始開發(fā)前述的應用示例。回頁首創(chuàng)建數(shù)據(jù)庫表在 mydb 數(shù)據(jù)庫中執(zhí)

13、行如下語句創(chuàng)建 employee 表:清單 2. 創(chuàng)建 employee 語句CREATE TABLE employee ( id bigint(20) NOT NULL auto_increment, code varchar(10) NOT NULL, dept varchar(50) NOT NULL, name varchar(20) NOT NULL, status varchar(10) NOT NULL, telephone varchar(20) default NULL, title varchar(50) NOT NULL, PRIMARY KEY (id) ) ENGIN

14、E=InnoDB DEFAULT CHARSET=utf8;回頁首用 AppGen 生成代碼AppFuse 自帶了一個代碼生成工具 - AppGen,它位于 c:optmyappextrasappgen 目錄下面。AppGen 可以生成絕大部分我們需要的代碼,比如 dao 類,service 類,菜單、增刪改的 web 頁面、配置文件、樣本數(shù)據(jù),等等。AppGen 利用 XDoclet 生成代碼,因此可以在 extras/appgen/src 看到很多 .xdt 文件,這些就是 XDoclet 的模版定義文件。如果你希望自己編寫 dao 和 service 類,就運行“install”這個 t

15、arget,否則就用 “install-detailed” ,它可以幫你搞定一切。下面就讓我們來運行 “install-detailed” 生成代碼。在 c:optmyappextrasappgen 下運行 “ant install-detailed”。清單 3. 運行 install-detailed. 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)? employee input

16、What is the name, if any, of the module for your table (i.e. organization)? hr .前兩個問題都很直觀:選擇從 table 生成代碼,表名是 employee。第三個問題是讓用戶輸入使用的模塊名,如果你希望 AppFuse 幫你按模塊生成代碼的話,就需要輸入一個模塊名稱。這里,我們輸入“hr”。如果運行成功,在 Eclipse 中會看到如下的目錄結構:圖 4. “install-detailed” 執(zhí)行后的 Eclipse點擊查看大圖表 2列出了 install-detailed 生成的主要文件。表 2. instal

17、l-detailed 生成的主要文件列表文件說明myapp/src/dao/org/appfuse/dao/hibernate/applicationContext-hibernate.xml在其中增加了 employeeDao 的聲明myapp/src/dao/org/appfuse/hr/model/Employee.javaEmployee 類 - Java Beanmyapp/build/dao/gen/org/appfuse/hrEmployee 類的 Hibernate 映射文件myapp/src/dao/org/appfuse/hr/dao/EmployeeDao.java定義關

18、于 employee 的 dao 層的操作myapp/src/dao/org/appfuse/hr/dao/hibernate/EmployeeDaoHibernate.javaEmployeeDao 的 Hibernate 實現(xiàn)類myapp/src/service/org/appfuse/service/applicationContext-service.xml在其中增加了 employeeManager 的聲明myapp/src/service/org/appfuse/hr/service/EmployeeManager.java定義關于 employee 的 service 層的操作m

19、yapp/src/service/org/appfuse/hr/service/impl/EmployeeManagerImpl.javaEmployeeManager 的實現(xiàn)類myapp/src/web/org/appfuse/hr/webapp/action/EmployeeForm.javaemployee 的添加 / 修改頁面對應的 tapestry 類myapp/src/web/org/appfuse/hr/webapp/action/EmployeeList.javaemployee 的列表頁面對應的 tapestry 類myapp/test/dao/org/appfuse/hr/

20、dao/EmployeeDaoTest.javaemployee dao 類的測試用例myapp/test/service/org/appfuse/hr/dao/EmployeeManagerTest.javaemployee service 類的測試用例myapp/test/web/org/appfuse/hr/webapp/action/EmployeeFormTest.javaemployee 添加 / 修改頁面類的測試用例myapp/test/web/org/appfuse/hr/webapp/action/EmployeeFormTest.javaemployee 列表頁面類的測試用

21、例myapp/web/pages/hr/employeeForm.htmlemployee 添加 / 修改頁面 html 模版文件myapp/web/pages/hr/employees.htmlemployee 列表頁面 html 模版文件myapp/web/pages/hr/employeeForm.pageemployee 添加 / 修改頁面規(guī)格文件myapp/web/pages/hr/employees.pageemployee 列表頁面規(guī)格文件不過,AppFuse 并不知道開發(fā)者需要加載哪些 hbm 文件,所以要手工將 Employee.hbm.xml 文件添加到配置文件中:打開 a

22、pplicationContext-hibernate.xml,在 “sessionFactory” 的 bean 聲明中,找到 “mappingResources” 屬性的定義,增加 “org/appfuse/hr/model/Employee.hbm.xml”。清單 4. applicationContext-hibnerate.xml 中添加. org/appfuse/hr/model/Employee.hbm.xml org/appfuse/model/Role.hbm.xml org/appfuse/model/User.hbm.xml .在 c:optmyapp 下運行 “ant

23、deploy”。打開 “http:/localhost:8080/myapp”,用 mraible/tomcat 登錄,“Employee List” 已經(jīng)被添加到菜單里了。圖 5. myapp 的原始主頁面點擊 “Employee List” 鏈接,進入“員工信息列表”頁面。圖 6. myapp 的原始員工信息列表頁面點擊“添加”按鈕或點擊任意一行數(shù)據(jù),進入“員工信息添加 / 修改 / 刪除”頁面。圖 7. myapp 的原始員工信息添加 / 修改 / 刪除頁面不難看出,雖然 AppFuse 幫我們生成了頁面,但是這些頁面并非那么“理想”,我們?nèi)匀恍枰鶕?jù)實際的需求做些調整?;仨撌赘鶕?jù)項目需

24、求調整代碼在本文中,做了如下代碼修改: 將所有頁面文字翻譯成中文:AppFuse 中用到的所有 Resource Bundle 文件位于 myapp/web/WEB-INF/classes 目錄下(以 ApplicationResources 開頭的 properties 文件)。更改 ApplicationResources_zh_CN.properties 的文件編碼方式為“UTF-8”。然后,把 ApplicationRperties 中 “# - Employee-START” 和 “# - Employee-END” 之間的項拷貝到 ApplicationRe

25、sources_zh_CN.properties 中,并逐項翻譯成中文。AppFuse 會在腳本運行的時候自動用 native2ascii 進行編碼轉換。另外,AppFuse 默認對 “button.done” 的翻譯是“做”,這不太合適,所以改為“完成”。 在“員工信息列表頁面”去掉了 id 列,并調整了列的順序:只要修改 employees.html 就可以。 在“員工信息添加 / 修改 / 刪除頁面”,將“所在部門”、“職位”、“狀態(tài)”改為下拉列表:需要修改 employeeForm.html、employeeForm.page、EmployeeForm.java。用 PropertyS

26、election 組件實現(xiàn)下拉列表,用 Resource Bundle 文件定義真正顯示的選項文本。 增加了一個“人事管理”的角色,用來執(zhí)行員工信息管理的權限控制 : 具體介紹見“系統(tǒng)安全”。 添加了一個新的主題 “mytheme”(只是更改了界面的顏色):具體介紹見“頁面布局和樣式”。應用了上述修改后,在 c:optmyapp 中運行 “ant deploy” 重新打包整個項目并發(fā)布。以下是修改后的界面截圖:圖 8. 修改后的 myapp 主頁面圖 9. 修改后的 myapp 員工信息列表頁面圖 10. 修改后的 myapp 員工信息添加 / 修改 / 刪除頁面圖 11. 修改后的 myap

27、p 用戶管理頁面回頁首其他功能一個系統(tǒng)除了包含核心邏輯之外,還有其他一些輔助功能,它們也是非常重要的。下面,讓我們來看看如何在 AppFuse 中開發(fā)這些功能。語言國際化如果你的系統(tǒng)不僅僅支持一種語言,那么就需要考慮這個問題。在 AppFuse 中,Resource Bundle 文件是位于 webWEB-INFclasses 目錄下的以 ApplicationResources 開頭的 properties 文件。Tapestry 有自己的國際化文本機制。但是在 AppFuse 中,并不全是 Tapestry 頁面,仍有些地方使用 jsp,而這些頁面使用 JSTL 的 fmt 標簽顯示國際化

28、文本。不過,AppFuse 已經(jīng)將這二者的“源頭”進行了整合,因此,對用戶而言,只需要在 ApplicationResources*.properties 中定義需要國際化的文本。但是,在 Eclipse 中可以看到,AppFuse 的 properties 文件默認的編碼不是 UTF-8,而是 ISO-8859-1,這樣會導致最后通過 native2ascii 轉換后的文件都是 “?”,所以用戶需要自己把這些文件轉成 UTF-8。轉換的方法很簡單:在 properties 文件上點右鍵,在右鍵菜單上選擇 Properties,打開屬性窗口后,更改 “Text file encoding” 為

29、 UTF-8。在修改編碼前,最好先把已有的文字拷貝出來,轉換好之后再粘貼回去,否則會導致原先翻譯好的文字變成亂碼。圖 12. ApplicationResources_zh_CN.properties 的屬性窗口AppFuse 在發(fā)布項目的時候,會自動用 native2ascii 轉換這些資源文件。如果你想使用其他資源文件名,可以修改 webWEB-INFweb.xml 中的 “” 的參數(shù)值。頁面布局和樣式使用 AppFuse,能夠很方便的修改系統(tǒng)的整體布局和樣式,因為 AppFuse 使用了一種強大的 “CSS 框架”。項目創(chuàng)建好之后,在 webstyles 目錄下,有三個目錄:andrea

30、s01,puzzlewithstyle 和 simplicity。這些是 AppFuse 自帶的三種主題,目錄名即 CSS 框架的主題名。屬于“管理員”角色的用戶可以在登錄后通過在 url 后面添加形如 ?theme=andreas01 的參數(shù)更改系統(tǒng)使用的主題。如下圖:圖 13. 應用了 “puzzlewithstyle” 的 myapp系統(tǒng)默認使用的主題由 webWEB-INFweb.xml 中的 “theme” 參數(shù)指定,AppFuse 默認使用的主題是 “simplicity”。更改或創(chuàng)建新的主題也很簡單,只要在 webstyles 目錄下,新建一個自己的目錄,并參照已有主題的編寫規(guī)范

31、定義自己的主題。本文中,拷貝了 simplicity 目錄,更名為 “mytheme”,然后將里面的字體顏色從“藍色”基調改成了“綠色”基調,并修改 web.xml 中的 theme 參數(shù)值為 “mytheme”,這樣 myapp 默認使用的就是 mytheme 的主題了,如圖 8所示。你也可以從得到更多關于 “CSS 框架” 的信息。系統(tǒng)安全AppFuse 使用 Acegi 進行安全管理。Acegi 的配置信息位于 webWEB-INFclassessecurity.xml。事實上,Acegi 是被集成到 Spring 當中的,因此這個文件是 Spring 的配置文件格式。在 webWEB-

32、INFweb.xml 中,該文件被指定在應用啟動前會被加載:清單 5. web.xml 關于 Spring 配置文件的定義. contextConfigLocation /WEB-INF/applicationContext-*.xml,/WEB-INF/security.xml .本文關于系統(tǒng)安全的實現(xiàn)如下:1. 在數(shù)據(jù)庫中增加新的角色“hr”:編輯 myappmetadatasample-data.xml 文件,增加如下黑體的部分:清單 6. sample-data.xml 中角色 “hr” 的記錄. id name description 1 admin 2 user 3 hr .App

33、Fuse 使用 dbunit 加載樣本數(shù)據(jù)到數(shù)據(jù)庫中,sample-data.xml 為 dbunit 提供樣本數(shù)據(jù)定義。修改完 sample-data.xml,在 c:optmyapp 下運行 “ant db-load”,樣本數(shù)據(jù)被重新加載。這樣,我們就在數(shù)據(jù)庫中定義了一個新的角色記錄 “hr”。2. 定義角色名稱的中文顯示文本:在 myapp/sr/web/webapp/action/UserForm.java 的方法 pageBeginRender 中找到如下代碼:3. / initialize drop-downs 4. if (getAvailableRoles() = null)

34、5. List roles = (List) getServletContext().getAttribute(Constants.AVAILABLE_ROLES); 6. setAvailableRoles(new RoleModel(roles); 將其做如下修改:/ initialize drop-downs if (getAvailableRoles() = null) List roles = (List) getServletContext().getAttribute(Constants.AVAILABLE_ROLES); for(int i=0;iroles.size();i+

35、) LabelValue role=(LabelValue) roles.get(i); role.setLabel(getText(rolelabel_+role.getValue(); setAvailableRoles(new RoleModel(roles); 并在 webWEB-INFclassesApplicationResources_zh_CN.properties 中增加角色名稱的定義:rolelabel_admin= 系統(tǒng)管理員 rolelabel_user= 普通用戶 rolelabel_hr= 人事管理AppFuse 默認在用戶管理界面上顯示的角色的名稱是表 role

36、中的名稱,這樣無論切換到何種語言,角色名稱都是 “admin”、user、“hr” 等等,角色名稱不能根據(jù) Locale 用相應的語言顯示。因此,本文將角色的名稱用 Resource Bundle 文件定義,數(shù)據(jù)庫中存儲 “key” 值。修改后的效果見圖 10。7. 配置“安全策略”:在 webWEB-INFsecurity.xml 的 bean filterInvocationInterceptor 聲明中增加如下“黑體”的一行:8. 10. 11. 12. 13. 14. PATTERN_TYPE_APACHE_ANT 15. /clickstreams.jsp*=admin 16. /f

37、lushCache.*=admin 17. /passwordHint.html*=ROLE_ANONYMOUS,admin,user 18. /reload.*=admin 19. /signup.html*=ROLE_ANONYMOUS,admin,user 20. /users.html*=admin 21. /employees.html*=hr22. /*/*.html*=admin,user 23. 24. “/employees.html*=hr” 的意思是:只有 hr 這個角色可以訪問形如 “/employees.html*” 的 url。25. 將“員工信息維護”菜單關聯(lián)到指

38、定角色 hr:在 webWEB-INFmenu-config.xml 中在 “EmployeeMenu” 的定義中增加 “roles=hr”:26. 27. 于是,“員工信息維護”的菜單入口只對屬于“人事管理”角色的用戶顯示,對其他用戶則隱藏。30. 分配角色 “hr” 給 tomcat:將“人事管理”角色分配給某一用戶,例如 tomcat。則 tomcat 能夠看見并訪問“員工信息維護”相關頁面,而其他用戶的界面上則沒有“員工信息維護”這個菜單入口。并且,如果用戶試圖通過 url 訪問 employees.html 的時候會看到如下頁面:圖 14. “訪問被拒絕”頁面圖 14是 AppFus

39、e 提供的默認“訪問被拒絕”頁面,你可以通過修改 web403.jsp 把它定制成自己喜歡的頁面。事務控制AppFuse 利用 Spring 的事務管理機制。Spring 可以以聲明的方式,對方法進行事務控制,并且可以根據(jù)實際的需要,調整控制粒度?!奥暶鞣绞健钡暮锰幵谟冢汉诵拇a只需要關注業(yè)務邏輯,而將事務控制完全交由配置文件管理,一方面是核心代碼簡潔清晰,另一方面也便于進行集中配置管理。事務控制一般是定義在 service 類的方法上的。AppFuse 的所有 service 類都聲明在 srcserviceapplicationContext-service.xml 中,該文件中包含有一個 “txProxyTemplate” bean 的聲明,它定義了基本事務策略。其它的 se

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論