亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用 AppFuse 快速構建 J2EE 應用

2019-11-18 16:16:50
字體:
來源:轉載
供稿:網友

示例介紹

    本文的示例實現對員工信息的增刪查改等基本功能。用 Tapestry 實現表示層,用 Hibernate 開發持久層,用 SPRing 提供事務控制等跨模塊服務,并用 Acegi 進行安全管理。本示例只用到一個域模型:Employee,下面是它的 UML 圖。


圖 1. Employee UML 圖
使用 AppFuse 快速構建 J2EE 應用(圖一) 

搭建開發環境

本文的代碼開發平臺采用的是 Windows 操作系統,因此,以下環境設置也是針對 Windows 操作系統的。

  • 從 AppFuse 下載頁面 下載 appfuse-tapestry-1.9.3-src.zip,并解壓縮在任意目錄下。這個 zip 已經定制了使用 Tapestry 作為表現層的實現框架,因而使用起來較為直接。
  • 從 http://java.sun.com 下載最新的 JDK,并安裝或解壓縮到任意目錄下。本文采用 JDK 1.5.0。設置環境變量 JAVA_HOME 指向 JDK 所在的目錄,并在 PATH 中添加 %JAVA_HOME%/bin。
  • 從 http://jakarta.apache.org/tomcat 下載最新版的 Tomcat,并安裝或解壓縮到任意目錄下。本文采用 Tomcat 5.5.17。設置環境變量 CATALINA_HOME 指向 Tomcat 的安裝目錄。
  • 從 http://ant.apache.org下載最新版的 Ant,并解壓縮到任意目錄下。AppFuse 要求的最低版本是 1.6.2,本文采用的是 1.6.5。設置 ANT_HOME 指向 Ant 所在的目錄,并在 PATH 中添加 %ANT_HOME%/bin。另外,要拷貝一個 junit.jar 到 %ANT_HOME%/lib 下,如果 lib 下沒有 junit.jar,AppFuse 的腳本在運行時會給出警告信息。junit.jar 可以從 http://www.junit.org 獲得,也可以從 %AppFuse%/lib/junit3.8.1 目錄下獲得。
  • 從 http://www.MySQL.com 下載最新版的 MySQL,并安裝或解壓縮到任意目錄下。本文采用的是 5.0。
  • 從 http://www.eclipse.org 下載 Eclipse 3.1 或 3.2,安裝到任意目錄下。

    AppFuse 的 Ant 腳本可以在命令行中運行,也可以在 Eclipse 里運行。有關如何在 Eclipse 里執行 Ant 腳本,請參考《用Eclipse開發AppFuse應用》。到此,我們已經為 AppFuse 開發應用準備好了環境,下面讓我們開始使用 AppFuse 創建項目。

新建項目

   AppFuse 的便捷與強大之處在于它已經為我們提供了多種開源框架的集成,并且通過使用 Ant 將所有的構建過程自動化。另外,AppFuse 利用 XDoclet 能夠為我們生成絕大多數重要的代碼,例如 dao 類、service 類以及測試用例,等等,并且能夠將大量的配置文件也一并生成好,從而極大地節省了開發人員的時間。

    用 AppFuse 進行開發通常有三種模式:“自上而下”,“自下而上”以及“混合模式”。采用“自上而下”(由 Java 對象向數據庫對象創建的過程)的方式固然比較符合“面向對象”的設計思維,但是為此要編寫大量的 XDoclet 的 tag 也確是一件痛苦的事情。相比較而言,采用“自下而上”(由數據庫對象生成 Java 對象的過程)就顯得簡單許多 -- 只需要提供數據庫表結構。然而,對于較為復雜的系統,尤其是類之間具有大量的關聯的情形,仍然需要采用“自上而下”的創建模式。因此,在實際的項目開發中,將兩種模式進行混合使用比較常見,這也就是“混合”模式。本文采用“自下而上”的模式。

    本文的 AppFuse 安裝在 "c:/opt" 下面。打開命令行控制臺,進入 "c:/opt/appfuse",運行 “ant new”,為簡單起見,所有參數選用默認值,見圖 2。


