鄒紅霆
?
基于SSM框架的Web系統(tǒng)研究與應(yīng)用
鄒紅霆
(廣東輕工業(yè)職業(yè)技術(shù)學(xué)院信息技術(shù)學(xué)院, 廣州 510627 )
基于EJB等的重量級的Web應(yīng)用存在著很多問題, 如代碼復(fù)用率低、復(fù)雜程度高、維護性差. 本文提出了一種新的基于MVC結(jié)構(gòu), 使用輕量級的SpringMVC+Spring+Mybatis(SSM)開發(fā)框架, 并且對其結(jié)構(gòu)整合、組成、開發(fā)優(yōu)點等進行了探究, 并以構(gòu)建城市供水業(yè)務(wù)系統(tǒng)為例子, 說明了SSM框架在實際開發(fā)中, 能提高代碼的復(fù)用率、系統(tǒng)的性能等.
Web應(yīng)用; SpringMVC; Spring; Mybatis; 框架
目前, 國內(nèi)外有很多開發(fā)Web應(yīng)用的技術(shù), 其中廣為人知的就有Sun及IBM公司提出的JavaEE平臺和微軟(Microsoft)公司的. Net平臺. 由于JavaEE相較于.Net平臺是可移植、跨平臺、開源的, 所以企業(yè)級開發(fā)往往都是選擇基于JavaEE平臺的設(shè)計和解決方案[1]. 而傳統(tǒng)的EJB(Enterprise Java Bean)是JavaEE的核心, 因其代碼復(fù)雜, 維護困難, 逐漸在企業(yè)級開發(fā)中被淘汰. 因此, 需要一個更加輕量級的框架來降低開發(fā)的難度.
當前盛行的Spring MVC + Spring + Mybatis (以下簡稱SSM)[2]整合框架, 能更加便利、高效地開發(fā)出應(yīng)用功能強大的Web應(yīng)用, 同時SSM是一個典型的MVC框架, 整個系統(tǒng)被劃分為表示層、控制層、服務(wù)層、和數(shù)據(jù)庫訪問層4層, 其中Spring是一個輕量級的控制反轉(zhuǎn)(IOC)和面向切面(AOP)的容器框架. Spring MVC分離了控制器、模型對象、分派器以及處理程序?qū)ο蟮慕巧? 這種分離讓它們更容易進行定制. MyBatis是一個支持普通SQL查詢、存儲過程和高級映射的優(yōu)秀持久層框架[3, 4]. 在實際的開發(fā)過程中, 除了要考慮Web系統(tǒng)的功能強大, 系統(tǒng)的健壯性、易維護性等性能指標之外, 還要把用戶與服務(wù)器的交互效率作為衡量指標來考慮. 本文以開發(fā)“城市供水管理系統(tǒng)”為例子, 來研究應(yīng)用SSM與ExtJS整合架構(gòu)開發(fā)Web應(yīng)用平臺的實現(xiàn)方法, 旨在構(gòu)建出一個編寫干凈、便于管理、并且代碼能更易于復(fù)用的多層應(yīng)用平臺.
1.1 Spring MVC框架
Spring MVC是Spring Frame Work所推出的后續(xù)產(chǎn)品, 是Spring框架基于MVC設(shè)計模型的用于構(gòu) 建Web應(yīng)用程序一個模塊[4]. 而且Spring MVC的獨立劃分的特性可以使其項目更隨心地進行定制. 在實際應(yīng)用開發(fā)中, Spring MVC包含了JSP在內(nèi)的大量視圖技術(shù), 可以靈活的定制. 對比Struts2, 兩者的功能相似, 但是它們的原理不同. Struts2相當于是類級別的攔截, 一個類對應(yīng)一個request上下文. 而Spring MVC相當于方法級別的攔截, 每一個方法對應(yīng)一個request上下文, 同時方法又跟一個URL相匹配. Spring MVC的具體工作流程如圖1所示.
(1) 用戶一開始向服務(wù)器發(fā)送請求, Spring前端控制器DispatcherServlet會捕獲請求;
(2) DispatcherServlet對請求過來的URL進行解析, 會得到請求的URI(統(tǒng)一資源標識符), 接著調(diào)用HandlerMapping獲得到相關(guān)Handler配置的對象;
(3) DispatcherServlet 根據(jù)獲得的Handler, 優(yōu)先得到一個相應(yīng)的HandlerAdapter;
(4) 提取Request請求中的相關(guān)數(shù)據(jù), 填入到Handler入?yún)? 然后開始執(zhí)行Handler(Controller);
(5) Handler執(zhí)行完成后, 會返回一個ModelAndView對象給DispatcherServlet;
(6) 根據(jù)返回的ModelAndView, 選擇一個適合的ViewResolver返回給DispatcherServlet進行處理;
(7) ViewResolver結(jié)合ModelandView, 渲染視圖;
(8) 將渲染結(jié)果返回給客戶端.
1.2 Mybatis框架
Mybatis框架主要包括DAO組件與SQLMap組件兩大類, mybatisDAO組件主要是把應(yīng)用程序的數(shù)據(jù)訪問層和持久層的表示位置和方式抽象化, 從而幫助開發(fā)人員基于DAO設(shè)計的模式進行設(shè)計[5]. SQL Map組件是mybatis框架的重要組成部分, 它通過通過配置xml或注解的方式將要執(zhí)行的各種statement配置起來, 并通過java對象和statement中的sql進行映射生成最終執(zhí)行的sql語句, 最后由mybatis框架執(zhí)行sql并將結(jié)果映射成java對象并返回. 其工作流程圖如圖2所示.
1.3 Spring框架
Spring是為了解決企業(yè)級大型應(yīng)用, 使用EJB開發(fā)繁瑣度較高而推出的一款開源框架, 是當前非常輕量級面向切面(AOP)和控制反轉(zhuǎn)(IOC)的容器框架[7]. Spring主要提供了面向切面編程, 核心的控制反轉(zhuǎn)機制, 以及能夠整合多種持久層的框架和擁有自己的MVC框架. Spring框架的目的是提供是JavaEE應(yīng)用開發(fā)中各層的解決方案, 而不是其中的某一層. 如圖3所示, Spring框架完成了表現(xiàn)層、業(yè)務(wù)層、持久層的資源整合, 但這并不意味著原來已有的框架能被Spring框架取代, 而是Spring框架能夠?qū)崿F(xiàn)已有框架的無縫整合, 為企業(yè)級應(yīng)用開發(fā)提供更大的可能性.
我們首先將Mybatis與Spring進行整合, 由Spring管理Mybatis數(shù)據(jù)源的配置、事務(wù)的管理、SqlSession Factory的創(chuàng)建以及數(shù)據(jù)映射器接口Mapper的創(chuàng)建. 在業(yè)務(wù)層service實現(xiàn)是通過Spring注入的方式自動獲取SqlSession以及對應(yīng)的數(shù)據(jù)映射器接口Mapper, 所以mybatis-config.xml不需要再配置數(shù)據(jù)源及事務(wù). 整合的代碼如下:
第二步整合SpringMVC與Spring[8]. 由于SpringMVC本身就是Spring的一個模塊, 所以只要單獨寫一個SpringMVC的配置文件, 然后在web.xml文件中配置即可. 配置代碼如下:
3.1 系統(tǒng)模型
根據(jù)需求分析, 整個系統(tǒng)劃分為七個子系統(tǒng), 分別是人事管理系統(tǒng)、水類型管理系統(tǒng)等, 如圖4所示.
圖4系統(tǒng)的主界面
3.2 體系架構(gòu)
JavaEE對于企業(yè)級開發(fā)進行了規(guī)范, 其中最核心思想就是組件與分層. 而分層主要有三個方面: 表示層、業(yè)務(wù)層、持久層. 在實際應(yīng)用開發(fā)的過程中, 由于需求分析與設(shè)計分析, 常常需要拓展三層劃分的體系結(jié)構(gòu), 通常的做法是把原來的三層體系劃分變?yōu)樗膶芋w系劃分, 新增一個服務(wù)層(DAO層)放在業(yè)務(wù)邏輯層與數(shù)據(jù)層之間. DAO層用于持久層的數(shù)據(jù)操作, 表示數(shù)據(jù)庫的持久內(nèi)存存儲對象[9], 其開發(fā)體系架構(gòu)圖如圖5所示.
3.3 系統(tǒng)實現(xiàn)
從系統(tǒng)的功能來看, 所有的操作、活動、管理都是以用戶為核心的. 因此下面以用戶信息管理為例子來敘述整個實現(xiàn)的流程.
3.3.1 數(shù)據(jù)持久層
首先, Mybatis要創(chuàng)建SqlSessionFactory實例, 它的作用相當于一個數(shù)據(jù)庫連接池, 然后SqlSession Factory通過自定義配置的mapper.xml文件會構(gòu)造一個SqlSession. 每個mapper.xml文件中一個SQL對應(yīng)一個Mapped Statement對象, 這個對象包含了必要執(zhí)行的SQL語句的方法, 執(zhí)行之后會將輸出結(jié)果映射至java對象中, 用完之后需要釋放數(shù)據(jù)庫連接資源.
3.3.2 服務(wù)層
數(shù)據(jù)訪問是采用的DAO(數(shù)據(jù)訪問對象)模式. 它是一個數(shù)據(jù)訪問接口, 用來和數(shù)據(jù)庫互動, 存在于業(yè)務(wù)邏輯與數(shù)據(jù)庫資源的間隙, 可以從任何一種配置好的數(shù)據(jù)源處獲取數(shù)據(jù)[10]. 使用服務(wù)層(DAO)可以降低業(yè)務(wù)邏輯代碼和數(shù)據(jù)庫訪問代碼之間的連接度. 這里以用戶管理來舉例, 要定義UserDAO接口, 其定義如下:
public interface ExampleDAO {
//根據(jù)id查詢用戶
public void findUserById(int id) throws Exception;
//根據(jù)id修改角色
public void modifyUserById(int id) throws Exception;
//添加角色
public void insertUser(User user) throws Exception;
//刪除角色
public void deleteUser(int id) throws Exception;
}
緊接著定義其接口實現(xiàn)類UserDAoImpl, 在接口中實現(xiàn)DAO接口里面的方法, 比如實現(xiàn)根據(jù)id查詢用戶, 其實現(xiàn)如下:
public User findUserById(int id) throws Exception {
String res= "SqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(res);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", 1);
session.close();
return user;
}
最后在Mybatis的mapper.xml中配置如下代碼:
3.3.3 控制層
在修改用戶信息的時候, 由于涉及到用Form表單來存儲User各個字段的信息, 所以需要構(gòu)造一個UserForm類. 它本質(zhì)上其實是一個JavaBean, 而且每一個屬性都有自己的Getter()和Setter()方法, 通過Controller的函數(shù)參數(shù)列表寫這個JavaBean對象, Spring框架會自動封裝, 代碼如下:
@Request Mapping (value ="/userInformation", method = RequestMethod.POST)
public String modifyUser(UserForm user userForm,HttpSession session,) throws Exception{
}
在web.xml的文件配置好請求的地址, DispatcherServlet會根據(jù)該請求的地址分配到開發(fā)人員所寫的Controller類中的方法上. 通過@Controller注解注冊所寫的Controller類, 然后@RequestMapping注冊請求的路徑. 至此, 控制層的功能已經(jīng)實現(xiàn).
3.3.4 表示層
SprigMVC的前端控制器Dispatcher的BeanNameUrlHandlerMapping進行請求處理映射, 返回一個HandlerExecutionChain, 然后通過處理器適配為SimpleControllerHandlerAdapter. 接著分配到所寫的Controller類中, 通過處理器功能處理方法的調(diào)用, SimpleControllerHandlerAdapter將會調(diào)用處理器的handleRequest方法進行功能處理. DispatcherServlet會得到返回的ModelAndView, 最后通過視圖解析和視圖渲染, 從而完成表示層[11].
本文主要是通過研究MVC的模式的三層結(jié)構(gòu)體系, 結(jié)合SpringMVC、Mybatis、Spring的優(yōu)點, 討論了SSM框架的開發(fā)優(yōu)勢, 并以此完成了系統(tǒng)的實現(xiàn), 從而降低了開發(fā)成本, 提高了代碼的利用率和拓展性, 非常適用于主流的Web應(yīng)用開發(fā).
[1] 徐 雯, 高建華. 基于Spring MVC及MyBatis的Web應(yīng)用框架研究[J]. 微型電腦應(yīng)用, 2012, 28(7): 1~4
[2] Zhang D, Wei Z, Yang Y.[C]// Sixth International Symposium on Computational Intelligence and Design. IEEE Computer Society, 2013: 350~353
[3] 文歡歡, 劉振宇, 吳 霖. 基于Mybatis和JDBC的分頁查詢研究[J]. 電腦知識與技術(shù), 2015, 11(25): 165~167
[4] Reddy K S P. Java Persistence with MyBatis 3[J]. 2013
[5] 陳 欣. 基于java三層構(gòu)架的管理信息系統(tǒng)中DAO層的構(gòu)建探索[J]. 科技資訊, 2015, 13(11): 26~27
[6] Woychowsky E.[M]. Prentice Hall Press, 2011
[7] 任 仁. 基于MVC模式的Struts和Spring框架的分析及整合[J]. 硅谷, 2008(21): 51~51.
[8] 李俊頡, 葛良全. 基于SSM的物流管理系統(tǒng)的實現(xiàn)[J]. 電子制作, 2015(4)
[9] 劉中兵. 開發(fā)者突擊: JAVA WEB主流框架整合開發(fā)(J2EE+STRUTS+HIBERNATE+SPRING)[M]. 北京: 電子工業(yè)出版社, 2011
[10] 王 坤. 基于J2EE平臺Spring MVC框架開發(fā)的MIS系統(tǒng)設(shè)計與實現(xiàn)[D]. 上海: 華東師范大學(xué)碩士學(xué)位論文, 2008
[11] 劉高軍, 夏景隆. 基于Spring MVC和iBATIS框架的研究與應(yīng)用[J]. 計算機安全, 2012(7): 25~30
Research and Implementation of Web System Based on SSM Framework
ZOU Hongting
(School of Information Technology, Guangdong Industry Polytechnic, Guangzhou 510627, China)
There are a lot of problems, such as low code reuse rate, high complexity and poor maintenance etc. in the heavy weight Web application based on EJB. This paper proposes architecture based on MVC, uses the lightweight SpringMVC+Spring+ Mybatis (SSM) to analyze its structure, composition and development advantages. Taking the construction of urban water supply system as an example, this paper shows that the SSM framework can improve the code reuse rate, system performance and so on.
Web application, SpringMVC, Spring, Mybatis, framework
TP311
A
1672-5298(2017)01-0039-05
2017-01-12
鄒紅霆(1965? ), 女, 湖南祁東人, 廣東輕工業(yè)職業(yè)技術(shù)學(xué)院信息技術(shù)學(xué)院講師. 主要研究方向: 計算機應(yīng)用