WAS6.1 +HIBERNATE+SPRING +MYECLIPSE5.1.1 整合

概述

Hibernate 是傳統的 Java 對象 (POJO) 的開放源代碼持久性框架,它通過 XML 配置文件提供 POJO 到關系數據庫表的與對象相關的映射。 Hibernate 框架是應用程序調用的、用于數據持久性的數據訪問抽象層。此外, Hibernate 還提供了從 Java 類到數據庫表(以及從 Java 數據類型到 SQL 數據類型)的映射以及數據查詢和檢索功能。 Hibernate 生成必需的 SQL 調用,還負責結果集處理和對象轉換。

Hibernate Gavin King Hibernate 項目的奠基人)領導的軟件開發團隊開發,目的是解決 EJB 2.x 實體 EJB 中存在的諸多缺陷。 Hibernate JBoss Group 緊密關聯,這是由于 JBoss 雇傭了大量的一流 Hibernate 開發人員的結果。最近,在 Java Community Process (JCP) 中的持久性框架的發展中已涉及 Hibernate ,并且 Hibernate 的許多概念已合并到 Java Persistence API (JPA) 規范中。最新版本的 Hibernate 將發展為符合 JPA 規范。

?? 即使擁有良好的工具和優秀技術,應用軟件開發也是困難重重。應用開發往往牽扯到方方面面,每件事情都難以控制,而且,開發周期也很難把握(除非它的確是一個重量級的復雜應用,倒也有情可原)。 Spring 提供了一種輕量級的解決方案,用于建立“快裝式企業應用”。在此基礎上, Spring 還提供了包括聲明式事務管理, RMI Web Services 遠程訪問業務邏輯,以及可以多種方法進行的持久化數據庫地解決方案。另外, Spring 還有一個全功能的 MVC 框架,并能透明的把 AOP 集成到你的軟件中去。你可以把 Spring 當作一個潛在的一站式企業應用。或者,把 Spring 看作一個標準開發組件,根據自己的需要,只取用它的部分組件使用而無需涉及其他。例如,你可以利用控制反轉容器在前臺的展現層使用 Struts ,還可以只使用 Hibernate 集成編碼 或是 JDBC 抽象層 去處理數據存儲。 Spring 被設計成(并將繼續保持)無侵入性的方式,意味著應用幾乎不需要對框架進行依賴(或根據實際使用的范圍,將依賴做到最小)。

?????? 目前 12580 系統正是基于 Spring Hibernate 兩個開放源代碼項目集成而成的開發框架,采用的 J2EE 規范包括了 EJB Servlet Jsp MVC 等,運行的應用服務器是 BEA Weblogic81 。隨著 12580 信息資訊互動中心業務應用的不斷發展,業務不斷累加,在這種情況下,采用原有的開發框架( Jsp+Servlet+Hibernate+EJB )完成新業務的開發,導致了整個系統的代碼不斷累加,維護性、運行效率都非常的差,而且對于新來的員工想快速利用原有的開發框架上手非常的難,客戶對系統的性能以及業務快速開發要求越來越高,因此 , 為了解決這個問題,利用了開源社區比較成熟的技術對原有的開發框架進行了無縫移植,即將原有的開發技術框架( Jsp+Servlet+Hibernate+EJB )移植到 Jsp+Servlet+Spring Spring+WebWork2 上,開發環境由原來的 WSAD 移植到基于 Eclipse SDK J2EE 開發工具 Myeclipse 。主要是為了減少工作量,減少企業應用對應用服務器的依賴,易于移植到不同的平臺中,同時新業務的開發采用新的技術框架,極大的提高了開發進度,為 12580 系統快速推出新業務占領信息市場提供了技術保障。

?

?

環境要求

1.? Application Server IBM WebSphere Application Server V6.1Base_Windows32bit

2.? JDK \IBM\WebSphere6.1\AppServer\java

3.? IDE Eclipse3.2.2+MyEclipse5.1.1

4.? Spring spring-framework-2.0.3

5.? Hibernate hibernate-3.2.2.ga

6.? CVS CVS for NT (CVSNT) 2.0

7.? DB oracle92

可到 \\10.243.194.69\Temp\ 系統移植所需軟件下載以上軟件。

WAS V6.1 安裝以及基本配置

