李 洋
(南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210000)
SSM框架在Web應(yīng)用開(kāi)發(fā)中的設(shè)計(jì)與實(shí)現(xiàn)
李 洋
(南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210000)
在Web應(yīng)用的開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)框架的選擇非常重要。一個(gè)好的開(kāi)發(fā)框架能夠加速Web應(yīng)用的開(kāi)發(fā)速度,降低開(kāi)發(fā)成本,減少開(kāi)發(fā)人員的工作量,同時(shí)能夠使Web應(yīng)用具有良好的擴(kuò)展性和移植性。基于SpringMVC+Spring+Mybatis(SSM)的框架憑借良好的性能和較快的開(kāi)發(fā)效率,逐漸成為主流的Web應(yīng)用開(kāi)發(fā)框架組合。SpringMVC是一個(gè)基于MVC的框架,其主要負(fù)責(zé)表現(xiàn)層的功能,比如響應(yīng)請(qǐng)求。Spring框架主要起到容器的功能,整合了SpringMVC和Mybatis,實(shí)現(xiàn)層與層之間的解耦,同時(shí)使業(yè)務(wù)邏輯更加清晰。Mybatis框架主要負(fù)責(zé)的是數(shù)據(jù)持久層,完成和數(shù)據(jù)庫(kù)的相關(guān)操作。重點(diǎn)以權(quán)限管理模塊為例,說(shuō)明了SSM框架在開(kāi)發(fā)后臺(tái)管理系統(tǒng)中的應(yīng)用,為開(kāi)發(fā)后臺(tái)管理系統(tǒng)提供了理論指導(dǎo)。
SpringMVC;Spring;Mybatis;Web應(yīng)用;框架
目前,國(guó)內(nèi)外有很多的Web開(kāi)發(fā)技術(shù),其中應(yīng)用最廣泛的兩類技術(shù)分別是微軟(Microsoft)公司的.Net平臺(tái)和Sun及IBM等公司提出的J2EE平臺(tái)。J2EE主要面向使用Java程序設(shè)計(jì)語(yǔ)言進(jìn)行基于Web的企業(yè)應(yīng)用的開(kāi)發(fā)部署[1]。J2EE平臺(tái)相較于.Net平臺(tái)是開(kāi)放的、跨平臺(tái)的、可移植的,因此很多企業(yè)都選擇J2EE平臺(tái)的結(jié)構(gòu)設(shè)計(jì)和解決方案。傳統(tǒng)的J2EE以EJB(Enterprise JavaBean)容器為核心,EJB組件提供事務(wù)管理,處理用戶請(qǐng)求,支持打包處理和資源管理等功能,但是EJB與EJB容器的高度耦合關(guān)系,使其可移植性差[2],同時(shí)EJB代碼的復(fù)雜、維護(hù)的困難使其逐步被淘汰,因此輕量級(jí)的框架就應(yīng)運(yùn)而生。例如,Struts、Spring等,降低了開(kāi)發(fā)的復(fù)雜度,提高了開(kāi)發(fā)時(shí)的調(diào)試效率,進(jìn)而提高了Web網(wǎng)站的開(kāi)發(fā)速度。
MVC(Model-View-Controller,即模型-視圖-控制器[3])是Web開(kāi)發(fā)中的一種設(shè)計(jì)模式。圖1顯示了這三種組件的聯(lián)系和功能的分工。

