整理: MyEclipse 5.5 實戰教程(持續更新,轉帖)

引用自:BeanSoft's Java Blog
http://www.blogjava.net/beansoft/archive/2007/09/04/142716.html

 

此貼乃是將以前所發的幾個零散的短文以及視頻整理在一塊, 便於學習用. 本文將不斷更新, 並對格式進行美化.

啓航 - 第一次接觸 MyEclipse

MyEclipse + Tomcat 開發視頻: 下載,安裝,配置,開發並運行Web項目

 

基礎開發: JSP, Swing

河南話講解 MyEclipse + Tomcat Servlet 開發入門視頻

Video with speech: Using MyEclipse to Develop Swing Applications 

UML 開發

MyEclipse UML 入門視頻2 - 根據代碼反向工程生成 UML

MyEclipse UML 入門視頻

輕量級開源框架: SSH 應用開發

MyEclipse Hibernate 快速入門中文版

用 MyEclipse 2 分鐘開發一個 Hibernate 應用的步驟

用 MyEclipse, 就有必要把 MyEclipse 快速開發的功能熟悉一下. 當我們熟悉了基本的開發過程之後, 就需要考慮用順手的 IDE 來讓我們的開發速度有個飛躍了.

這次討論的主題包括: Hibernate 快速開發, Spring 快速開發, Struts 登錄應用開發, UML 建模, 可視化Swing界面開發這些個內容.

首先就是大家可以看 MyEclipse 的幫助文檔進行學習了, 裏面很全, 圖文並茂, 唯一缺點呢就是文檔是英文的. 具體方法:
菜單 Help -> Help Contents, 然後會在瀏覽器裏打開 MyEclipse 幫助文檔, 展開左邊的 MyEclipse Learning Center, 就能看到詳細的開發教程了. 其中 "JEE Application Development" 的部分是我們重點關注的內容.

使用的開發工具是 MyEclipse 5.5.1 GA,  Windows/Linux 版本均可.

好了, 現在簡單介紹一下 用 MyEclipse 2 分鐘開發一個 Hibernate 應用的步驟.
1. 在 MyEclipse 視圖下的 Servers 面板上, 啓動 MyEclipse Derby 這個服務器. 相信大家都很熟悉這個過程了.
2. 選擇菜單 Window -> Open Persipective -> MyEclipse Database Explorer, 打開新的數據庫瀏覽視圖.
3. 在最左邊的 DB Browser 面板下選中 MyEclipse Derby 項, 點擊右鍵並選擇彈出菜單中的菜單項 Open Connection 來打開數據庫連接並顯示所有的數據庫和表格.
4. 展開 MyEclipse Derby  節點, 單擊選中第一項 Connected to MyEclipse Derby, 點擊右鍵並選擇彈出菜單中的菜單項 New SQL Editor.
5. 在 SQL 編輯器裏鍵入下列建表語句:

						create
						table testUser(
id intnotnull,
username varchar(200),
age int,
primarykey ("ID")
)