安裝

安裝過程比較簡單,按照安裝提示一路操作即可,在此不一一介紹,需要提醒的是要記得安裝過程中所設置的用戶名、密碼,該帳號信息是 WAS 管理控制臺的登錄帳號。

基本配置

下面以圖文并茂的方式簡單介紹 WAS 的基本配置,包括常用的環境變量、共享庫、 JDBC 提供程序、數據源的配置等。

啟動服務器

啟動 WAS ,如下圖:

選擇啟動服務器,看到以下內容,表示服務器啟動正常,如下圖:

進入管理控制臺

WAS 的管理控制臺端口是 9060 ,具體 URL http://localhost:9060/ibm/console ,也可以通過以下方式登錄。

選擇管理控制臺即可,在打開的 IE 窗口輸入管理員帳號、密碼,進入管理控制頁面,如下圖:

配置環境

環境配置主要是配置企業應用系統所用到的依賴 jar 包、路徑變量等。常用到的配置有 WebSphere 變量、共享庫。

1.? WebSphere 變量

使用此頁面來定義替換變量。這些變量指定某些系統定義的值(例如,文件系統根目錄)的間接程度。變量有作用域級別,即服務器、節點、集群或單元。某個作用域的值可與其他級別的值不同。當變量具有沖突的作用域值時,粒度較細的值會覆蓋作用域級別高一些的值。因此,服務器變量覆蓋節點變量,節點變量覆蓋集群變量,集群變量覆蓋單元變量。具體操作選擇左邊菜單:環境-》 WebSphere 變量,如下圖:

選擇新建操作,切換到配置頁面,輸入名稱、值,如下圖:

確定之后,系統返回提示是否保存,選擇保存,如下圖:

保存后則配置的變量生效,可以在其他配置中使用定義好的變量名稱代替具體的文件路徑。

按同樣的方法設置其他需要用到企業應用程序依賴 JAR 的本地文件路徑變量配置。如下圖:

2.? 共享庫配置

使用此頁面來定義可由已部署應用程序使用的容器范圍內共享庫。具體操作選擇左邊菜單:環境-》共享庫,如下圖:

選擇新建操作,切換到共享庫配置頁面,輸入名稱、類路徑或本機路徑,其中設置類路徑的話使用到前面定義的路徑變量,如果設置本機路徑,則可以具體指定本地文件系統所在目錄的 jar 文件。輸入完畢點確定即可。如下圖:

系統提示是否保存,如下圖:

保存后,返回共享庫配置列表,配置好的共享庫,可以在以后的應用系統部署中使用到。如下圖:

JDBC 配置

該配置主要是配置企業應用系統所引用到 JNDI 數據源配置。常用到的配置有 JDBC 提供程序、數據源。

1.? JDBC 提供程序

使用此頁面來編輯 JDBC 提供程序的屬性。 JDBC 提供程序對象包括特定的 JDBC 驅動程序實現類,以便訪問環境中的特定供應商數據庫。具體操作:選擇左邊菜單-》 JDBC -》 JDBC 提供程序,如下圖:

選擇新建操作,系統切換到配置頁面,輸入名稱、類路徑或本機庫路徑、實現類名,以新建 ORACLE 提供 JDBC 程序為例,名稱為: Oracle JDBC Driver 、類路徑為: ${oracle_jdbc_driver_path}/ojdbc14.jar 或本機路徑為: C:\oracle\ora92\jdbc\lib\ojdbc14.jar 、實現類名為: oracle.jdbc.pool.OracleConnectionPoolDataSource ,其中 ${oracle_jdbc_driver_path} 為前面設置的 websphere 變量名稱,如下圖:

點確定,系統提示保存頁面,如下圖:

點保存后,系統返回 JDBC 提供程序列表,如下圖:

2.? 數據源配置

使用此頁面來編輯與所選 JDBC 提供程序相關聯的數據源設置。數據源對象為應用程序提供用于訪問數據庫的連接。具體操作:選擇左邊菜單-》資源-》 JDBC -》數據源,如下圖:

選擇新建,系統切換到數據源配置頁面。

第一步:輸入數據源名稱: oracle74 JNDI 名稱: jdbc/oracle74 ,點下一步,如下圖:

第二步:選擇 JDBC 提供程序:選擇現有的 JDBC 提供程序,從下拉列表中選擇 Oracle JDBC Driver ,點下一步,如下圖:

第三步:輸入數據源的特定于數據庫的屬性: URL 輸入: jdbc:oracle:thin:@10.243.194.73:1521:trustel ,點下一步,如下圖:

第四步:總結以上配置信息,點完成,如下圖:

點完成按鈕后,系統提示是否需要保存,如下圖:

點保存后,系統返回數據源列表,如下圖:

最后一步:定制數據源屬性,這部分比較關鍵,是初學者比較困惑的地方。我們看到,界面上并沒有輸入用戶名、口令的地方,而沒有用戶名稱、口令是無法連接數據庫的,為了成功連接數據庫,需要我們手工定制數據源的屬性。具體操作如下:

在數據源列表中,點擊選擇對應的數據源配置信息,系統切換到該配置源信息的頁面,如下圖:

點定制屬性,系統切換到屬性定制列表頁面,具體操作主要分幾步:

1.? 選擇 driverType ,值輸入 oracle.jdbc.driver.OracleDriver 如下圖:

確定后保存即可。

2.? 同樣得方法設置 databasename 的值 trustel servername 的值 10.243.194.74

3.? 其他值采用默認值。

4.? 設置 user ,點新建按鈕,系統切換到常規屬性定制頁面,名稱輸入 user ,值輸入 gmccadmin ,如下圖:

點確定之后保存。

5.? 同樣得方法設置 password 屬性。設置完畢之后,我們看到,“定制屬性”中多了兩個我們自定義的屬性 user password

返回數據源設置頁面,點測試連接,提示連接成功,如下圖:

?

WAS V61 中部署基于 Spring 的企業 /WEB 應用

Spring 與底層 J2EE 應用服務器還是存在一些需要結合的地方,這里通過圖文并茂的方式給出 WAS 中的一些結合點,包括如何使用 WAS 的數據源、 JTA 事務管理、加載 Spring jar 包、部署基于 Spring web 應用。

使用 WAS 數據源