圖1 MVC組件類型的關(guān)系與功能
在這種設(shè)計(jì)模式中,模型(Model)、視圖(View)、控制器(Controller)分別履行不同的職責(zé)。Model主要實(shí)現(xiàn)業(yè)務(wù)的邏輯處理,業(yè)務(wù)規(guī)則的制定,包括數(shù)據(jù)庫(kù)的訪問(wèn)。因此業(yè)務(wù)模型的設(shè)計(jì)是MVC設(shè)計(jì)模式中最重要的部分。View是根據(jù)模型數(shù)據(jù)創(chuàng)建的,用戶能看到并且能與之交互。View通常是采集用戶數(shù)據(jù)的輸入,響應(yīng)用戶的請(qǐng)求。Controller通過(guò)讀取視圖中用戶輸入的數(shù)據(jù),根據(jù)用戶輸入的數(shù)據(jù)選擇合適的模型處理用戶請(qǐng)求,并且選擇合適的視圖來(lái)展示模型處理結(jié)果。Controller并不參與數(shù)據(jù)的處理,而是將數(shù)據(jù)的處理交給Model執(zhí)行。可見(jiàn),MVC設(shè)計(jì)模式實(shí)現(xiàn)的業(yè)務(wù)處理和視圖展示的分離,降低了每個(gè)模塊之間的耦合度,達(dá)到了系統(tǒng)的設(shè)計(jì)目標(biāo)和整體要求。
SpringMVC框架是Spring基于MVC設(shè)計(jì)模型的用于構(gòu)建Web應(yīng)用程序的一種實(shí)現(xiàn)。在Web應(yīng)用開(kāi)發(fā)過(guò)程中,SpringMVC框架容納了包括JSP在內(nèi)的大量視圖技術(shù),可以靈活配置[4]。雖然SpringMVC與Struts功能類似,但是它們的實(shí)現(xiàn)原理不同。Struts2是基于類級(jí)別的攔截,一個(gè)類對(duì)應(yīng)一個(gè)request上下文。SpringMVC是基于方法級(jí)別的攔截,一個(gè)方法對(duì)應(yīng)一個(gè)request上下文,而方法同時(shí)又跟一個(gè)URL對(duì)應(yīng)。SpringMVC的工作流程如圖2所示。

圖2 SpringMVC工作流程圖
SpringMVC框架的主要構(gòu)件是前端控制器(DispatcherServlet)、處理器映射器(HandlerMapping)、處理器適配器(HandlerAdapter)、處理器(Handler)、視圖解析器(ViewResolver)、視圖[5]。其中,DispatcherServlet從HttpServlet繼承而來(lái),作用類似于一個(gè)Servlet,主要用于接收用戶請(qǐng)求和響應(yīng)服務(wù),功能如下:
(1)實(shí)現(xiàn)文件上傳,本地化解析功能;
(2)通過(guò)處理器映射器,將請(qǐng)求映射到處理器(返回一個(gè)執(zhí)行鏈,包括一個(gè)處理器、多個(gè)處理器攔截器);
(3)通過(guò)處理器映射器實(shí)現(xiàn)多種類型的處理器;
(4)通過(guò)視圖解析器實(shí)現(xiàn)邏輯視圖到具體視圖的解析;
(5)實(shí)現(xiàn)對(duì)具體視圖的渲染;
(6)通過(guò)異常處理解析器解析執(zhí)行過(guò)程中遇到的異常。
Spring是為降低企業(yè)的應(yīng)用開(kāi)發(fā)復(fù)雜度而創(chuàng)建的一種開(kāi)源框架。其主要目的就是實(shí)現(xiàn)開(kāi)發(fā)中各層之間的分離,實(shí)現(xiàn)允許每層靈活選擇何種構(gòu)件,并且為J2EE的開(kāi)發(fā)提供集成框架。Spring為企業(yè)應(yīng)用的開(kāi)發(fā)提供了一種輕量級(jí)的解決方案[6]。Spring框架主要提供了面向切面(AOP)編程,核心的控制反轉(zhuǎn)(IoC)機(jī)制,以及能夠整合多種持久層的框架和擁有自己的MVC框架。Spring框架希望提供不是專注于某一層的解決方案,而是提供Java EE應(yīng)用開(kāi)發(fā)中各層的解決方案。從圖3中可以看出,Spring框架實(shí)現(xiàn)了表現(xiàn)層、業(yè)務(wù)層、持久層的整合,但這并不意味著原來(lái)已有的框架能被Spring框架取代,而是Spring框架能夠?qū)崿F(xiàn)已有框架的無(wú)縫整合,為企業(yè)級(jí)應(yīng)用開(kāi)發(fā)提供更大的靈活性。