, 然後點擊編輯器上面的綠色的運行向右箭頭按鈕來創建表格.
6. 新建一個 Java Project 名字爲 MyHibernateTest, 這個過程無需贅述了, 建議建項目的時候將 src 目錄和 bin(或者classes)目錄分開, 另外提示你切換透視圖的時候一定要切換過去到 Java 透視圖, 此時默認會在 Package Explorer 中選中剛纔已經建好的 Java Project, 但是背景爲灰色.
7. 首先單擊一下左邊的 Package Explorer 中新建的 MyHibernateTest 項目來使其高亮選中, 接着點擊菜單項 MyEclipse -> Add Hibernate Capabilities..., 接着會彈出對話框 New Hibernate Project 提示你設置當前項目的 Hibernate 屬性.
對話框的第一頁選擇 Hibernate 3.1, 其它保持默認;
第二頁同樣如此, 保持默認來創建新的 Hibernate 配置文件;
第三頁Specify Hibernate database connection details則點擊 DB Driver 下拉框選擇 MyEclipse Derby, 這時候下面的輸入框會自動填好數據庫連接對應的值.
第四頁 Define SessionFactory properties 則先點擊 Java Package 一行最右側的 New... 按鈕來新建一個名字爲 dao 的包. 這時候你可以看到 Finish 按鈕終於不爲灰色了,  點擊它完成給項目加入 Hibernate 開發功能的操作, 包括 Hibernate 類庫, jdbc 驅動和 Hibernate 配置文件都已經設置完畢了.
8. 選擇菜單 Window -> Open Persipective -> MyEclipse Database Explorer, 打開數據庫瀏覽視圖. 展開 Connected to MyEclipse Derby 下面的 APP 節點, 再選中下面的 TABLE 目錄,   點擊右鍵並選擇彈出菜單中的菜單項 Refresh 來刷新數據庫表格列表, 這時候展開此節點可以看到下面出現了一個名爲 TESTUSER 的表.
9. OK, 最關鍵的操作即將開始了. 請在 TESTUSER 節點上點擊右鍵並選擇彈出菜單中的菜單項 Hibernate Reverse Engineering..., 彈出一個對話框提示你 Save All Modified Resources, 點擊 OK 並且選中 MyHibernateTest, 在 File name 右側的文件名輸入框中輸入 create.sql 來保存我們最開始所寫的那個建表的 SQL 文件.
10. 接着 Hibernate Reverse Engineering 對話框彈出了.
點擊 Java src folder 一行最右側的 Browser.. 按鈕來選擇源碼目錄,  並把下面的 Java package 右側的輸入框中輸入包名 dao, 我們選擇 /MyHibernateTest/src 目錄並點擊完成,  接着選中下面的三個複選框:
[x] Hibernate mapping file (*.hbm.xml) for each database table
[x] Java Data Object (POJO <> DB Table)
[x] Java Data Access Object (DAO) (Hibernate 3 only)

好了, 點擊 Finish 按鈕, 就可以看到反向工程的忙碌對話框. 最後當一切結束後彈出對話框提示切換視圖到 MyEclipse Hibernate perspective 的時候點擊 "OK" 按鈕, 您就可以看到工作成果了, 包括下列文件:
HibernateSessionFactory.java
Testuser.hbm.xml
BaseHibernateDAO.java
IBaseHibernateDAO.java
Testuser.java
TestuserDAO.java
hibernate.cfg.xml
. 那麼, 我們的 POJO 已經生成了, 就是 Testuser.java,  DAO 的代碼也已經生成, 就是 TestuserDAO, 這些代碼都已經幫我們寫好, 當然我們可以做進一步的修改來適應我們的要求. 當你用工具生成代碼的時候, 請確保您已經瞭解了 Hibernate 手工開發的步驟. 好了, 接下來的事情, 我們就可以
11. 修改 Testuser.hbm.xml 裏面的主鍵生成方式爲合適的方式(默認的是 <generator class="assigned" />),  或者一些屬性映射關係, 這些仍然要求開發人員對 Hibernate 的配置文件有一定的瞭解;
或者
12. 繼續重複 1, 3, 5, 8, 9, 10 來生成更多的 POJO 或者 DAO.
13. 編寫測試代碼來運行測試.

小結: 雖然這些步驟很繁瑣,  但是當你熟練之後完全可以在2分鐘內完成所有操作, 這樣就省去了手工編寫大量 Java 代碼和 XML 配置文件的痛苦, 這也是實際中程序員採取的偷懶的步驟.
前提: 您一定要理解 Hibernate 手工開發的步驟和 JDBC 驅動的概念, 否則生成的文件有時候是有潛在的問題的, 工具只能幫你完成部分工作, 不能完成全部工作.

更多提示: 當你執行 第 9 步的時候, 還可以看到彈出的菜單中有 JPA 和 EJB 3 反向工程的選項, 這個就留給大家做練習了, 同樣也能生成類似的 JPA 或者 EJB  3 實體類, 當然您實現要建好支持 JPA 或者 EJB 的項目.

如果能上網, 建議去看 MyEclipse 官方網站的操作動畫:
Introduction to Hibernate Tutorial
http://www.myeclipseide.com/images/tutorials/quickstarts/introduction_to_hibernate/tutorial.html

相關的操作視頻可以看這裏: 用MyEclipse 4 分鐘開發Spring整合Hibernate應用的視頻