Java 應用程序中,數據庫的連接一般有兩種方式來得到。一種是通過 java.sql.DriverManager 的方式來得到數據庫連接。這種方式 不依賴于應用服務的支持,但是也不提供數據庫連接池的功能。另外一種方式是通過 javax.sql.DataSource 的方式來得到數據庫連接。在傳統 基于 J2EE 的應用需要通過 JNDI 來得到數據源( javax.sql.DataSource )對象,然后再通過數據源來得到相應的數據庫連接。常見的應 用服務器都支持這種方式,且一般都提供了數據庫連接池的支持。雖然說我們一般推薦使用數據庫連接池,但是也有一些時候我們需要脫離開應用服務器的環境使用 數據庫(比如單元測試,比如應用移植等)。然而應用程序使用這兩種方式的時候代碼是不一樣的,因此只能通過代碼來應變。 Spring 提供了一個統一使用數 據源的解決方案,然后通過控制反轉的機制用外部配置文件來指定使用的數據源。這樣一方面可以統一這兩種得到數據庫連接的方式,另一方面也不需要像通常的 J2EE 應用通過繁瑣的 JNDI 代碼來得到數據源。這樣應用程序也就不需要知道使用的何種數據源。

 ( 1 Spring 提供了一個 DriverManagerDataSource 類來統一第一種方式的數據源獲取。如果使用 WAS 中的 Cloudscape 數據庫,用外部配置文件可配置如下:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName">

<value>oracle.jdbc.driver.OracleDriver</value>

</property>

<property name="url">

<value>jdbc:oracle:thin:@10.243.194.73:1521:trustel </value>

</property>

</bean>

?  ( 2 Spring 提供了 JndiObjectFactoryBean 類來支持第二種方式的數據源獲取。對于部署在 WAS 上的 Web 應用,在生產環境中推薦使用 WAS 實現的數據庫連接池。一方面是因為連接池實現地比較完善。另一方面,使用 WAS 提供的 數據庫連接池可以很完善地支持 JTA 事務。在 12580 系統中,我們推薦使用這種方式連接數據源,如果使用環境發生變化,那么只需要修改 Spring 的配置文件即可。假設 WAS 中已經配置好的數據源名稱為 jdbc /oracle ,那么我們如何連接到 WAS 定義好的數據源呢?由于 Spring 無法直接從 JndiObjectFactoryBean 類獲取到 WAS 配置的數據源,我們只能先通過 WEB 應用利用目標資源 JNDI 名稱引用 WAS 的數據源,然后 Spring 再通過 WEB 應用獲取到 WAS 的數據源,從而實現了數據源的獲取。具體配置片斷如下:

web 應用的 web.xml 中配置如下:

?????? <resource-ref>

????????????? <res-ref-name>jdbc/oracle</res-ref-name>

????????????? <res-type>javax.sql.DataSource</res-type>

????????????? <res-auth>Container</res-auth>

?????? </resource-ref>

?????? spring 的配置文件 applicationContext.xml 中配置如下:

??? < bean id = "dataSource"

?????? class = "org.springframework.jndi.JndiObjectFactoryBean" >

?????? < property name = "jndiName" value = "java:comp/env/jdbc/oracle" />

?????? < property name = "lookupOnStartup" value = "false" />

?????? < property name = "cache" value = "true" />

?????? < property name = "proxyInterface" value = "javax.sql.DataSource" />

??? </ bean >

使用 WAS JTA

   Web 應用程序在使用事務的時候常常會涉 及一個事務類型的選擇。是選擇像 JDBC 事務這樣的本地事務呢還是使用 JTA 支持的全局事務。這個與應用程序需要涉及到的事務管理器類型和個數密切相關。 Spring 本身不支持分布式事務,因此分布式事務需要底層的 JTA 。但是 Spring 提供了事務的抽象,即底層真正事務實現可以切換而不影響應用程序代 碼。這樣應用程序可以依賴于底層 WAS ,也可以輕易地脫離開應用服務器的環境。這一點與前面數據源的抽象非常類似。因此在 12580 系統中也建議使用 WAS JTA 事務管理。

   WAS 本身對于事務劃分有兩種支持方式,一種是聲明式的,當然這種管理方式需要 EJB 容器的支持,即所謂的容器管理事務( CMT )。另外一種方式是編程式的,通過程序代碼 來直接使用 JTA 編程接口。 Spring 對于事務的劃分也可以分為聲明式和編程式兩種方式。對于 Spring 編程式的事務劃分方式,總體上可以分為兩大類。一類是通過直接使用實現 PlatformTransactionManager 接口的類。另一類是通過使用 TransactionTemplate 模板類,模板類的使用可以簡化事務控制代碼。 Spring 對于聲明式事務劃分的支持實際上是利用了它的 AOP 機制。相對于編程式事務劃分,這種基于 AOP 的方式比較靈活,而且對代碼的侵入性幾乎為零。因此,如果沒有特殊需要推薦使用這種事務劃分方式。基于 AOP 的常用事務劃分方式可以使用 ProxyFactoryBean TransactionInterceptor 方式,或者使用 TransactionPorxyFactoryBean 的方式。前一種方式相對比較靈活,而后一種則對使用相對比較簡單。

  無論是哪一種事務劃分方式,底層都需要一個事務管理機制作為支撐。如果是單一的事務資源管理器,那么根據所使用的后臺事務管理資源不同的類型,可以選擇的 PlatformTransactionManager 實現有 DataSourceTransactionManager HibernateTransactionManager JdoTransactionManager PersistenceBrokerTransactionManager ,和 JmsTransactionManager 等。無論是單個還是多個事務資源管理器,都可以使用 JtaTransactionManager 類。如果使用 JtaTransactionManager ,那么所有事務管理實際都會委 托給底層應用服務器的 JTA 實現。

   使用 WAS JTA 支持,我們需要在 Spring 的配置文件 applicationContext.xml 配置如下:

<bean id="wasTxMgr"class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean" />

<bean id="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager><property name="transactionManager"><ref local="wasTxMgr" /></property></bean>

   通過采用 Spring 的事務支持,底層事務采用何種方式的決定就不必在一開始開發就做出決定。因為我們能夠通過 Spring 的外部配置文件來進行切換真 正的事務支持。不過,雖然也有第三方的 JTA 支持,但是 WAS 能夠提供非常穩定的 XA 支持,因此推薦使用 WAS JTA ,尤其是當應用涉及到分布事務處理 的時候。這樣無論應用涉及幾個事務資源都可以統一解決。

如何加載 Spring JAR

Spring 架的核心 JAR 包是 spring.jar ,但是根據實際使用情況需要一些擴展 JAR 包和依賴 JAR 包。那在 WAS 中如何處理這些 JAR 包文件呢?在 Web 應用中一個簡單而直接的處理方式放是把這些使用到的 JAR 文件都拷貝到對應的 WEB-INF/lib 目錄下面。這種方法雖然簡單,但是當有多個 Spring 應用程序的時候這種處理方式就需要在每個應用的 WEB-INF/lib 目錄下都拷貝一份相同的 JAR 文件。這里可以通過共享庫的方式來統一解 決類庫共享這個問題。

  共享庫就是 WAS 專門用來解決不同應用程序之間共享 JAR 或本地庫文件的一種機制。共享庫由一個名字、一個 JAVA 類路徑和 / 或一個裝載 JNI 庫本地庫路徑組成。它可以分別在單元,節點和服務器級別定義。但是共享庫定義了并不意味著它會被裝載,只有當這個共享 庫與某個應用程序或應用服務器關聯之后,它才會被加載。如果一個共享庫與一個應用程序關聯,那么這個共享庫由應用程序類加載器加載。如果一個共享庫與應用 服務器關聯,那么這個共享庫就需要一個專門定義的類加載器來加載。這個類加載器需要用戶自己定義。其操作如下:選應用服務器比如 server1' 類加載器 ' 新建一個類加載器 ' 加載器與共享庫關聯。

  在創建這個類加載器之前一般都需要預先定義好共享庫。 根據上面的介紹可知,通過共享庫解決 Spring 應用的 JAR 包共享問題,主要就是兩個步驟。一是,把 Spring 應用中需要共享的 JAR 包定義成為一個 共享庫。二是,選定相應的 WAS 服務器實例,把它與上面創建的共享庫關聯起來。這樣此 WAS 服務器實例上的所有應用都能夠使用共享庫中定義的 JAR 包。使 用共享庫這種方式的時候要注意理解類的裝載次序和方式。如果是這種與 WAS 服務器實例關聯的共享庫 JAR 包,其類加載器在層次結構上在應用程序類加載器上 面,即是它的父加載器。

如何在 WAS 部署基于 Spring WEB 應用

要在 WAS 部署基于 Spring Web 應用,必須嚴格按照以上的配置來進行,配置完畢之后,必須將 Web 應用依賴到的 Jar 包加載到 WAS 的服務器中,加載 Jar 包的方式有兩種,一種是通過共享庫的方式來加載,一種則是直接將 Web 應用所依賴的 jar 包拷貝到 C:\IBM\WebSphere6.1\AppServer\lib\ext 目錄下,同時導出 WAR 文件。啟動 WAS ,打開管理控制臺,如下圖:

左邊菜單選擇應用程序-》安裝新的應用程序,在右邊的工作區頁面中選擇導出的 WAR 文件,輸入上下文根,如下圖:

點下一步,采用默認設置,一直到步驟 3 將資源引用映射至資源時,需要輸入 web 應用引用到的 WAS 的資源,如下圖:

點下一步采用默認設置,最后點完成, WAS 開始加載 Web 應用,如果加載成功,在提示如下頁面:

?

點保存后,通過左邊菜單應用程序-》應用程序查看已安裝的 Web 應用,發現是一個小紅×,這表示尚未啟動該 web 應用,如下圖:

勾上該 Web 應用,啟動它, WAS 最后提示啟動成功,如下圖:

查看后臺日志,發現該 web 應用中 Spring ContextLoader 初始化 WebApplicationContext 成功,同時加載了 applicationContext.xml 配置的所有 bean 資源、 O/R 映射、數據源連接等,啟動成功的日志片斷如下:

看到日志無日常,則表示 web 啟動成功,可以通過網頁訪問 web 應用,如下圖:

MyEclipse5 下配置 WAS V6.1

MyEclipse 為我們提供了在超過 20 幾種的不同應用服務器上無縫部署、執行、測試 MyEclipse J2EE 應用的便利,然而,在 MyEclipse 上正確配置 WebSphere 6.1 應用服務器需要比配置其他應用服務器花費更多的時間,本文檔以圖文并茂的方式一步一步教你配置一個基于 MyEclipse WebSphere 服務器實例,同時將你開發的 web 應用通過 MyEclipse 快速的部署到 WAS 中。

通過 MyEclipse 的應用服務器連接器參數配置,你在 MyEclipse 直接控制本地的 J2EE 服務器實例,因此,對于 WASV6.1 來說,你需要重新建一個基于 MyEclipse 的應用服務器實例,具體操作如下。

新建 WAS 服務器實例

第一步:打開概要管理工具,如下圖:

?

概要文件管理工具啟動后,點下一步,選擇高級概要文件創建,如下圖:

點下一步,采用默認設置直到系統提示輸入概要文件名、概要文件目錄,輸入你喜歡的概要文件名、概要文件目錄,構選使用開發模板創建服務器,如下圖:

點下一步,輸入你喜歡的節點名稱,主機名一般不建議修改。如下圖:

點下一步,輸入你喜歡的管理控制臺帳號、密碼,如下圖:

點下一步,修改 WAS 的端口值,一般默認即可,如下圖:

采用建議的端口值之后,點下一步,記住哦,千萬不要作為 window 服務運行,省得無謂耗用自己電腦資源,如下圖:

點一下步,一般不需要創建 web 服務器創建,沒那個必要嘛,如下圖:

點下一步,最后點創建 WAS 服務器用例,等待成功中。

終于看到成功界面了,點完成即可。

修改 WAS 配置

該部分詳細描述了如何配置一個 WAS 開發實例使之能在 MyEclipse 中運行、部署、監控日志等。

第一步:要想見到控制臺,當然要先啟動服務器。如下圖:

第二步:打開管理控制臺,用管理員帳號登錄,如下圖:

第三步:登錄成功后,需要對 server1 進行配置。具體操作如下,左邊菜單-》服務器-》應用服務器,如下圖:

第四步:現在為了保證 WAS 的輸入日志、錯誤提示能在 MyEclipse 中顯示,則需要對 server1 進行修改配置。如下圖:

點記錄和跟蹤-》 JVM 日志,如下圖:

將應用程序服務器 > server1 > 記錄和跟蹤 > JVM 日志中的 System.out 以及 System.err 文件名修改為 console ,如下圖:

點確定之后,保存即可,注銷退出,停掉 WAS 服務器。

MyEclipse 中配置 WAS

在配置 MyEclipse 之前,你需要確定新建 WAS 服務器實例之后的節點名稱、單元名稱,可以查看 WAS 目錄如下:

其中節點名為: gd12580 ,單元名稱為 lidNode03Cell ,在 myeclipse 中需要正確配置對應的名稱。具體配置如下:

第一步:啟動 myeclipse ,在 MyEclipse 運行 WAS 需要配置 IBM JDK 。找到 Window > Preferences >Java>Installed JREs ,如下圖:

add ,輸入 JRE name 、指向本地 websphere java home ,確定即可,如下圖:

第二步:找到 WebSphere 6.1 的連接器設置,在 Window > Preferences > MyEclipse > Application Servers > WebSphere 6.1 中, ? Once you have navigated to the WebSphere 6.1 preference window, first be sure to Enable the application server, then fill in the WebSphere installation location.? Most of the remaining fields will be defaulted for you. All of the fields should be straight forward, the only two that might be a little tricky are the Node Name and Server Name fields that are shown below. The Node Name field is the value you used during the Profile creation wizard, in our example it was gd12580 and the Cell Name is the directory name you had to lookup in the step above. When you are done, click the JDK node under the WebSphere 6.1 node on the left. Here we will configure the IBM JDK that MyEclipse will use to launch WebSphere. 不翻譯了,不懂的請拿金山詞霸出來照吧,如下圖:

配置成功之后的 was 服務器可以在 myeclipse 中看到,啟動,出現一下信息,則恭喜你,成功咯!如下圖:

MyEclipse 中部署 EAR/WAR

該部分主要描述在 MyEclipse 中部署 EAR WAR ,包括快速部署、熱部署等,具體細節在此不一一描述,有興趣的請參考 MyEclipse 的幫助。