圖3 Spring框架結(jié)構(gòu)圖
總結(jié)起來(lái),Spring具有的優(yōu)勢(shì)為:
(1)提供了一種可有效地組織中間層對(duì)象方法。
(2)提供了一種非侵入設(shè)計(jì),降低了代碼污染。
(3)Spring通過(guò)依賴注入機(jī)制降低了業(yè)務(wù)對(duì)象之間的復(fù)雜性,實(shí)現(xiàn)了對(duì)象、組件之間的解耦。
(4)通過(guò)AOP實(shí)現(xiàn)日志、事務(wù)等功能的集中式管理。
(5)Spring的ORM和DAO(Data Access Objects)[7]實(shí)現(xiàn)了整合多種持久層框架的可能性,簡(jiǎn)化了開(kāi)發(fā)人員對(duì)數(shù)據(jù)庫(kù)的操作。
(6)Spring作為整合組件,可以整合其他框架,為企業(yè)級(jí)應(yīng)用的開(kāi)發(fā)提供更大的靈活度。
相關(guān)術(shù)語(yǔ)如下所述:
IoC(Inversion of Control,控制反轉(zhuǎn)):面向?qū)ο箝_(kāi)發(fā)中,這是一種設(shè)計(jì)原則,用來(lái)降低代碼之間的關(guān)聯(lián)性。IoC將設(shè)計(jì)好的類不是在類的內(nèi)部實(shí)現(xiàn)控制,而是由系統(tǒng)去控制,這稱為控制反轉(zhuǎn)[8]。
AOP(Aspect-Oriented Programming,面向切面編程):是由Gregor Kiczales提出的一種全新的編程技術(shù),為開(kāi)發(fā)者提供了一種描述橫切關(guān)注點(diǎn)的機(jī)制[9]。AOP通過(guò)動(dòng)態(tài)代理,實(shí)現(xiàn)將多個(gè)系統(tǒng)級(jí)服務(wù)(例如日志、事務(wù)等)的行為封裝到可重用的模塊中,用來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯和系統(tǒng)級(jí)服務(wù)的松耦合。
非侵入式:侵入式設(shè)計(jì)表現(xiàn)為客戶端程序需要繼承框架中的類,而非侵入式設(shè)計(jì)則表現(xiàn)為客戶端實(shí)現(xiàn)框架提供的接口,這樣就減少了應(yīng)用程序?qū)蚣艿囊蕾嚕约翱蚣芤浦矔r(shí)的負(fù)擔(dān),提高了應(yīng)用程序組件的復(fù)用性。
Mybatis是J2EE應(yīng)用開(kāi)發(fā)中的一個(gè)持久層框架,它通過(guò)配置的XML文件或者注解實(shí)現(xiàn)對(duì)象和存儲(chǔ)過(guò)程,SQL語(yǔ)句的關(guān)聯(lián),而不是實(shí)現(xiàn)對(duì)象與數(shù)據(jù)庫(kù)表的關(guān)聯(lián),并且可以實(shí)現(xiàn)動(dòng)態(tài)生成SQL語(yǔ)句。MyBatis框架集合多種操作型關(guān)系數(shù)據(jù)的概念和方法,它是一個(gè)強(qiáng)大的數(shù)據(jù)訪問(wèn)工具和解決的方法[10]。Mybatis與JDBC相比,簡(jiǎn)化了相關(guān)代碼的實(shí)現(xiàn),其通過(guò)使用注解方法或者簡(jiǎn)單的XML配置文件實(shí)現(xiàn)原始映射,然后通過(guò)映射引擎將JavaBean或者定義的接口映射成數(shù)據(jù)庫(kù)中的記錄。Mybatis的工作原理如圖4所示。通過(guò)XML配置文件將JavaBean、Map以及本數(shù)據(jù)類型(如Integer、String等)映射成PreparedStatement所需的輸入?yún)?shù)以ResultSet結(jié)果集的類型。
Mybatis讓程序?qū)⒅饕Ψ旁赟QL語(yǔ)句上,通過(guò)Mybatis提供的映射方式,自由靈活生成(半自動(dòng)化,大部分需要程序員編寫(xiě)SQL)滿足需要的SQL語(yǔ)句,修改比較容易。Mybatis可以將PreparedStatement中的輸入?yún)?shù)自動(dòng)進(jìn)行輸入映射,將查詢結(jié)果集靈活映射成Java對(duì)象。相對(duì)于其他的ORM框架(如Hibernate),Mybatis適用于需求變化多的項(xiàng)目(如互聯(lián)網(wǎng)項(xiàng)目)。