其它參考資料:
Hibernate 英文 PPT 及 MyEclipse 操作視頻整理
推薦一點 MyEclipse 的官方Spring,Hibernate入門視頻教程

有任何問題歡迎聯繫 [email protected]  討論.

 

用 MyEclipse 開發 Spring 入門操作

今天介紹的第二個課題就是介紹 Spring 的快速開發, 說是快速開發, 其實能幫助的地方除了語法高亮和自動添加類庫外也沒多少東西了.

1. 新建普通 Java 項目 MySpringTest. 這個過程無需贅述了, 建議建項目的時候將 src 目錄和 bin(或者classes)目錄分開, 另外提示你切換透視圖的時候一定要切換過去到 Java 透視圖, 此時默認會在 Package Explorer 中選中剛纔已經建好的 Java Project, 但是背景爲灰色.
2. 首先單擊一下左邊的 Package Explorer 中新建的 MySpringTest 項目來使其高亮選中, 接着點擊菜單項 MyEclipse -> Add Spring Capabilities..., 接着會彈出對話框 Add Spring Capabilities 提示你設置當前項目的 Spring 屬性.
對話框的第一頁可以選擇全部的 Spring 框架, 這是最保險的做法, 不過我們的例子只需要選中Spring 2.0 Core Libraries 就可以了. 點擊 "Next" 繼續.
第二頁是 Add Spring bean configuration file. 保持默認值不變就可以了. 最後點擊 Finish.
3. Spring 的開發沒法自動生成 Bean, 這裏大家只好手工來寫了, 也很簡單. 分別複製下面的三個代碼, 然後在 MyEclipse src 目錄上點擊右鍵後選擇菜單項 Paste 就可以生成 Java 類文件了.

						public
						interface Action { 
  public String execute(String str); 
} 

publicclass UpperAction implements Action { 
  private String message; 
  public String getMessage() { 
   return message; 
  } 
  publicvoid setMessage(String string) { 
    message = string; 
  } 
  public String execute(String str) { 
   return (getMessage() + str).toUpperCase(); 
  } 
} 

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 

publicclass TestAction { 

 publicstaticvoid main(String[] args) {
  ApplicationContext ctx = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
  Action bean = (Action) ctx.getBean("theAction");
  System.out.println(bean.execute("Rod"));
 }
} 

4. 雙擊左側在第2步生成的 applicationContext.xml, 然後選擇菜單項 Window -> Show View -> Other..., 在彈出的對話框中選擇 MyEclipse Enterprise Workbench 節點下的 Spring Beans 子節點打開視圖 Spring Beans. 此視圖講出現在主界面的右下側.

5. 展開此視圖中的 MySpringTest 父節點, 並選中 src/applicationContext.xml 子節點, 在此節點上點擊右鍵並選擇彈出菜單項中的 New Bean 來打開 Create a new Spring bean 對話框, 並按照下圖輸入對應的內容.
Bean Id: [theAction]
Bean class: [UpperAction]
接下來請單擊一下 Tab 面板 Properties 並點擊其中的 Add... 按鈕, 在接下來彈出的 Property Wizard 對話框中按照下圖輸入/選擇內容:
Name: [message]
Spring type: [value]
Type: [java.lang.String]
Value:[Hello_]
最後點擊兩次 Finish 按鈕關閉所有嚮導對話框. 然後點擊菜單 File -> Save. 此時可以看到 applicationContext.xml 的內容如下所示:

						<?
						xml
						version
						="1.0"
						encoding
						="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"><beanid="theAction"class="UpperAction"abstract="false"lazy-init="default"autowire="default"dependency-check="default"><propertyname="message"><valuetype="java.lang.String">Hello_</value></property></bean></beans>

然後雙擊 Package Explorer 下 MySpringTest/src/TestAction.java 打開源代碼, 然後點擊菜單 Run -> Run As -> 1. Java Application, 如果沒有錯誤的話將會出現如下的輸入, 您的第一個 Hello Spring 運行成功了:
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
HELLO_ROD

接着您就可以對着參考書繼續創建類, 修改 applicationContext.xml 做更多的練習了.