圖 2. ant new -- 新建項目
使用 AppFuse 快速構建 J2EE 應用(圖二) 

    腳本運行成功后,新項目創建在 c:/opt/myapp 下(與 AppFuse 目錄同級),myapp 是 AppFuse 默認的項目名稱。將該項目導入到 Eclipse 中,并根據 《用Eclipse開發AppFuse應用》 進行必要的設置。以下是兩個你可能需要進行的配置:


  • AppFuse 默認連接 MySQL 的用戶名是 root,密碼為空。如果你的 root 密碼不是空,需要修改 C:/opt/myapp/build.properties 中的 database.admin.passWord 項,記得將注釋去掉。
  • AppFuse 默認不是用 utf-8 創建數據庫,如果你需要支持多語言,需要修改 C:/opt/myapp/metadata/sql/mysql-create.sql 中的創建數據庫的語句,修改如下:

    清單 1. 創建數據庫語句
    create database if not exists @DB-NAME@ CHARACTER SET utf8 COLLATE utf8_general_ci;                  

    注:AppFuse 會在構建期將 @DB-NAME@ 替換成你指定的數據庫名(本文中為“mydb”)。


    在 c:/opt/myapp 下運行“ant setup test-all”?!皊etup” 完成了很多“設置”工作:創建數據庫、構建 dao 和 serive 類、加載樣本數據、創建 war 文件并部署到 tomcat,等等?!皌est-all” 運行所有的測試用例:對 dao,service 以及頁面的測試。如果這個腳本運行成功,說明開發環境一切就緒。這時,啟動 Tomcat,通過訪問 http://localhost:8080/myapp 就能夠看到 AppFuse 的登錄界面了。AppFuse 預定義了兩個用戶:mraible 和 tomcat,密碼都是 tomcat。mraible 屬于管理員角色(能夠管理用戶信息),tomcat 屬于普通用戶角色。用 mraible 登錄可以看到 圖 3的界面。


圖 3. AppFuse 的初始界面
使用 AppFuse 快速構建 J2EE 應用(圖三)

     或許此時,你已驚奇地發現,自己不過只運行了一次 Ant 腳本,但是系統已經擁有“用戶管理”、“郵件”、“文件上傳” 等功能 -- 這就是 AppFuse “開箱即用”的優勢。接下來讓我們開始開發前述的應用示例。

創建數據庫表

在 mydb 數據庫中執行如下語句創建 employee 表:


清單 2. 創建 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`)                  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;   

用 AppGen 生成代碼

    AppFuse 自帶了一個代碼生成工具 -- AppGen,它位于 c:/opt/myapp/extras/appgen 目錄下面。AppGen 可以生成絕大部分我們需要的代碼,比如 dao 類,service 類,菜單、增刪改的 web 頁面、配置文件、樣本數據,等等。AppGen 利用 XDoclet 生成代碼,因此可以在 extras/appgen/src 看到很多 .xdt 文件,這些就是 XDoclet 的模版定義文件。如果你希望自己編寫 dao 和 service 類,就運行“install”這個 target,否則就用 “install-detailed” ,它可以幫你搞定一切。下面就讓我們來運行 “install-detailed” 生成代碼。在 c:/opt/myapp/extras/appgen 下運行 “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] What is the name, if any, of the module for your table (i.e. organization)?hr...                  

    前兩個問題都很直觀:選擇從 table 生成代碼,表名是 employee。第三個問題是讓用戶輸入使用的模塊名,如果你希望 AppFuse 幫你按模塊生成代碼的話,就需要輸入一個模塊名稱。這里,我們輸入“hr”。如果運行成功,在 Eclipse 中會看到如下的目錄結構:


圖 4. “install-detailed” 執行后的 Eclipse
使用 AppFuse 快速構建 J2EE 應用(圖四)

表 2 列出了 "install-detailed" 生成的主要文件。


表 2. "install-detailed" 生成的主要文件列表
文件說明 myapp/src/dao/org/appfuse/dao/hibernate/applicationContext-hibernate.xml 在其中增加了 employeeDao 的聲明 myapp/src/dao/org/appfuse/hr/model/Employee.java Employee 類 -- Java Bean myapp/build/dao/gen/org/appfuse/hr/model/Employee.hbm.xml Employee 類的 Hibernate 映射文件 myapp/src/dao/org/appfuse/hr/dao/EmployeeDao.java 定義關于 employee 的 dao 層的操作 myapp/src/dao/org/appfuse/hr/dao/hibernate/EmployeeDaoHibernate.java EmployeeDao 的 Hibernate 實現類 myapp/src/service/org/appfuse/service/applicationContext-service.xml 在其中增加了employeeManager的聲明 myapp/src/service/org/appfuse/hr/service/EmployeeManager.java 定義關于 employee 的 service 層的操作 myapp/src/service/org/appfuse/hr/service/impl/EmployeeManagerImpl.java EmployeeManager 的實現類 myapp/src/web/org/appfuse/hr/webapp/action/EmployeeForm.java employee 的添加/修改頁面對應的 tapestry 類 myapp/src/web/org/appfuse/hr/webapp/action/EmployeeList.java employee 的列表頁面對應的 tapestry 類 myapp/test/dao/org/appfuse/hr/dao/EmployeeDaoTest.java employee dao 類的測試用例 myapp/test/service/org/appfuse/hr/dao/EmployeeManagerTest.java employee service 類的測試用例 myapp/test/web/org/appfuse/hr/webapp/action/EmployeeFormTest.java employee 添加/修改頁面類的測試用例 myapp/test/web/org/appfuse/hr/webapp/action/EmployeeFormTest.java employee 列表頁面類的測試用例 myapp/web/pages/hr/employeeForm.Html employee 添加/修改頁面 html 模版文件 myapp/web/pages/hr/employees.html employee 列表頁面 html 模版文件 myapp/web/pages/hr/employeeForm.page employee 添加/修改頁面規格文件 myapp/web/pages/hr/employees.page employee 列表頁面規格文件


    不過,AppFuse 并不知道開發者需要加載哪些 hbm 文件,所以要手工將 Employee.hbm.xml 文件添加到配置文件中:打開 applicationContext-hibernate.xml,在 “sessionFactory” 的 bean 聲明中,找到 “mappingResources” 屬性的定義,增加 “<value>org/appfuse/hr/model/Employee.hbm.xml</value>”。


清單 4. applicationContext-hibnerate.xml 中添加 Employee.hbm.xml
    ...<beans>    <!-- Hibernate SessionFactory --> <bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">-- XML error: The previous line is longer than the max of 90 characters -- <property name="dataSource" ref="dataSource"/> <property name="mappingResources"> <list> <value>org/appfuse/hr/model/Employee.hbm.xml</value> <value>org/appfuse/model/Role.hbm.xml</value> <value>org/appfuse/model/User.hbm.xml</value> </list> </property>...

    在 c:/opt/myapp 下運行 “ant deploy”。打開 “http://localhost:8080/myapp”,用 mraible/tomcat 登錄,“Employee List” 已經被添加到菜單里了。


圖 5. myapp 的原始主頁面
使用 AppFuse 快速構建 J2EE 應用(圖五)

點擊 “Employee List” 鏈接,進入“員工信息列表”頁面。


圖 6. myapp 的原始員工信息列表頁面
使用 AppFuse 快速構建 J2EE 應用(圖六)

點擊“添加”按鈕或點擊任意一行數據,進入“員工信息添加/修改/刪除”頁面。


圖 7. myapp 的原始員工信息添加/修改/刪除頁面
使用 AppFuse 快速構建 J2EE 應用(圖七)

    不難看出,雖然 AppFuse 幫我們生成了頁面,但是這些頁面并非那么“理想”,我們仍然需要根據實際的需求做些調整。

根據項目需求調整代碼

在本文中,做了如下代碼修改:

  • 將所有頁面文字翻譯成中文:AppFuse 中用到的所有 Resource Bundle 文件位于 myapp/web/WEB-INF/classes 目錄下(以ApplicationResources開頭的properties文件)。更改 ApplicationResources_zh_CN.properties 的文件編碼方式為“UTF-8”。然后,把 ApplicationResources.properties 中 “# -- Employee-START” 和 “# -- Employee-END” 之間的項拷貝到 ApplicationResources_zh_CN.properties 中,并逐項翻譯成中文。AppFuse 會在腳本運行的時候自動用 native2ascii 進行編碼轉換。另外,AppFuse 默認對 “button.done” 的翻譯是“做”,這不太合適,所以改為“完成”。
  • 在“員工信息列表頁面”去掉了 id 列,并調整了列的順序:只要修改 employees.html 就可以。
  • 在“員工信息添加/修改/刪除頁面”,將“所在部門”、“職位”、“狀態”改為下拉列表:需要修改 employeeForm.html、employeeForm.page、EmployeeForm.java。用 PropertySelection 組件實現下拉列表,用 Resource Bundle 文件定義真正顯示的選項文本。
  • 增加了一個“人事管理”的角色,用來執行員工信息管理的權限控制:具體介紹見“系統安全”。
  • 添加了一個新的主題 “mytheme”(只是更改了界面的顏色):具體介紹見“頁面布局和樣式”。

    應用了上述修改后,在 c:/opt/myapp 中運行 “ant deploy” 重新打包整個項目并發布。以下是修改后的界面截圖:


圖 8. 修改后的 myapp 主頁面
使用 AppFuse 快速構建 J2EE 應用(圖八)

圖 9. 修改后的 myapp 員工信息列表頁面
使用 AppFuse 快速構建 J2EE 應用(圖九)

圖 10. 修改后的 myapp 員工信息添加/修改/刪除頁面
使用 AppFuse 快速構建 J2EE 應用(圖十)



圖 11. 修改后的 myapp 用戶管理頁面
使用 AppFuse 快速構建 J2EE 應用(圖十) 

其他功能

    一個系統除了包含核心邏輯之外,還有其他一些輔助功能,它們也是非常重要的。下面,讓我們來看看如何在 AppFuse 中開發這些功能。

語言國際化

    如果你的系統不僅僅支持一種語言,那么就需要考慮這個問題。在 AppFuse 中,Resource Bundle 文件是位于 web/WEB-INF/classes 目錄下的以 ApplicationResources 開頭的 properties 文件。Tapestry 有自己的國際化文本機制。但是在 AppFuse 中,并不全是 Tapestry 頁面,仍有些地方使用 jsp,而這些頁面使用 JSTL 的 fmt 標簽顯示國際化文本。不過,AppFuse 已經將這二者的“源頭”進行了整合,因此,對用戶而言,只需要在 ApplicationResources*.properties 中定義需要國際化的文本。

     但是,在 Eclipse 中可以看到,AppFuse 的 properties 文件默認的編碼不是 UTF-8,而是 ISO-8859-1,這樣會導致最后通過 native2ascii 轉換后的文件都是 “???”,所以用戶需要自己把這些文件轉成 UTF-8。轉換的方法很簡單:在 properties 文件上點右鍵,在右鍵菜單上選擇 Properties,打開屬性窗口后,更改 “Text file encoding” 為 UTF-8。在修改編碼前,最好先把已有的文字拷貝出來,轉換好之后再粘貼回去,否則會導致原先翻譯好的文字變成亂碼。


圖 12. ApplicationResources_zh_CN.properties 的屬性窗口
使用 AppFuse 快速構建 J2EE 應用(圖十二)

    AppFuse 在發布項目的時候,會自動用 native2ascii 轉換這些資源文件。如果你想使用其他資源文件名,可以修改 web/WEB-INF/web.xml 中的 “javax.servlet.jsp.jstl.fmt.localizationContext” 的參數值。

頁面布局和樣式

    使用 AppFuse,能夠很方便的修改系統的整體布局和樣式,因為 AppFuse 使用了一種強大的 “CSS框架”。項目創建好之后,在 web/styles 目錄下,有三個目錄:andreas01,puzzlewithstyle 和 simplicity。這些是 AppFuse 自帶的三種主題,目錄名即 CSS 框架的主題名。屬于“管理員”角色的用戶可以在登錄后通過在 url 后面添加形如 "?theme=andreas01" 的參數更改系統使用的主題。如下圖:


圖 13. 應用了 “puzzlewithstyle” 的 myapp
使用 AppFuse 快速構建 J2EE 應用(圖十三)

    系統默認使用的主題由 web/WEB-INF/web.xml 中的 “theme” 參數指定,AppFuse 默認使用的主題是 “simplicity”。更改或創建新的主題也很簡單,只要在 web/styles 目錄下,新建一個自己的目錄,并參照已有主題的編寫規范定義自己的主題。本文中,拷貝了 simplicity 目錄,更名為 “mytheme”,然后將里面的字體顏色從“藍色”基調改成了“綠色”基調,并修改 web.xml 中的 theme 參數值為 “mytheme”,這樣 myapp 默認使用的就是 mytheme 的主題了,如圖 8所示。你也可以從 http://css.appfuse.org/themes/ 得到更多關于 “CSS框架” 的信息。

系統安全

    AppFuse 使用 Acegi 進行安全管理。Acegi 的配置信息位于 web/WEB-INF/classes/security.xml。事實上,Acegi 是被集成到 Spring 當中的,因此這個文件是 Spring 的配置文件格式。在 web/WEB-INF/web.xml 中,該文件被指定在應用啟動前會被加載:


清單 5. web.xml 關于 Spring 配置文件的定義

    ...<!-- Context Configuration locations for Spring XML files -->    <context-param>        <param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext-*.xml,/WEB-INF/security.xml</param-value>    </context-param>                  ...


本文關于系統安全的實現如下:

  1. 在數據庫中增加新的角色“hr”:編輯 myapp/metadata/sample-data.xml 文件,增加如下黑體的部分:

    清單 6. sample-data.xml 中角色 “hr” 的記錄
          ...<table name='role'>    <column>id</column>    <column>name</column>    <column>description</column>    <row>      <value>1</value>      <value>admin</value>      <value><![CDATA[Administrator role (can edit Users)]]></value>    </row>    <row>      <value>2</value>      <value>user</value>      <value><![CDATA[Default role for all Users]]></value>    </row>    <row>      <value>3</value>      <value>hr</value>      <value><![CDATA[Role for employee mangement]]></value>    </row>  </table>                  ...

    AppFuse 使用 dbunit 加載樣本數據到數據庫中,sample-data.xml 為 dbunit 提供樣本數據定義。修改完 sample-data.xml,在 c:/opt/myapp/ 下運行 “ant db-load”,樣本數據被重新加載。這樣,我們就在數據庫中定義了一個新的角色記錄 “hr”。
  2. 定義角色名稱的中文顯示文本:在 myapp/sr/web/webapp/action/UserForm.java 的方法 pageBeginRender 中找到如下代碼:
    // initialize drop-downsif (getAvailableRoles() == null) {List roles = 
    (List) getServletContext().getAttribute(Constants.AVAILABLE_ROLES); setAvailableRoles(new RoleModel(roles)); }

    將其做如下修改:
    // initialize drop-downsif (getAvailableRoles() == null) {    List roles = 
    (List) getServletContext().getAttribute(Constants.AVAILABLE_ROLES); for(int i=0;i<roles.size();i++){ LabelValue role=(LabelValue) roles.get(i); role.setLabel(getText("rolelabel_"+role.getValue())); } setAvailableRoles(new RoleModel(roles)); }

    并在 web/WEB-INF/classes/ApplicationResources_zh_CN.properties 中增加角色名稱的定義:
    rolelabel_admin=系統管理員rolelabel_user=普通用戶                  rolelabel_hr=人事管理

    AppFuse 默認在用戶管理界面上顯示的角色的名稱是表 role 中的名稱,這樣無論切換到何種語言,角色名稱都是 “admin”、"user"、“hr” 等等,角色名稱不能根據 Locale 用相應的語言顯示。因此,本文將角色的名稱用 Resource Bundle 文件定義,數據庫中存儲 “key” 值。修改后的效果見 圖 10。
  3. 配置“安全策略”:在 web/WEB-INF/security.xml 的 bean "filterInvocationInterceptor" 聲明中增加如下“黑體”的一行:
    <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">        <property name="authenticationManager" ref="authenticationManager"/>        <property name="accessDecisionManager" ref="accessDecisionManager"/>        <property name="objectDefinitionSource">            <value>                PATTERN_TYPE_APACHE_ANT                /clickstreams.jsp*=admin                /flushCache.*=admin                /passwordHint.html*=ROLE_ANONYMOUS,admin,user                /reload.*=admin                /signup.html*=ROLE_ANONYMOUS,admin,user                /users.html*=admin                /employees.html*=hr                /**/*.html*=admin,user            </value>        </property>                      </bean>

    “/employees.html*=hr” 的意思是:只有 hr 這個角色可以訪問形如 “/employees.html*” 的 url。
  4. 將“員工信息維護”菜單關聯到指定角色 hr:在 web/WEB-INF/menu-config.xml 中在 “EmployeeMenu” 的定義中增加 “roles='hr'”:
        <!--Employee-START--><Menu name="EmployeeMenu" title="employeeList.title" 
    page="/employees.html" roles="hr"/> <!--Employee-END-->

    于是,“員工信息維護”的菜單入口只對屬于“人事管理”角色的用戶顯示,對其他用戶則隱藏。
  5. 分配角色 “hr” 給 tomcat:將“人事管理”角色分配給某一用戶,例如 tomcat。則 tomcat能夠看見并訪問“員工信息維護”相關頁面,而其他用戶的界面上則沒有“員工信息維護”這個菜單入口。并且,如果用戶試圖通過url訪問employees.html的時候會看到如下頁面:

    圖 14. “訪問被拒絕”頁面
    使用 AppFuse 快速構建 J2EE 應用(圖十四)

    圖 14是 AppFuse 提供的默認“訪問被拒絕”頁面,你可以通過修改 web/403.jsp 把它定制成自己喜歡的頁面。


事務控制

    AppFuse 利用 Spring 的事務管理機制。Spring 可以以聲明的方式,對方法進行事務控制,并且可以根據實際的需要,調整控制粒度?!奥暶鞣绞健钡暮锰幵谟冢汉诵拇a只需要關注業務邏輯,而將事務控制完全交由配置文件管理,一方面是核心代碼簡潔清晰,另一方面也便于進行集中配置管理。

    事務控制一般是定義在 service 類的方法上的。AppFuse 的所有 service 類都聲明在 src/service/applicationContext-service.xml 中,該文件中包含有一個 “tXProxyTemplate” bean 的聲明,它定義了基本事務策略。其它的 service 類從 “txProxyTemplate” 繼承,并可以“重寫”事務策略。例如,AppFuse 對 userManager 的聲明如下:


    <!-- Transaction template for Managers, from:http://blog.exis.com/colin/archives/2004/07/31/
concise-transaction-definitions-spring-11/ -->-- XML error: The previous line is longer than the max of 90 characters -- <bean id="txProxyTemplate" abstract="true"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <!-- Transaction declarations for business services.
To apply a generic transaction proxy to-- XML error: The previous line is longer than the max of 90 characters -- all managers, you might look into using the BeanNameAutoProxyCreator --> <bean id="userManager" parent="txProxyTemplate"> <property name="target"> <bean class="org.appfuse.service.impl.UserManagerImpl"> <property name="userDao" ref="userDao"/> </bean> </property> <!-- Override default transaction attributes b/c of UserExistsException --> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED,-UserExistsException</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> <!-- This property is overriden in applicationContext-security.xml to add method-level role security --> <property name="preInterceptors"> <list> <ref bean="userSecurityInterceptor"/> </list> </property> </bean>

    Spring 提供了大量的參數和選項使開發者能夠靈活地管理事務。有關 Spring 使用方面的知識,請參閱 Spring 的文檔。另外,《Spring in Action》也是一個不錯的選擇。

日志


    AppFuse 集成了 Log4j 進行日志管理,log4j.properties 位于 web/WEB-INF/classes 目錄下。AppFuse 已經在絕大多數基類(諸如,BasePage.java、BaseDaoHibernate.java 以及 BaseManager.java 等)中加入了如下用于輸出日志的成員變量:

protected final Log log = LogFactory.getLog(getClass());                     
    因此,開發者只需要在自己的代碼中調用 log 的方法就可以了,例如:“log.debug("entered 'delete' method");”。

郵件

    AppFuse 集成了 Spring 的發送郵件的功能。發送郵件需要用的參數,如主機、端口等信息在 web/WEB-INF/classes/mail.properties 中進行配置。和發送郵件相關的 bean 已經在 applicationContext-service.xml 中聲明:mailEngine、mailSender、velocityEngine 以及 mailMessage。用戶只需要在自己的類中 “注入” mainSender 的實例,就可以發送郵件了。具體使用方法,請參閱Spring的文檔。

緩存

    AppFuse 對緩存機制的支持源自 Hibernate 對緩存的支持。Hibernate 提供了對五種緩存機制的集成,AppFuse 默認提供了其中的兩種:Ehcache 和 Oscache。開發者也可以根據需要自行添加和配置。Acegi 默認提供了對 Ehcache 支持的實現,所以 Ehcache 是較好的選擇。ehcache.xml 和 oscache.properties 位于 web/WEB-INF/classes 中。

結束語

    使用 AppFuse 創建 Web 應用,步驟非常簡單,你只需要了解如何運行 Ant 就能夠使用 AppFuse;使用 AppFuse 創建 Web 應用,非常快速,因為 AppFuse 已經幫我們完成大部分代碼生成/集成/配置的工作;使用 AppFuse 創建 Web 應用,非常省力,因為 AppFuse 已經提供了很多“開箱即用”的功能。體驗快速開發,從 AppFuse 開始。

關于作者

使用 AppFuse 快速構建 J2EE 應用(圖十五)

使用 AppFuse 快速構建 J2EE 應用(圖十六)

使用 AppFuse 快速構建 J2EE 應用(圖十五)

沈銳在 J2EE 項目開發方面有多年的經驗,目前在 IBM CSDL 從事 IBM Workplace Dashboard Framework 產品的開發工作。他對 Java 的開源技術有著濃厚的興趣,歡迎使用 shenrui@cn.ibm.com 與他交流。

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019中文字幕一页二页| 精品国产视频在线| 亚洲电影在线观看| 国产一区二区三区精品久久久| 精品日韩美女的视频高清| 日韩av在线免费看| 成人av番号网| 成人h视频在线观看播放| 91久久综合亚洲鲁鲁五月天| 成人网中文字幕| 丰满岳妇乱一区二区三区| 精品人伦一区二区三区蜜桃网站| 91中文字幕在线| 国产网站欧美日韩免费精品在线观看| 大荫蒂欧美视频另类xxxx| 欧美激情视频免费观看| 亚洲毛茸茸少妇高潮呻吟| 日韩欧美在线字幕| 成人性生交大片免费看视频直播| 成人黄色免费网站在线观看| 久久国产精品首页| 欧美理论电影在线观看| 欧美国产日本高清在线| 亚洲精品v天堂中文字幕| 欧美做受高潮1| 欧美日韩aaaa| 久久久亚洲影院| 亚洲精品有码在线| 久久久www成人免费精品| 亚洲精品国精品久久99热| 久久久久亚洲精品成人网小说| 国产亚洲精品成人av久久ww| 欧美日韩国产91| 高跟丝袜一区二区三区| 国产成人精品综合| 国产成人亚洲综合91| 欧美一区二区.| 久久久精品免费| 91色中文字幕| 成人国产精品免费视频| 国产一级揄自揄精品视频| 最新国产精品拍自在线播放| 狠狠躁夜夜躁人人躁婷婷91| 国产精品第3页| 亚洲一区二区自拍| 色无极亚洲影院| 伊人久久综合97精品| 久久成人av网站| 亚洲天堂av电影| 亚洲国产欧美一区二区三区久久| 成人免费高清完整版在线观看| 欧美日韩精品在线播放| 一个人看的www欧美| 日韩精品一二三四区| 97视频色精品| 日韩大陆欧美高清视频区| 日本欧美中文字幕| 亚洲成人精品久久| 欧美xxxx14xxxxx性爽| 日本久久91av| 不卡在线观看电视剧完整版| 上原亚衣av一区二区三区| 日韩精品一区二区视频| 久久久久一本一区二区青青蜜月| 国产成人av在线播放| 性欧美激情精品| 久久av中文字幕| 正在播放欧美一区| 最好看的2019的中文字幕视频| 午夜精品久久久久久久久久久久久| 欧美激情亚洲综合一区| 久久久久久久久久久国产| 亚洲深夜福利在线| 91久久久精品| 亚洲第一区中文99精品| 亚洲一区二区福利| 欧美www视频在线观看| 日韩中文在线中文网在线观看| 九九精品视频在线| 国产欧美精品xxxx另类| 亚洲欧美国产精品va在线观看| 亚洲精品一区久久久久久| 国产欧美精品xxxx另类| 黄网站色欧美视频| 亚洲天堂影视av| 伊人激情综合网| 久久资源免费视频| 中文字幕日韩欧美| 岛国精品视频在线播放| 日韩av电影院| 亚洲精品国精品久久99热| 久久婷婷国产麻豆91天堂| 亚洲精品色婷婷福利天堂| 亚洲美女激情视频| 国产精品最新在线观看| 午夜精品久久久久久久白皮肤| 久久久久久高潮国产精品视| 国产精品美女久久久免费| 欧美日韩爱爱视频| 国产va免费精品高清在线| 成人性生交大片免费看小说| 国产精品一区二区3区| 日本成人黄色片| 久久久噜噜噜久久中文字免| 日本高清久久天堂| 91在线免费看网站| 热门国产精品亚洲第一区在线| 久99久在线视频| 国产一区二区美女视频| 国产亚洲a∨片在线观看| 国产成一区二区| 久久久女女女女999久久| 色噜噜狠狠色综合网图区| 久久久精品一区| 国产精品一区二区久久精品| 久久久久久久久91| 国产福利视频一区二区| 国产精品aaa| 久久久久久久久久婷婷| 高清欧美性猛交xxxx黑人猛交| 色婷婷亚洲mv天堂mv在影片| 国产一区香蕉久久| 欧美不卡视频一区发布| 国产精品伦子伦免费视频| 欧美日韩国产黄| 国产精品久久久久久久久久久不卡| 午夜精品久久久久久久久久久久久| 久久久久久成人| 欧美精品激情blacked18| 久久精品国产精品| 欧美成人自拍视频| 国产精品久久久久久久久久三级| 国产91在线播放九色快色| 国产精品视频久久久| 日韩精品久久久久久久玫瑰园| 日本高清不卡在线| 亚洲欧美日韩国产成人| 国产成人激情小视频| www.99久久热国产日韩欧美.com| 成人xvideos免费视频| 国产视频在线观看一区二区| 欧美尺度大的性做爰视频| 欧美激情视频网站| 亚洲无限av看| 日韩成人中文字幕在线观看| 久久久久久有精品国产| 国产精品高潮呻吟久久av野狼| 国产91精品久久久久| 国产亚洲欧美另类中文| 国产欧美日韩中文| 全球成人中文在线| 国语自产精品视频在线看一大j8| 亚洲视频在线观看网站| 欧美亚洲另类视频| 日韩中文字幕视频| 国产精品综合不卡av| 国产精品人成电影| 国产成人亚洲综合91精品| 欧美一级大片在线免费观看| 91wwwcom在线观看| 亚洲精品成人久久| 4444欧美成人kkkk| 亚洲九九九在线观看| 中文字幕久久亚洲|