圖4 Mybatis的工作原理圖
5.1 整合SSM框
SSM是SpringMVC、Spring、Mybatis的簡(jiǎn)寫(xiě)。SSM是輕量級(jí)并且應(yīng)用較多的一種組合框架,好多中小型企業(yè)的門(mén)戶網(wǎng)站、政府網(wǎng)站、金融項(xiàng)目都是基于SSM架構(gòu)開(kāi)發(fā)的。由于Spring是一個(gè)業(yè)務(wù)層的框架,能夠很好地整合表現(xiàn)層的SpringMVC框架和持久層的Mybatis框架。整合以后,Spring就會(huì)充當(dāng)整個(gè)應(yīng)用的工廠。首先整合Spring和Mybatis,Spring整合Mybatis最簡(jiǎn)單的理解就是“把Mybatis數(shù)據(jù)源的配置、事務(wù)的管理、SqlSessionFactory的創(chuàng)建以及數(shù)據(jù)映射器接口Mapper的創(chuàng)建交由Spring管理”,所以Mybatis的配置文件mybatis-config.xml中不需要再配置數(shù)據(jù)源及事務(wù),在業(yè)務(wù)層service實(shí)現(xiàn)時(shí)不需要手動(dòng)地獲取SqlSession以及對(duì)應(yīng)的數(shù)據(jù)映射器接口Mapper,通過(guò)Spring的注入即可。Spring整合Mybatis的配置文件部分代碼如下:
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
第二步整合SpringMVC和Spring。由前述可知SpringMVC框架是Spring的基于MVC設(shè)計(jì)模型的實(shí)現(xiàn),因此單獨(dú)配置一個(gè)SpringMVC的配置文件,其主要完成自動(dòng)掃描控制器、視圖模式、注解的啟動(dòng)等功能的配置,然后在web.xml文件中配置整合即可。SpringMVC的配置文件部分代碼如下:
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
5.2 系統(tǒng)模型
經(jīng)過(guò)網(wǎng)站需求的分析,網(wǎng)站的后臺(tái)管理功能設(shè)計(jì)結(jié)構(gòu)如圖5所示。

圖5 后臺(tái)管理功能結(jié)構(gòu)圖
5.3 體系架構(gòu)
J2EE規(guī)范了服務(wù)器端應(yīng)用系統(tǒng)開(kāi)發(fā)的框架,其核心思想就是組件與分層。其分層主要包括三個(gè)方面:表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)層。在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中,由于項(xiàng)目的需求與設(shè)計(jì),通常需要擴(kuò)展三層劃分的體系結(jié)構(gòu),一般是拆分原來(lái)的三層體系劃分變?yōu)樗膶芋w系劃分,也就是在業(yè)務(wù)邏輯層與數(shù)據(jù)層之間增加一個(gè)服務(wù)層。其用于持久層的數(shù)據(jù)操作,表示數(shù)據(jù)庫(kù)的持久內(nèi)存存儲(chǔ)對(duì)象[11]。
開(kāi)發(fā)中四層體系結(jié)構(gòu)如圖6所示。