開發整合 Hibernate 的關鍵操作點截圖:
1. 在數據庫瀏覽器中選擇反向工程菜單;

2. 對話框的選項說明

參考視頻:

夏昕 <<Spring 開發指南入門>>1 分鐘上手教程視頻(不帶解說) 

小電影: 用 MyEclipse 開發 Spring + Struts + Hibernate 的總結與操作視頻(9分鐘)

 

MyEclipse生成的Spring+Hibernate無法保存數據問題的解決方法

用 MyEclipse 的自動生成功能產生的 Spring + Hibernate 的 DAO 有時候會出現不能保存數據但是可以查詢數據的問題, 這是因爲默認生成的 Spring 配置文件裏面沒有包含對事務的操作, 也就是沒有 commit Hibernate transaction 的調用所以無法保存數據. 也就是正確的調用需要 beginTran, save, commit, 但是現在就少了 tran 的調用代碼部分. 因爲剛剛接觸 Spring 這個 "輕量級" 非侵入框架不久, 所以好多問題不是太熟悉, 最近收集了一些資料看了看總算解決了問題. 有問題不要緊, 只要能通過學習來解決它就可以了, 我個人並不很喜歡沒事去精通 XXX 框架, 而是喜歡做一些解決問題和查資料能力的鍛鍊, 有了後面所提的能力, 不管改天是不是出了個 Winter 框架, 也不會擔心落伍, 當然前提是基礎知識要牢固, 否則很容易看不懂.

解決方法是在配置文件裏"侵入性"(必須這樣做, 做額外的配置和修改, 否則就無法正常工作, 所以是侵入性的)的加入事務配置後就可以正常的保存數據到 Derby, Oracle 等數據了, 也有其它的解決辦法, 希望用 Spring 比較早的經驗多的人提出建議:

1. 用 Ecipse 的重構給自動生成的 UsersDAO 類添加一個接口, 裏面包含所有的方法聲明, 例如 IUsersDAO, 加入接口的目的是爲了使用 JDK 的動態代理方式實現的 Spring AOP 來工作, 也有另一種解決方案使用 CGLIB 的話就不需要這一步了, 這種方式下一次討論.

						public
						interface IUsersDAO { 

 publicabstractvoid save(Users transientInstance);
} 

