基于Struts+Spring+Hibernate的使用和部署
課題說明: 就現在WEB開發而言,J2EE企業級開發技術比較成熟,開發模式模式也比較繁多,較流行開發模式MVC更是普遍,而基于MVC模式開發的框架也是種類繁多,現在使用最多的可能就是SSH這三種框架,所以展開對這三個框架的糅合使用和淺顯的研究探討。還有由于過去常用的是TomCat的部署和使用,下來學習WebLogic的部署,比較其相同點和不同點。
研究內容: 主要是研究討論SSH這三種開源框架的糅合使用到底是怎樣實現方法和策略,及各自的優缺點,對以后Domino技術和J2EE技術結合奠定基礎及WebLogic的部署和TomCat的比較。
需要注意:
第一:環境的配置,因為SSH使用到的是三種基于java語言實現的開源框架,所以基本要先把JRE配置好即安裝JDK(6.0).
第二:配置好Struts ,Spring ,Hibernate這三個開源框架的開發環境配置。鑒于簡單起見可以使用MyEclipse6.0 的IDE這樣三種開源框架的配置文件IDE已經集成好,直接添加就可以是要用。
第三:開發使用的部署工具是Tomcat,可以嘗試使用WebLogic,然后對其比較。
成果方式:
一:Struts的基礎介紹。
1: 介紹Struts
Struts是目前WEB開發中比較流行的一種開源框架,它主要是采用Servlet和JSP技術實現Model2(Servlet+JSP+JavaBean)類型MVC的設計模式,即是實現 模型-視圖-控制三部分模塊的分離。
2:Struts與MVC的比較
|
Struts
|
MVC
|
M
|
JavaBean(業務數據),
Service Class(業務邏輯)
|
M模型
|
V
|
JSP(動態網頁)
ActionForm(表單數據操作)
|
V視圖
|
C
|
ActionServlet(接受頁面請求),
Action(處理請求;控制流程),
struts-config.xml(配置參數)
|
C控制部分
|
3:Struts的基本工作流程
基本流程:
(1):WEB啟動,初始化ActionServlet,讀取struts-config.xml的配置信息,作準備。
(2):用戶發出一個請求,ActionServlet接受,根據ActionMapping查找相應的Action。
(3):Action調用JavaBean,并且結合ActionForm,處理數據。
(4):處理完成后,返回ActionForward,指定轉向的地方。
二:Spring基礎介紹
1: 介紹Spring
Spring框架也是一個開源框架,它的核心概念是依賴注入(Dependency Injection),通過依賴注入機制,可以再運行期間將組件之間的依賴關系由Spring容器注入組件,同時spring框架還提供AOP開發以及事務管理的組件,以及對WEB層和持久層的支持,從而可以很好配合Struts和Hibernate框架。
2:Spring框架的組建構成
Spring框架大體由七個模塊構成:
A: Core模塊。該模塊是其他模塊的功能基礎,在這個模塊中存在BeanFactory類,它是Spring框架的核心,它實現依賴注入,是系統中的各組件的一倆關系從代碼中獨立出來,通過配置文件來實現;BeanFactory也是Spring框架的核心容器,因為他管理容器中對象的生命周期。
B: Context模塊。這個模塊是通過配置文件將各個組件組合在一起,使spring成為框架。其中ApplicationContext類擴展繼承BeanFactory的功能,因此它也可以成為Spring容器。此外該模塊還提供其他的服務。
C: DAO模塊。這個模塊把JDBC代碼中的一些內容抽象出來,簡化JDBC編碼。
D: ORM模塊。這個模塊提供對ORM框架的支持,從而可以擴展Spring框架支持ORM框架。
E: AOP模塊。這個模塊提供AOP(面向切面編程)的功能,通過這個模塊可以將通用功能插入到業務邏輯中。
F:WEB模塊。此模塊提供WEB應用所需要的上下文,可以與Struts等框架相結合。
G:WEBmvc模塊,它提供面向WEB應用的MVC模式,模塊利用依賴注入將控制部分和業務邏輯清晰分離。
3:理解依賴注入和方式
依賴注入也就是控制反轉(IoC),把組件之間的依賴關系通過Spring容器來管理和注入。
組件之間的依賴關系通過配置文件來定義,或者說通過注入來實現的。
A:配置WebApplicationContext
兩種方式:
(1):在web.xml文件中配置WebApplicationContext ,就可以在WEB容器自動加載applicationContext.xml文件,具體的配置方法有兩種:
a:利用Servlet接口來實現
具體代碼:
<context-param>
<param-name>contextConfigLocation</param-value>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
b:利用Listeners接口來實現
具體代碼:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listerer>
<context-param>
<param-name>contextConfigLocation</param-value>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
(2):Struts中實現Spring的插件集成
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-propert property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml"/>
</plug-in>
B:Spring的Bean
Bean的定義:
1:Bean的參數配置
id 是bean的代號標示
class是Bean的對應的類URL
singleton設置是否為單態
2:Bean屬性的配置
三種類型的Bean屬性配置:一般用<property>屬性來嵌入Bean的引用屬性
a:基本數據類型 —— 通過<value>元素來表示
b:其他Bean的引用 —— 通過<ref>元素來表示
c:對集合的引用 —— 通過<list><set><map>
3:依賴注入的兩種方式
a:設置注入。
主要是在Bean中通過get()和set()方法獲得相應的屬性,在配置文件中通過<property>元素來實現。
B:構造函數注入。
主要是在Bean中通過Bean的構造方法初始化相應的屬性,在配置文件中通過<constructor-arg>元素來實現。
C:實例化Bean
1:BeanFactory的實例化
BeanFactory采用工廠模式實例化和分發Bean。BeanFactory接口路徑為:org.springframework.beans.factory.BeanFactory. 該接口定義4個方法:
Boolean containsBean(String) 判斷給定的bean是否存在。
Object getBean(String)返回給定名字的Bean實例。
Object getBean(String,Class)返回給定名字的Bean,并把該Bean強制轉化為給定的Class類型。
Boolean isSingleton(String) 判斷給定的名字Bean是否為單態。
BeanFactory接口有多實現,其中常用的是org.springframework.beans.factory.XmlBeanFactory.
使用方式:InputStream is=new FileInputStream(“applicationContext.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
sampleSpringBean sample=( sampleSpringBean) factory.getBean(“sampleSpringBean”);
2:ApplicationContext的實例化
BeanFactory適應于較為簡單的應用系統,對于復雜的應用系統應該使用ApplicationContext容器,它覆蓋BeanFactory的所有功能,而且提供更多的其他方法。
ApplicationContext接口位于包org.springframework.context.ApplicationContext中,他繼承BeanFactory接口,它的實現有多個,常用的有3個:
ClassPathXmlApplicationContext:利用類路徑裝載bean配置文件信息。
FileSystemXmlApplicationContext:利用文件系統裝載bean配置文件的信息。
XmlWebApplicationContext:從Web裝載bean配置文件的信息。
加載ApplicationContext容器:
可以通過兩種方式:
1:編碼的方式——就是配置WebApplicationContext是講到的。
2:硬編碼的方式。
ApplicationContext context = new FileSystemXmlApplicationContext(“applicationContext.xml”)
ApplicationContext實例化bean的使用方法 :
ApplicationContext context= new FileSystemXmlApplicationContext(“applicationContext.xml”);
sampleSpringBean sample=( sampleSpringBean) context.getBean(“sampleSpringBean”);
三:Struts和Spring的集成
Struts框架出現早,對MVC的設計技術比Spring成熟,但是Spring框架的依賴注入和AOP(面向切面),以及聲明事務管理方面優勢顯著,所以可以再業務邏輯方面使用它。
Struts和Spring的集成實現方式也是比較多的,大體有三種方案:
A:使用Spring的ActionSupport類集成Struts
采用這種方式進行集成的方案是: 修改Struts中的Action,使Struts的Action繼承Spring的ActionSupport類,這樣Action中定義的業務邏輯對象就可以通過getBean()方法從Spring的配置文件中獲得,從而達到目的。 但是這也有缺點,就是Struts的Action和Spring緊密的耦合在一起。
B:使用Spring的Action代理集成Struts
采用這種方式進行集成的方案是: 需要建立一個Spring的Action代理,代理Struts的Action,當Struts執行Action時候就會執行這個代理。代理會在Spring的配置文件中找到真正的StrutsAction,然后交友這個Action去處理,當然首先要在spring的配置文件中跑那個配置這個Action。 這種集成只需要修改Action的type屬性為 org.springframework.web.struts.DelegationActionProxy.并且Spring的Action配置中的name屬性和Struts中Action配置path相同。 缺點是不容易找到是哪個Action處理的。
C:修改struts控制器來集成Struts
采用這種方式進行集成的方案是: 為拉直觀的的在Struts配置中顯示Action對應的處理類,需要修改Struts的controller,將struts-config.xml中的controller改為org.springframework.web.struts.DelegatingRequestProcessor.
四:Hibernate的介紹
Hibernate利用ORM(對象關系映射)的機制解決業務邏輯和數據訪問的相分離的問題,Hibernate封裝數據訪問的細節,簡化數據訪問的復雜程度,把注意力主要在業務邏輯上面,同時通過維護ORM文件,簡單用以維護。
1:對象持久化的概念
由于實體域對象存在于內存中,但是不可能永遠存在,很多情況下把實體域對象永久的存儲在數據庫中,這個過程就是對象持久化。 其中被持久化的實體域對象稱為持久化對象,持久化對象對應的產生類稱為持久化類。
傳統的持久化方法是: 創建連接,執行SQL語句,獲得結果集,關閉結果集,關閉數據庫連接。所以每次都要重復相同的過程,冗余太大。
2:ORM介紹
ORM就是對象關系映射,主要目的是使業務邏輯和數據庫訪問相分離,ORM中間件封裝數據訪問的細節,開發者只需要進行簡單的操作就可以完成持久化工作。
ORM的關鍵就是對象和關系的映射關系,因為有這樣的映射關系,所以才可以簡單的持久化對象。在ORM中,這種對應的關系存在于一個XML文件中,稱為對象關系映射文件,這個映射文件起到一個橋梁作用,使得ORM中間件持久化一個對系那個的時候能夠找到目的地,即就是表。
3:Hibernate簡介
Hibernate就是一個ORM中間件,它是一個開源的框架,對JDBC做啦輕量級的封裝,并且支持主流數據庫,可以提高開發效率。
A:Hibernate的核心接口
Hibernate的核心接口一共五個:分別為Configuration,SessionFactory,Session,Query和Criteria接口,以及Transaction接口。
1:configuration接口主要功能: 它是Hibernate的入口,創建configuration對象主要是把Hibernate的配置文件和ORM文件讀到內存中,并且創建SessionFactory對象,把所有讀到的信息復制給SessionFactory。
2:SessionFactory接口主要功能: 它緩存復制到的所有讀到的信息,以及根據映射信息自動生成的SQL語句,并產生Session對象。一個數據庫只能對應一個SessionFactory。
3:session接口主要功能: 這個接口主要是定義各種持久化操作的方法,比如:Save();CreateQuery();Update();
4:Query和Criteria接口主要功能: 主要數據庫的查詢,HQL語句主要是面向對象的沒他的參數是持久化類的類名和屬性,SQL語句主要是表和字段。
5:Transaction接口的主要功能是: 對底層的數據事務進行封裝。
B:Hibernate的配置文件
Hibernate的配置文件有兩種類型:Hibernate.property ;Hibernate.cfg.xml,或者自定義配置文件。主要功能是配置數據庫連接的相關信息。
兩種文件的區別是:
1:Hibernate.cfg.xml多個<mapping>元素,這個元素的resource屬性值是ORM文件的路徑。
2:兩者同時存在時候,configuration接口線加載Hibernate.property 文件,在加載Hibernate.cfg.xml,然后Hibernate.cfg.xml的信息覆蓋掉Hibernate.property的信息。
C:Hibernate的初始化過程
Hibernate的初始化過程主要是遵循五個接口來實現:
1:建立configuration對象。
Configuration config=new Configuration();
Config.addClass(持久化類);
或者 Configuration config=new Configuration().configure(Hibernate配置文件URL);
2:建立SessionFactory對象
SessionFactory factory=config.buildSessionFactory();
1步2步就完成Hibernate的初始化。
3:建立Session對象
Session session=factory.OpenSession();
Session.save();
接著就可以完成相關操作。
D:Hibernate的一般實例使用。
1:創建數據庫 2:寫相應的持久化類 3:建立ORM文件
4:建立Hibernate配置文件 5:建立數據庫訪問類DAO 6:建立業務邏輯
五:Spring和Hibernate的集成策略
通過對Hibernate和Spring的基本知識的了解和應用,了解到Spring和Hibernate的有點鮮明,所以實現兩者的整合對開發效率有很大的提高。
A:集成方案: Spring和Hibernate的集成方案有兩種:
1:一種是利用Hibernate Synchronizer來自動生成大量數據訪問操作的方法。這些方法封裝了session對象的操作,開發者可以直接利用這些方法來定義DAO,這種DAO和Spring是沒有耦合的。
2:另一種方式是通過Spring提供的Hibernate模板(Hibernate Template)來訪問的。模板對session對象的操作進行啦封裝,在開發過程中可以直接使用模板的方法來實現數據的訪問,而且用戶不需要在定義和事物相關的語句,如開始,提交,回滾事物以及進行事務處理。但是這種方式Hibernate和Spring的耦合在一起,不利于移植。
B:第一種方案的介紹
Hibernate Synchronizer是Hibernate自帶的一種插件,利用它可以根據數據庫的表自動生成ORM文件,持久化類,DAO類,并且對其中任何一個修改,都可以相應的自動改變。從而提高開發效率。
在這種集成方式中,Spring的配置文件ApplicationContext.xml文件是Spring和Hibernate結合的重要部分,它將應用中的各種依賴關系裝配起來,在運行期將這種依賴關系注入內存,還可以注入事務代理等,他就像是Spring和Hibernate結合的紐帶。
C:第二種方案的介紹
這種方案是利用Spring提供那個Hibernate Template來建立DAO類,并通過Spring配置文件將DAO類注入到應用中。
Spring對Hibernate的DAO提供支持,其中Spring提供的Hibernate Template類以及HibernateDaoSupport類是建立DAO時候用到的兩個類。
1:Hibernate模板類介紹
Hibernate模板類存在于包org.springframework.orm.hibernate3下,它提供很多方法完成基本的操作??梢酝瓿纱蠖鄶?/span>DAO的基本方法。
利用Hibernate的自帶的一下方法可以實現簡單的一些數據庫操作,但隨對于復雜的數據庫操作,可以通過下面的方法來實現:
a:Object execute(HibernateCallback action)
b:List executeFind(HibernateCallback action)
從上面的方法中可以看到,都有一個HibernateCallback的實例作為參數,因為通過HibernateCallback可以完成完全使用Hibernate的方式訪問數據庫,解決Spring和Hibernate集成以后不靈活的缺陷。
HibernateCallback只是一個接口,他只有一個方法doInHibernate(org.hibernate.Session session),這個方法也只有一個參數Session。這樣doInHibernate方法的持久化操作與不使用Spring時的操作完全相同,這樣就可以像使用Hibernate一樣的訪問方式。
使用方法:首先DAO中聲明HibernateTemplate對象,然后通過該對象執行那個相應的簡單操作。
2: HibernateDaoSupport類
HibernateDaoSupport類封裝Hibernate Template類的操作,在HibernateDaoSupport類中主要提供兩個方法用于實現DAO。
A:public final void setSessionFactory(SessionFactory sessionFactory):這個方法用于接收Spring上下文中的SessionFactory對象的依賴注入。
B:Public final HibernateTemplate getHibernateTemplate():用于根據SessionFactory產生的session,然后生成HibernateTemplate,從而訪問數據庫。
使用方法:在DAO的實現中,首先要使DAO集成HibernateDaoSupport類,然后通過Spring上下文注入DAO對SessionFactory的依賴,最后使用getHibernateTemplate()方法來完成具體的DAO的操作。