圖6 J2EE四層開(kāi)發(fā)架構(gòu)圖
5.4 系統(tǒng)實(shí)現(xiàn)
在后臺(tái)管理系統(tǒng)結(jié)構(gòu)圖中,網(wǎng)站后臺(tái)管理總共有四種功能:權(quán)限管理、知識(shí)管理、資訊管理、活動(dòng)管理。所謂的管理就是實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查,因?yàn)橹R(shí)、活動(dòng)、資訊管理都是以權(quán)限管理為基礎(chǔ)的,因此下面主要講述權(quán)限管理功能的實(shí)現(xiàn)。
5.4.1 數(shù)據(jù)持久層
MyBatis應(yīng)用程序首先創(chuàng)建SqlSessionFactory實(shí)例,其作用相當(dāng)于一個(gè)數(shù)據(jù)庫(kù)連接池,然后SqlSessionFactory通過(guò)配置的XML文件來(lái)獲取一個(gè)SqlSession。執(zhí)行SQL語(yǔ)句所必須的方法,都包含在SqlSession中,所以通過(guò)SqlSession完成對(duì)數(shù)據(jù)庫(kù)的操作,用完之后需要釋放數(shù)據(jù)庫(kù)連接。
5.4.2 服務(wù)層
數(shù)據(jù)訪問(wèn)采用DAO(數(shù)據(jù)訪問(wèn)對(duì)象)模式[12],DAO是數(shù)據(jù)庫(kù)訪問(wèn)接口,可以從任何一種配置好的數(shù)據(jù)源處獲取數(shù)據(jù)[13]。服務(wù)層(DAO)的使用可以減少業(yè)務(wù)邏輯代碼和數(shù)據(jù)庫(kù)訪問(wèn)代碼之間的耦合度,有利于劃分和分配任務(wù)。這里用權(quán)限管理里面的角色管理舉例,首先定義接口類RoleDao,其定義如下:
public interfaceRoleDao {
//根據(jù)id查詢角色信息
public RolefindRoleById(int id) throws Exception;
//修改角色
public voidmodifyRole(int roleId) throws Exception;
//添加角色
public voidinsertRole(Role role) throws Exception;
//刪除角色
public voiddeleteRole(int id) throws Exception;
然后定義其接口實(shí)現(xiàn)類RoleDaoImpl,在接口實(shí)現(xiàn)類中實(shí)現(xiàn)的RoleDao接口中聲明的方法。根據(jù)id查詢角色信息的方法實(shí)現(xiàn)如下:
public Role find RoleById(int id) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
Role role=sqlSession.selectOne("test.findRoleById", id);
sqlSession.close();
return role;
}
最后在Mybatis的mapper配置文件中添加如下配置即可。
SELECT * FROM ROLE WHERE id=#{value}
5.4.3 控制層
在增刪改一個(gè)用戶信息時(shí),需要一個(gè)Form表單來(lái)臨時(shí)存儲(chǔ)用戶信息表中各個(gè)字段的信息,因此需要一個(gè)表單類RoleInfoForm。它其實(shí)就是一個(gè)簡(jiǎn)單的JavaBean,并且每個(gè)字段都定義了Getter()和Setter()方法,然后直接就可以在Controller的函數(shù)參數(shù)列表中直接寫(xiě)這個(gè)JavaBean對(duì)象,Spring會(huì)自動(dòng)進(jìn)行封裝。Controller中代碼如下:
@RequestMapping(value="/roleInfo ",method =RequestMethod.POST)
public String queryRole(RoleForm role,HttpSession session,Model model)
throws UnsupportedEncodingException,
Exception {
}
已經(jīng)在web.xml的文件中配置了請(qǐng)求地址,DispatcherServlet會(huì)根據(jù)請(qǐng)求地址把該次請(qǐng)求分派到所寫(xiě)的Controller類中的方法上。通過(guò)注解@Controller注冊(cè)所寫(xiě)的Controller類,@RequestMapping注冊(cè)請(qǐng)求的路徑。至此,控制層的功能已經(jīng)實(shí)現(xiàn)。
5.4.4 表示層
通過(guò)DispatcherServlet可以將頁(yè)面的鏈接地址、提交的表單請(qǐng)求轉(zhuǎn)發(fā)到注冊(cè)過(guò)的Controller類中的方法上,實(shí)現(xiàn)整個(gè)系統(tǒng)頁(yè)面之間的跳轉(zhuǎn)。由于在SpringMVC的配置文件中已經(jīng)配置好了視圖解析器,其解析的文件是ftl文件,所以需要開(kāi)發(fā)的是ftl文件,而不是JSP文件。
文中結(jié)合SpringMVC、Spring、Mybatis框架的各自功能和特點(diǎn),很好地體現(xiàn)了MVC分層開(kāi)發(fā)的設(shè)計(jì)理念,因而有利于應(yīng)用程序的維護(hù)和功能擴(kuò)展,降低每個(gè)模塊之間的耦合度,達(dá)到了系統(tǒng)的設(shè)計(jì)目標(biāo)和整體要求。
[1] 馮 博,朱穗暉.程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2005.
[2] Amstrong E,Ball S,Bodoff S,et al.The J2EE 1.4 tutorial[M].[s.l.]:Sun Micro Systems Inc.,2005:2-25.
[3] 鄔繼成.Struts與Hibernate實(shí)用教程[M].北京:電子工業(yè)出版社,2006.
[4] Andrew H.Object-oriented analysis and design[M].Beijing:China Machine Press,2003:17-56.
[5] Linaje M,Preciado J,Sanchez F F.Engineering rich internet application user interfaces over web-models[J].IEEE Internet Computing,2007,11(6):53-59.
[6] 李 剛.輕量級(jí)JavaEE企業(yè)應(yīng)用實(shí)戰(zhàn)[M].第4版.北京:電子工業(yè)出版社,2015.
[7] 黎永良,崔杜武.MVC設(shè)計(jì)模式的改進(jìn)與應(yīng)用[J].計(jì)算機(jī)工程,2005,31(9):96-97.
[8] 魏學(xué)松,張育平.IOC框架的研究與設(shè)計(jì)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006,16(3):213-216.
[9] Elrad T,Aksit M,Kiczales G,et al.Discussing aspects of AOP[J].Communications of the ACM,2001,44(10):33-38.
[10] 張 宇,王映輝,張翔南.基于Spring的MVC框架設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2010,36(4):59-62.
[11] 劉中兵.開(kāi)發(fā)者突擊:Java Web主流框架整合開(kāi)發(fā):J2EE+Struts+ Hibernate+ Spring[M].北京:電子工業(yè)出版社,2008.
[12] 賈 昆,甘仞初,高慧穎.數(shù)據(jù)訪問(wèn)對(duì)象模式在企業(yè)應(yīng)用集成中的應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(3):373-375.
[13] 王 坤.基于J2EE平臺(tái)Spring MVC框架開(kāi)發(fā)的MIS系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].上海:華東師范大學(xué),2008.
Design and Implementation of SSM in Web Application Development
LI Yang
(College of Telecommunications and Information Engineering,Nanjing University of Posts and Telecommunications,Nanjing 210000,China)
In the process of Web application development,the choice of development framework is essential.A good development framework can accelerate the development of Web application,reduce development costs,ease the burden of developer and make the Web application has good expansibility and portability.Framework based on SpringMVC,Spring and Mybatis with better performance and faster development productivity has gradually become the preferred combination of Web application development framework.SpringMVC is a MVC framework,which is in charge of the function of presentation layer like responding to the request.Spring framework plays the part of container,which integrates Mybatis and SpringMVC,and implements the decoupling between layers.Meanwhile,it can make business logic becomes more clear.Mybatis framework is mainly responsible for data persistence layer and complete the operation of database.Taking the rights management module as an example,in order to explain the application of SSM framework in the development of back-stage management system,it provides theoretical guidance for the development of back-stage management system.
SpringMVC;Spring;Mybatis;Web application;framework
2016-03-04
2016-06-15
時(shí)間:2016-11-22
國(guó)家自然科學(xué)基金資助項(xiàng)目(61271234)
李 洋(1991-),男,碩士研究生,研究方向?yàn)樾l(wèi)星通信技術(shù)。
http://www.cnki.net/kcms/detail/61.1450.TP.20161122.1227.014.html
TP39
A
1673-629X(2016)12-0190-05
10.3969/j.issn.1673-629X.2016.12.041