摘 要:本文主要介紹了基于JAVA EE體系下JSF、Spring和MyBatis三個(gè)技術(shù)框架的基本概念以及它們所包含的核心內(nèi)容,重點(diǎn)通過一個(gè)示例描述了三個(gè)技術(shù)的搭建和使用。
關(guān)鍵詞:SM框架;分層架構(gòu);JSF;Spring;MyBatis
中圖分類號(hào):TP393.092
1 JSM框架的介紹和應(yīng)用
1.1 JSM框架的概念
1.1.1 概述
首先,JSM不是一個(gè)框架,而是多個(gè)框架的集成,它是為了實(shí)現(xiàn)web應(yīng)用而采用的開源框架的集合。這種框架可以滿足JAVA EE多層體系結(jié)構(gòu)的開發(fā)目的。JAVA EE不僅是開發(fā)平臺(tái)同時(shí)也是一個(gè)開發(fā)規(guī)范,JAVA EE最大的特點(diǎn)是引入了WEB應(yīng)用。目前企業(yè)應(yīng)用開發(fā)的系統(tǒng)多是采用分層架構(gòu)的模式進(jìn)行設(shè)計(jì),JAVAEE正式基于這種分層架構(gòu)的考慮,是多層的分布式體系結(jié)構(gòu)。
1.1.2 JAVA EE的架構(gòu)介紹
JAVA EE的分層結(jié)構(gòu)主要有:
第一層:客戶端層??蛻魹g覽器段的程序,例如JS腳本程序、嵌入網(wǎng)頁(yè)運(yùn)行的JAVA APPLET程序。主要用到 的技術(shù)有JS、APPLET。
第二層:應(yīng)用服務(wù)器層。一般情況下,此層包含支持客戶端請(qǐng)求的表示邏輯和業(yè)務(wù)邏輯。表示層由顯示HTML頁(yè)面的JSP頁(yè)面和servlets實(shí)現(xiàn)。業(yè)務(wù)邏輯有兩種實(shí)現(xiàn)方式,一種輕量級(jí)一種重量級(jí)的實(shí)現(xiàn)。輕量級(jí)通過Spring等開源框架實(shí)現(xiàn),重量級(jí)通過RMI對(duì)象和EJB實(shí)現(xiàn)。EJB依靠容器(Container)實(shí)現(xiàn)事務(wù)處理、生命周期和狀態(tài)管理、資源池、安全等問題,簡(jiǎn)而言之,容器就是EJB依賴執(zhí)行的運(yùn)行環(huán)境。主要用到的技術(shù)有:jsp、servlet,jsf框架及規(guī)范。可以說JSF是MVC架構(gòu)的技術(shù)也是一種JAVAEE在中間層提供的一種規(guī)范。
第三層:后端層。此層是現(xiàn)有應(yīng)用和數(shù)據(jù)倉(cāng)庫(kù)的組合,也稱為企業(yè)信息系統(tǒng)(EIS)層,因?yàn)樗梢园髽I(yè)資源規(guī)劃(ERP)、大型主機(jī)事務(wù)處理、數(shù)據(jù)庫(kù)系統(tǒng)及其它遺留下來的信息系統(tǒng)等許多系統(tǒng)。主要包括JDBC技術(shù)、JAVA持久化API、JTA等。
1.2 JSM與JAVAEE各層架構(gòu)的對(duì)應(yīng)關(guān)系
JSM框架中J代表“JSF”框架,它是支持web系統(tǒng)實(shí)現(xiàn)JAVAEE中第二層的表示層邏輯的技術(shù)框架??蚣苤械腟代表“spring”是為了實(shí)現(xiàn)第二層的輕量級(jí)業(yè)務(wù)邏輯的技術(shù)框架。由于“spring”的認(rèn)可度非常高,國(guó)內(nèi)眾多web應(yīng)用都采用這種框架來實(shí)現(xiàn)系統(tǒng)的業(yè)務(wù)邏輯層??蚣苤械腗代表“mybatis”是為了實(shí)現(xiàn)第三層后端層的技術(shù)框架。
JSM工作的整體流程開始于用戶的請(qǐng)求,結(jié)束在對(duì)請(qǐng)求的相應(yīng),而中間的過程就是對(duì)該業(yè)務(wù)的處理過程。
用戶通過瀏覽器提交請(qǐng)求,JSF框架的控制層調(diào)用業(yè)務(wù)層邏輯進(jìn)行進(jìn)一步的業(yè)務(wù)處理,業(yè)務(wù)層在處理業(yè)務(wù)時(shí)調(diào)用數(shù)據(jù)處理層對(duì)業(yè)務(wù)中的數(shù)據(jù)進(jìn)行必要的存儲(chǔ)、修改、刪除或查詢等操作,并逐級(jí)返回給JSF框架的控制層,由控制流轉(zhuǎn)到相應(yīng)的頁(yè)面,最終由頁(yè)面進(jìn)行結(jié)果的呈現(xiàn)。
2 JSM的詳細(xì)介紹
JSF是JAVAServer Faces的縮寫,是Sun公司在JCP(Java Community Process)下JSR127中倡導(dǎo)的技術(shù),目前已列入java EE中間視圖層的規(guī)范技術(shù)。它提供jsp頁(yè)面顯示的組件對(duì)象,提供轉(zhuǎn)換和校驗(yàn)組件數(shù)據(jù),并能將數(shù)據(jù)傳入服務(wù)端進(jìn)行保存。JSF與Struts最大的區(qū)別就在于JSF本身既是一種技術(shù)同時(shí)又是JAVAEE的中間層規(guī)范技術(shù)。因此我認(rèn)為JSF技術(shù)的發(fā)展更會(huì)得到體系的有力支持。
JSF的典型特征是以用戶界面組件為中心,建立在Servlet基礎(chǔ)上,基于jsf的應(yīng)用程序也是web應(yīng)用,它實(shí)現(xiàn)的是MVC模型MODEL2的形式。
Spring是針對(duì)Java EE容器服務(wù)及Java EE API提供抽象和集成支持的框架技術(shù),它的出現(xiàn)為實(shí)施JAVA EE降低了門檻,Srping是非侵入式框架,也就是說業(yè)務(wù)本身的代碼不會(huì)與Spring框架之間有依賴關(guān)系。
Spring框架像一個(gè)模板,它可以和MVC框架一起使用,同時(shí)也含有自己的MVC框架,它可以管理事物也同時(shí)提供遠(yuǎn)程調(diào)用的接口,每個(gè)部分都可以單獨(dú)運(yùn)用到自身的系統(tǒng)中。下圖為Spring的架構(gòu)圖,圖中主要列出了組成Spring框架的功能模塊。
Spring框架的核心技術(shù)主要有兩個(gè),即控制反轉(zhuǎn)容器(IOC)和面向切面編程技術(shù)。
控制反轉(zhuǎn)(IOC)也被稱為依賴注入(DI),目的是為了處理對(duì)象之間的依賴關(guān)系,其他對(duì)象只能通過構(gòu)造方法參數(shù)、工廠方法參數(shù)、對(duì)象屬性的方法注入到當(dāng)前對(duì)象的實(shí)例中去。ApplicationContext對(duì)象是IOC容器的接口用來負(fù)責(zé)對(duì)象的實(shí)例化,配置、和組裝讀取配置的元數(shù)據(jù),配置元數(shù)據(jù)以XML格式表示,Java注釋,或Java代碼。依賴注入的兩種主要方式是通過構(gòu)造方法注入和setter方法注入。
向切面編程技術(shù)是試圖用另外一種方式去思考程序結(jié)構(gòu)以便補(bǔ)充面向方向編程的內(nèi)容。此外AOP提供了一個(gè)非常好的中間件解決方案。切面的含義就是橫切面,代表所有類的功能,這些功能可以統(tǒng)一提取出來,通過DI方式注入到每個(gè)類中進(jìn)行執(zhí)行,而對(duì)于通用功能的管理則可以統(tǒng)一進(jìn)行。AOP的實(shí)現(xiàn)原理是動(dòng)態(tài)代理技術(shù),即通過代理對(duì)象進(jìn)行對(duì)目標(biāo)方法的調(diào)用,同時(shí)控制調(diào)用方法的前后業(yè)務(wù)邏輯。Spring AOP提供了定義切入點(diǎn)、切入點(diǎn)前后等配置方式,同時(shí)通過AspectJ表達(dá)式來定義哪些類執(zhí)行切入的功能。常用到AOP的地方是事物管理、安全檢查、緩存、對(duì)象池管理等系統(tǒng)的通用功能,
MyBatis的前身是IBatis,一個(gè)apache組織的開源項(xiàng)目,后因?yàn)轫?xiàng)目遷移到了google,更名為MyBatis。它是支持普通SQL查詢,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis使用簡(jiǎn)單的XML或注解用于配置和原始映射,將接口和Java的POJOs(Plain Old Java Objects,普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。與Hibernate項(xiàng)目,MyBatis可以更加靈活的配置sql,這對(duì)于靈活多變的業(yè)務(wù)數(shù)據(jù)處理無(wú)疑是最佳的選擇,當(dāng)然Hibernate和MyBatis各有各的優(yōu)勢(shì),在此不進(jìn)行二者之間的對(duì)比,至于應(yīng)用開發(fā)應(yīng)該選擇哪一個(gè)作為持久化層的框架,我認(rèn)為還是要依據(jù)項(xiàng)目自身的特點(diǎn)而定。
3 JSM框架的搭建
JSM框架的搭建主要是解決他們之間的關(guān)聯(lián)問題,也就是三個(gè)框架在同一個(gè)系統(tǒng)中使用時(shí)的配置方式。
接下來將舉一個(gè)小例子來具體介紹JSM之間搭建。
3.1 示例需求說明
該示例描述了一個(gè)簡(jiǎn)單判斷用戶是否存在的功能,步驟如下:
(1)用戶在頁(yè)面中輸入用戶名;(2)用戶點(diǎn)擊提交按鈕;(3)系統(tǒng)在數(shù)據(jù)庫(kù)中查找相關(guān)的用戶名。若存在到則返回歡迎信息,若不存在則返回找不到的提示信息;(4)系統(tǒng)返回歡迎頁(yè)面,顯示用戶是否存在的提示信息。
3.2 環(huán)境搭建
開發(fā)工具:Eclise3.4;JAVA版本:JDK1.5;應(yīng)用服務(wù)器:Tomcat6.0;JSF1.2;Spring3.0.5;MyBatis3.1.1。
3.3 示例詳細(xì)設(shè)計(jì)
依據(jù)項(xiàng)目分層設(shè)計(jì)架構(gòu)模式,該示例主要分三層設(shè)計(jì),即視圖層、業(yè)務(wù)層、持久化層。(注意:為了達(dá)到簡(jiǎn)單清晰的目的,對(duì)每個(gè)層次只使用實(shí)現(xiàn)類進(jìn)行表述,在實(shí)際開發(fā)過程中往往需要面向接口進(jìn)行編程。)
3.4 JSM框架配置
3.4.1 配置JSF框架
首先,在web.xml文件中配置JSF,內(nèi)容如下:
其次,在web.xml文件中配置faces-config.xml文件的引用。
第三,在faces-config.xml文件中配置JSF和Spring的關(guān)聯(lián)關(guān)系。
第四,在faces-config.xml文件中注冊(cè)TestBean,注意在注冊(cè)TestBean的時(shí)候?qū)pring管理的TestServce作為TestBean的屬性進(jìn)行注冊(cè)。因此在TestBean中要定義相同名稱的屬性并且建立屬性的set、get方法。
3.4.2 配置Spring
首先,在web.xml中配置監(jiān)聽器。
第二,在web.xml中配置spring配置文件的引用。
第三,在spring配置文件中配置數(shù)據(jù)源。
第四,在beans.xml文件中注冊(cè)TestService類、TestDao類,且通過依賴注入的方式將TestDao作為屬性注入到TestService類中,如下所示:
3.4.3 配置MyBatis
首先,在beans.xml文件中配置MyBatis。
第二,修改TestDao類的注冊(cè)信息。這一步的前提是TestDao類基礎(chǔ)了Mybatis提供的父類SqlSessionDaoSupport。該父類需要屬性sqlSessionTemplate,因此在TestDao類的注冊(cè)信息中注入屬性sqlSessionTemplate。
3.4.4 示例運(yùn)行
第一,輸入用戶名,點(diǎn)擊提交按鈕。
第二,顯示歡迎信息。
參考文獻(xiàn):
[1]Spring Framework Reference Documentation[J/OL].http://docs.spring.io/spring/docs/3.2.10.RELEASE/spring-framework-reference/htmlsingle/#jsf-delegatingvariableresolver.
[2]MyBatis Version:3.2.7 Last Published:2014.http://mybatis.github.io/mybatis-3/index.html.
[3]羅會(huì)波.JSF第一步[M].北京:清華大學(xué)出版社,2014.
作者簡(jiǎn)介:劉小維(1982.12-),女,滿族,北京人,軟件工程師,管理學(xué)學(xué)士,研究方向:Java企業(yè)級(jí)應(yīng)用開發(fā)、軟件發(fā)平臺(tái)研發(fā)。
作者單位:中國(guó)金融電子化公司,北京 100054