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