publicclass UsersDAO extends HibernateDaoSupport implements IUsersDAO {
...
 publicvoid save(Users transientInstance) {
  log.debug("saving Users instance");
  try {
   getHibernateTemplate().save(transientInstance);
   log.debug("save successful");
  } catch (RuntimeException re) {
   log.error("save failed", re);
   throw re;
 }
...
} 

2. 修改配置文件給原來的 UsersDAO 加入代理類來進行事務管理:

						<?
						xml
						version
						="1.0"
						encoding
						="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"><beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><propertyname="configLocation"value="file:src/hibernate.cfg.xml"></property></bean><!-- UsersDAO implements IUsersDAO 接口 --><beanid="UsersDAO"class="dao.UsersDAO"><propertyname="sessionFactory"><refbean="sessionFactory"/></property></bean><!-- 以下兩個 Bean transactionManager 和 userDAOProxy 是新加入的內容, 用來配置事務 --><!-- 聲明一個 Hibernate 3 的 事務管理器供代理類自動管理事務用 --><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"><reflocal="sessionFactory"/></property></bean><!-- 這個代理類是最後對外公開的類, 否則因爲沒有進行事務操作,  保存時沒有提交 hibernate 的事務, 這將無法對數據庫進行改動, 也就是原來要調用 UsersDAO 的地方都要轉而調用這個代理對象 userDAOProxy; 具體的屬性配置在 target 參數那裏指定了這個對象對原來的 UsersDAO 對象進行代理; 也因爲要使用動態代理, 所以這裏必須給 UsersDAO 抽象一個接口 IUsersDAO, 只有通過它來作爲原來配置的 UsersDAO 的代理工作, 才能讓 Spring 在保存數據的時候自動打開 Hibernate 的 Transaction 並提交, 即屬性 transactionManager 配置的 HibernateTransactionManager --><beanid="userDAOProxy"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><propertyname="transactionManager"><refbean="transactionManager"/></property><propertyname="target"><reflocal="UsersDAO"/></property><propertyname="transactionAttributes"><props><!-- 這裏的方法簽名可以精確到方法, 先懶惰一下全配置上 --><propkey="*">PROPAGATION_REQUIRED</prop></props></property></bean></beans>

3. 修改調用代碼, 原來調用 UsersDAO 的地方都要轉而調用 userDAOProxy, 而且轉換後的目標要修改爲 IUsersDAO, 否則就會報 ClassCastException, 具體原因參考 Spring 的 AOP 實現部分的內容, 也可以用 cglib 來解決.
  原始代碼:
  UsersDAO dao = applicationContext.getBean("UsersDAO");
  dao.save(users);// 可能無法保存數據, 因爲沒有事務管理
  修改爲:
  IUsersDAO dao = applicationContext.getBean("userDAOProxy");
  dao.save(users);// 現在應該 OK 了, 因爲事務提交了

 

MyEclipse生成的Spring+Hibernate無法保存數據問題的解決方法2 - 用 CGLIB 來實現事務管理

劉長炯 2007-08-08

上一小節討論了用 JDK 的代理機制來實現事務管理的解決方案, 相比起來它有一個麻煩的地方就是必須需要生成一個 DAO 的接口才能工作. 那麼另一種比較簡單的解決方案就是用 CGBLIB, 可以不用編寫接口, 那麼下面是 Spring 參考文檔中的內容:
7.5.3. 基於JDK和CGLIB的代理
這個小節作爲說明性文檔,解釋了對於一個目標對象(需要被代理的對象),ProxyFactryBean是如何決定究竟創建一個基於JDK還是CGLIB的代理的。

注意
ProxyFactoryBean需要創建基於JDK還是CGLIB代理的具體行爲在版本1.2.x和2.0中有所不同。現在ProxyFactoryBean在關於自動檢測接口方面使用了與TransactionProxyFactoryBean相似的語義。

如果一個需要被代理的目標對象的類(後面將簡單地稱它爲目標類)沒有實現任何接口,那麼一個基於CGLIB的代理將被創建。這是最簡單的場景,因爲JDK代理是基於接口的,沒有接口意味着沒有使用JDK進行代理的可能。 在目標bean裏將被插入探測代碼,通過interceptorNames屬性給出了攔截器的列表。注意一個基於CGLIB的代理將被創建即使ProxyFactoryBean的proxyTargetClass屬性被設置爲false。 (很明顯這種情況下對這個屬性進行設置是沒有意義的,最好把它從bean的定義中移除,因爲雖然這只是個多餘的屬性,但在許多情況下會引起混淆。)

如果目標類實現了一個(或者更多)接口,那麼創建代理的類型將根據ProxyFactoryBean的配置來決定。

如果ProxyFactoryBean的proxyTargetClass屬性被設爲true,那麼一個基於CGLIB的代理將創建。這樣的規定是有意義的,遵循了最小驚訝法則(保證了設定的一致性)。 甚至當ProxyFactoryBean的proxyInterfaces屬性被設置爲一個或者多個全限定接口名,而proxyTargetClass屬性被設置爲true仍然將實際使用基於CGLIB的代理。

如果ProxyFactoryBean的proxyInterfaces屬性被設置爲一個或者多個全限定接口名,一個基於JDK的代理將被創建。被創建的代理將實現所有在proxyInterfaces屬性裏被說明的接口;如果目標類實現了全部在proxyInterfaces屬性裏說明的接口以及一些額外接口,返回的代理將只實現說明的接口而不會實現那些額外接口。

如果ProxyFactoryBean的proxyInterfaces屬性沒有被設置,但是目標類實現了一個(或者更多)接口,那麼ProxyFactoryBean將自動檢測到這個目標類已經實現了至少一個接口, 一個基於JDK的代理將被創建。被實際代理的接口將是目標類所實現的全部接口;實際上,這和在proxyInterfaces屬性中列出目標類實現的每個接口的情況是一樣的。然而,這將顯著地減少工作量以及輸入錯誤的可能性。

好了, 詳細闡述這個解決方案.

用 MyEclipse 的自動生成功能產生的 Spring + Hibernate 的 DAO 有時候會出現不能保存數據但是可以查詢數據的問題, 這是因爲默認生成的 Spring 配置文件裏面沒有包含對事務的操作, 也就是沒有 commit Hibernate transaction 的調用所以無法保存數據. 也就是正確的調用需要 beginTran, save, commit, 但是現在就少了 tran 的調用代碼部分. 因爲剛剛接觸 Spring 這個 "輕量級" 非侵入框架不久, 所以好多問題不是太熟悉, 最近收集了一些資料看了看總算解決了問題. 有問題不要緊, 只要能通過學習來解決它就可以了, 我個人並不很喜歡沒事去精通 XXX 框架, 而是喜歡做一些解決問題和查資料能力的鍛鍊, 有了後面所提的能力, 不管改天是不是出了個 Winter 框架, 也不會擔心落伍, 當然前提是基礎知識要牢固, 否則很容易看不懂.

解決方法是在配置文件裏"侵入性"(必須這樣做, 做額外的配置, 否則就無法正常工作, 所以是侵入性的)的加入事務配置後就可以正常的保存數據到 Derby, Oracle 等數據了:

1. 修改配置文件給原來的 UsersDAO 加入代理類來進行事務管理:

						<?
						xml
						version
						="1.0"
						encoding
						="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"><beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><propertyname="configLocation"value="file:src/hibernate.cfg.xml"></property></bean><!-- UsersDAO --><beanid="UsersDAO"class="dao.UsersDAO"><propertyname="sessionFactory"><refbean="sessionFactory"/></property></bean><!-- 以下兩個 Bean transactionManager 和 userDAOProxy 是新加入的內容, 用來配置事務 --><!-- 聲明一個 Hibernate 3 的 事務管理器供代理類自動管理事務用 --><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"><reflocal="sessionFactory"/></property></bean><!-- 這個代理類是最後對外公開的類, 否則因爲沒有進行事務操作,  保存時沒有提交 hibernate 的事務, 這將無法對數據庫進行改動, 也就是原來要調用 UsersDAO 的地方都要轉而調用這個代理對象 userDAOProxy; 具體的屬性配置在 target 參數那裏指定了這個對象對原來的 UsersDAO 對象進行代理; 也因爲要使用代理, 只有通過它來作爲原來配置的 UsersDAO 的代理工作, 才能讓 Spring 在保存數據的時候自動打開 Hibernate 的 Transaction 並提交, 即屬性 transactionManager 配置的 HibernateTransactionManager --><beanid="userDAOProxy"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><!-- 注意這個屬性, 詳細意義請參考文章開頭的參考資料, 必須爲 true 使用CGLIB纔不用強制編寫DAO接口 --><propertyname="proxyTargetClass"><value>true</value></property><propertyname="transactionManager"><refbean="transactionManager"/></property><propertyname="target"><reflocal="UsersDAO"/></property><propertyname="transactionAttributes"><props><!-- 這裏的方法簽名可以精確到方法, 先懶惰一下全配置上 --><propkey="*">PROPAGATION_REQUIRED</prop></props></property></bean></beans>

2. 修改調用代碼, 原來調用 UsersDAO 的地方都要轉而調用 userDAOProxy, 因爲用了 CGLIB, 所以類型轉換不會發生異常.
  原始代碼:
  UsersDAO dao = applicationContext.getBean("UsersDAO");
  dao.save(users);// 可能無法保存數據, 因爲沒有事務管理
  修改爲:
  UsersDAO dao = applicationContext.getBean("userDAOProxy");
  dao.save(users);// 現在應該 OK 了, 因爲事務提交了

 

Spring 整合 Strus 要點
[email protected]
2007-8-5

1. 項目需要有 Struts 包和 Spring 的 core, aop, web 三個包(注意不是 Spring 自己的 Web MVC), 具體的 .classpath 文件如下所示:

						<?
						xml
						version
						="1.0"
						encoding
						="UTF-8"?><classpath><classpathentrykind="src"path="src"/><classpathentrykind="con"path="org.eclipse.jdt.launching.JRE_CONTAINER"/><classpathentrykind="con"path="com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/antlr.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-beanutils.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-digester.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-fileupload.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-logging.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-validator.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/jakarta-oro.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/struts.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/mysql-connector-java-3.1.11-bin.jar"/><classpathentrykind="con"path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING20_CORE"/><classpathentrykind="con"path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING20_AOP"/><classpathentrykind="con"path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING20_WEB"/><classpathentrykind="output"path="WebRoot/WEB-INF/classes"/></classpath>

2. 對 Struts 配置文件做修改加入 Spring 託管功能.

創建 Spring 配置文件,將文件放到src 目錄下,文件名稱爲 applicationContext.xml, 編譯後放到 WEB-INF/classes/ 下.

配置struts-config.xml文件,添加 spring的插件, 位置在 struts-config 文件的最末尾.

						<
						plug-in
						className
						="org.springframework.web.struts.ContextLoaderPlugIn"
						>
						<
						set-property
						property
						="contextConfigLocation"
						value
						="/WEB-INF/classes/applicationContext.xml"
						/>
						</
						plug-in
						>
				

3. 修改 Struts 的 struts-config.xml 中的Action配置

原:

						<
						action
						attribute
						="loginForm"
						input
						="/login.jsp"
						name
						="loginForm"
						path
						="/login"
						scope
						="request"
						validate
						="true"
						type
						="com.test.struts.action.LoginAction"
						/>
				

改爲:

						<
						action
						attribute
						="loginForm"
						input
						="/login.jsp"
						name
						="loginForm"
						path
						="/login"
						scope
						="request"
						validate
						="true"
						type
						="org.springframework.web.struts.DelegatingActionProxy"
						/>
				

type 部份爲修改內容, 這裏將使用spring的代理器來對Action進行控制.
當提交到/login.do是將控制權交給了spring,然後由spring來把它轉回到struts的Action.

4. 配置spring 來實例化上一步中被刪除的 Action 類.

						<?
						xml
						version
						="1.0"
						encoding
						="UTF-8"?><!DOCTYPEbeansPUBLIC"-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd"><beans><beanname="/login"class="com.test.struts.action.LoginAction"></bean></beans>

Spring 通過 org.springframework.web.struts.DelegatingActionProxy 這個類, 然後根據 Struts 配置文件中的 <action path="/login" ..> 和 Spring 配置文件中的 <bean name="/login" ..> 來將 Spring 管理下的 Struts Action 類和提交的路徑匹配起來, 這些就是關於轉交控制權的配置內容.

實踐的過程中發現必須把 singleton="false"去掉纔行, 否則就會無法初始化 Spring 框架, 不知道具體的原因是什麼.

既然這個 Struts 的 Action 已經通過 Spring 來初始化, 所以就可以加入依賴注入, 整合 Hibernate 的功能了. 例如典型的情況:

com.test.struts.action.LoginAction 

private UserManager userManager; 

public UserManager getUserManager()...
publicvoid setUserManager(UserManager userMgmr) ... 

public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    System.out.println("userManager=" + getUserManager());
    getUserManager().someBusinessMethods();
    .....
}

然後就可以配置:

						<
						bean
						name
						="/login"
						class
						="com.test.struts.action.LoginAction"
						>
						<
						property
						name
						="userManager"
						>
						<
						ref
						bean
						="userManagerBean"
						/>
						</
						property
						>
						</
						bean
						>
						<
						bean
						id
						="userManagerBean"
						class
						="manager.UserManager"
						/>
				

同理 Spring 整合 Hibernate 和沒 Struts 的時候一樣, 也可以在這個文件中進行配置即可.

4. 最後一步, 測試, 只要能打印出來 userManager 不爲空, 就說明整合成功了. 如果出現 404 action servlet 不可用的錯誤, 一般都是 Spring 配置文件出錯導致的.

參考視頻: 小電影: 用 MyEclipse 開發 Spring + Struts 的總結與操作視頻(7分鐘)

 

重量級框架: Java EE 5 開發

MyEclipse + JPA + Toplink 開發視頻: 開發並運行第一個 JPA 項目

MyEclipse + JBoss 開發視頻: 配置,開發並運行第一個 EJB 3 項目

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章