,, ,2
(1.咸陽師范學院 計算機學院,陜西 咸陽 712000;2.西安電子科技大學 智能感知與圖像理解教育部重點實驗室,西安 710071)
Java EE是以Java為主進行企業級應用開發的技術平臺,由于Java EE具有跨平臺、穩定性高、兼容性好、技術自由搭配度高等特點,所以一直受到企業級應用開發的青睞。近年來,為了進一步解決傳統Java EE開發所具有的組件依賴性高、開發難度大、部署與維護困難、用戶交互性差等問題,出現了以Struts2、Hibernate、Spring、MyBaties為主的輕量級框架,目的是為了簡化Java EE服務器端的開發過程。在客戶端出現了Ext JS、BootStrap、Easy UI等JavaScript框架,目的是為了提高Web應用的富客戶端體驗。文獻[1-2]研究了Struts2+Spring+Hibernate為主的Java EE應用開發方式,并應用到高校實驗室管理和煤炭企業生產統計管理系統的設計開發中,闡述了其中的核心技術。文獻[3-5]主要以Struts2框架為研究對象,討論了在Java EE控制層的具體實現過程。文獻[6]提出了以Hibernate框架為對象關系映射(object relation mapping,ORM)實現方式的數據持久化層的設計方式。文獻[7-8]研究了Ext JS框架與服務器端輕量級框架的整合,并以動態樹和地圖信息加載為例具體描述了Ext JS的應用。
雖然上述學者的研究成果在某個系統設計過程中進行了實驗驗證,但筆者認為還存在兩個主要問題:1)Struts2的高危安全漏洞。由于目前Struts2在國內經融、政務、大中型互聯網公司、高校等領域的應用中廣泛存在,Struts2存在的遠程代碼執行漏洞[9]爆出后,對相關領域帶來了不少的損失。雖然Apache官方給出了漏洞的解決方案,但是用戶逐漸喪失了對Struts2的信任,這種情況在2017初Struts2再次爆出高危漏洞后尤為明顯;2)Ext JS的執行效率問題。雖然Ext JS 框架提供了功能強大的客戶端組件,能夠簡化Java EE客戶端的開發,但是它是一個重量級的前端框架,在某些復雜頁面下,加載速度和執行效果不盡如人意。
本文在前人研究基礎上,以Easy UI、Spring MVC、Spring、Hibernate等框架為基礎,提出了一個基于ES2SH框架的Java EE應用架構。該架構利用Easy UI創建表示層,Spring MVC創建控制層,采用JSON作為表示層與控制層之間傳輸數據的格式。利用Hibernate創建數據持久層,通過Spring管理控制層與業務層、業務層與持久層之間組件的依賴關系,采用可擴展標記語言(extensible markup language,XML) 文件+注解的方式進行Spring MVC、Spring和Hibernate的集成。將該架構應用到高等院校目標考核管理系統的設計與實施中,詳細描述了該架構應用的關鍵技術,為以該整合框架應用到其他領域的應用開發提供了一定的借鑒。
Easy UI是一組基于JQuery和超文本標記語言(HyperText Markup Language,HTML)5的用戶接口(user interface,UI)插件集合體,只需要一些簡單的HTML標簽(不需要過多的JavaScript和層疊樣式表(cascading style sheets,CSS)),即可設計出功能豐富且美觀的UI界面。具有良好的瀏覽器兼容性、開源、輕量級、易于掌握等優點[10]。Spring MVC是Spring框架中用于實現Web功能的模塊,它根據DispatcherServlet和配置文件,實現視圖、控制器和模型之間的分離[11]。Spring 利用控制反轉容器(Inversion of Control,IOC)創建并管理對象之間的依賴關系;通過面向方面編程(aspect oriented programming,AOP)實現業務邏輯與公共服務邏輯相分離。Hibernate是基于Java數據庫連接(Java DataBase Connectivity,JDBC)的ORM框架,能實現對象與數據庫表之間的映射[12-13],通過Hibernate查詢語言(hibernate query language,HQL)以簡化復雜結構化查詢語言(structure query language,SQL)的編寫,提高數據庫開發效率。
在上述框架原理上,建立滿足MVC模式的5層Java EE分層架構模型,如圖1所示。表示層由Easy UI、視圖組件構成,發送的請求統一由Spring MVC的前端控制器DispatcherServlet接收,根據配置文件將請求轉發到某個具體的Controller組件。Controller調用Service組件執行
業務邏輯,以ModelAndView組件返回邏輯視圖,DispatcherServlet調用ViewResovler解析出物理視圖并填充Model需要顯示的數據響應客戶端請求。業務邏輯層通過Service接口向Controller組件提供服務,具體的業務邏輯處理和計算由Service對象完成,Service對象由Spring IOC容器管理。數據持久層由數據訪問對象(data access object,DAO)模式與Hibernate框架搭建,DAO接口定義持久化邏輯并作為業務邏輯層訪問的入口,DAO對象封裝Hibernate通過映射文件完成持久化對象(persistent object,PO)與數據存儲層之間的交互,DAO對象由Spring IOC容器管理。數據存儲層負責存儲應用系統所需要長久保存的數據以及之間的關聯關系。

圖1 整合ESMSH框架的Java EE架構
目標責任考核是高等院校行政管理的一項重要工作,通過制定、落實、執行、監督、分析各二級學院、職能部門的各項工作任務和進展情況,針對不足找出差距,提出改進措施,從而推動學校又快又好的發展。通過分析目標考核工作的具體流程,結合上述ESMSH框架設計了目標考核管理信息系統,主要包括基礎數據、教工信息管理、指標管理、報表管理、信息查詢和系統維護等模塊。其中基礎數據包括教育教學、科學研究、師資隊伍建設、黨團建設、學生工作5個大方面覆蓋的所有基本數據。例如教育教學包括教務任務、課程設計、畢業設計、教學競賽、教改項目、教學獲獎、大學生科研訓練、教育實習基地、“互聯網+”大賽等相關數據。教工信息管理是指教工對自己基本信息的維護,包括工作經歷、職稱變動、部門調動、崗位聘任結果、個人榮譽、密碼修改等操作。指標管理實現對指標的增、刪、改、查。指標是考核的一個觀測點,分為一級指標、二級指標和三級指標。例如“英語四級通過率”是一個三級指標,屬于“教學質量”這個二級指標,對應的一級指標是“教育教學”。報表管理實現對目標任務下達情況、按指標按部門實現指標完成情況、年度考核結果等數據實現導出顯示。信息查詢主要針對各二級學院領導查看本單位目標任務完成情況。職能部門領導按照分管的一級指標查看二級學院的完成情況。校領導按照各種組合條件(以學院、工號、學位、職稱、聘任崗位、指標等)查看任務完成情況。系統維護實現數據庫的備份與還原、系統公告的發布、權限角色信息的管理、相關參數的配置等。
3.2.1 利用泛型DAO+Hibernate實現持久層
持久層的功能是利用Hibernate框架完成關系數據與對象的轉換,以面向對象方式訪問關系數據庫。主要是通過XML形式的映射文件或在POJO形式的實體類中添加注解,實現對象屬性與對應表的字段、對象之間的依賴關系與對應數據表之間的主、外鍵約束之間進行映射[14]。具體實現包括兩個核心步驟:第一,創建泛型DAO接口及其實現類。由于每個實體類的持久化操作都具有相似的代碼,為了提高代碼的復用率,定義一個泛型的DAO接口-BaseDAO,其中定義所有持久化對象基本的CRUD方法[15]。BaseHibernateDAO為BaseDAO的實現類,該類繼承HibernateDaoSupport實現BaseDAO中的所有方法。HibernateDaoSupport是Spring支持Hibernate的DAO工具,通過其關聯的HibernateTemplate模板類可以在無需打開或關閉Session對象的情況下,實現數據庫的CRUD操作,提高了持久層的開發效率。第二,創建并配置每個實體類對應的DAO接口及其實現類。某個實體類的DAO接口繼承BaseDAO接口,只需定義該實體類特有的持久化方法,實現類繼承BaseHibernateDAO完成特有的持久化方法,最后利用@Repository注解將DAO在Spring IOC容器中進行配置。上述操作需要的類圖如圖2所示。

圖2 持久層類圖關系
3.2.2 利用Spring IOC+AOP實現業務層
業務層完成系統的核心邏輯,包括兩類:與業務計算相關的邏輯和與業務計算正交的公共邏輯(例如日志、權限等)。對于業務計算邏輯采用接口分離原則進行設計,首先定義Service邏輯接口定義組件的業務功能,作為控制層Controller組件的調用入口;定義ServiceImp提供該組件的實現并依賴持久層的若干DAO 組件獲取業務計算需要的持久化數據,DAO 對象由Spring IOC創建并注入。然后通過@Service注解將Service組件納入Spring IOC容器管理。最后通過聲明式注解為業務邏輯方法添加事務控制。啟用聲明式事務需要在Spring配置文件中添加如下代碼:
針對與業務計算正交的公共邏輯采用AOP方式實現。將每個公共邏輯作為一個切面而定義,對于需要公共邏輯的業務邏輯采用正交織入的方式執行,這樣便于公共邏輯的修改與維護,節省代碼量。目標考核系統中的登錄驗證、權限驗證、日志記錄等操作都采用AOP的方式來實現,以權限驗證為例進行說明。首先,在基于角色的訪問控制(role-based access control,RBAC)理論[16]基礎上定義教師賬戶類、部門賬戶類、角色類、權限類。系統所設計的登錄帳戶包括教師賬戶和部門賬戶兩種類型,教師賬戶對應教師角色具有教師信息管理模塊的所有權限;部門賬戶對應教師以外的相應角色,具有教師信息管理模塊以外的其它相應權限。這樣設計的優點有兩個:(1)減少了教師賬戶的角色數量,從而也就減少了教師賬戶的權限數,便于操作與管理;(2)部門賬戶不再和某個具體的教師關聯,同一部門里的任何一個教工只要知道部門賬戶,就可以執行相關的功能,便于考核工作的開展。然后,通過實現HandlerInterceptor接口定義攔截器,重寫preHandle方法,該方法在執行Controller之前執行。具體的權限驗證流程如圖3所示,對應的代碼如下所示:

圖3 preHandle方法執行流程圖
public class PermissionInterceptor implements HandlerInterceptor
{ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
User user=(User)request.getSession().getAttribute("user");
String currentURL=getURL(request);
if (user == null) {
if("user/userController_login".startsWith(currentURL))
return true;
else {
response.sendRedirect("login.jsp");
return false;
} }
// 用戶登錄后判斷權限
else {
//對退出操作對應的Controller進行放行 if("user/userController_loginOut".startsWith(currentURL))
return true;
else {
if(user instanceof UserVO) {
UserVO loginedUser=(UserVO)user;
if (loginedUser.hasPermission(currentURL)) {
//用戶擁有權限就放行
return true;
} else {
//如果沒有權限就攔截
response.sendRedirect("noPermission.jsp");
return false; } }
else {
// 如果當前登錄用戶是部門賬戶,則判斷
部門賬戶的權限,判斷邏輯同上。
………………….
}
}}
3.2.3 利用Spring MVC實現控制層
控制層充當MVC模式中的控制器,負責接收表示層數據交由業務層進行數據處理,根據請求結果調用對應的視圖數據進行響應。具體實現過程包括以下步驟:首先在web.xml文件中配置前端控制器,由Web容器在啟動時創建前端控制器實例,它負責給Controller分派表示層請求,并執行視圖解析。然后定義spring-mvc.xml文件,完成注解掃描、處理器映射器、處理器適配器、視圖解析器的配置。注解可以簡化XML的配置,處理器映射器和處理器適配器負責映射前端控制器轉發給controller的映射策略。視圖解析器負責解析Controller返回的ModelAndView組件,形成特定形式的視圖組件。執行順序如圖4所示[17]。最后創建Controller組件調用業務層組件。本系統采用無侵入式定義,將控制器當作普通的JavaBean,通過@Controller對控制器進行標注,在相關方法上標注@RequestMapping并注明訪問該方法的URL后綴。

圖4 Spring MVC執行流程
3.2.4 利用Easy UI+JSP實現表示層
表示層為用戶提供交互操作并展示Web應用的界面。為提高用戶交互體驗,便于模塊化開發,本架構以Easy UI+JSP作為表示層開發的核心組件。首先,在JSP頁面引入Easy UI核心JS文件和CSS文件,包括jquery.min.js、jquery.easyui.min.js、中文提示信息庫、核心UI文件和圖標文件等。然后,根據模塊功能定義獨立的JS文件,在該文件定義定義各種EasyUI函數,這樣可以分離HTML與JavaScript代碼,便于開發與維護。以招生就業處管理員給各二級學院下達綜合指標目標任務的頁面為例,如圖5所示。左側通過樹形控件顯示當前登錄用戶的權限菜單,右側主要通過加載Datagrid控件以二維表格形式顯示各二級學院對應招生就業工作三級指標的任務分值、年份以及審核狀態。表格中的數據是在用戶點擊相應權限菜單后,利用Ajax請求異步訪問Web服務器獲取的,并且在返回表示層前,控制層通過jackson序列化Java對象為標準JSON格式。為了提高用戶的可操行,設置Datagrid單元格為可編輯性,在一個頁面中即可完成對各二級學院按三級指標下達任務數據,點擊“保存”按鈕將數據傳送到服務器端保存。按鈕觸法事件對應的JavaScript代碼如下所示。

圖5 目標任務下達頁面
function accept(){
var ids=""; //修改行的指標:指標值
var index = editIndex;
if (endEditing()){
(' dg').datagrid('acceptChanges').datagrid('unselectAll');} //表字段取出放入數組中
var data = (" dg").datagrid('getData');
for(var item in data.rows[index]){
if(item!="ejxy" && item!="status" && item!="year"){
ids+=item+":"+data.rows[index][item]+",";
}}
.post("assignTask_StudentPartyWork_update",{"ids":ids},function(data){
if(data!=null){
(" dg").datagrid('reload','assignTask_StudentPartyWork_viewJson');
}
},'json');}
在對Easy UI、Spring MVC、Spring和Hibernate框架分析的基礎上,提出基于ESMSH框架的Java EE應用架構。將該架構應用到目標考核管理系統的開發實踐中,闡述了架構實現的核心技術。以ESMSH架構所實現的目標考核管理系統已在咸陽師范學院各職能部門、二級學院和全體教師之間展開運行,已順利完成了2016、2017年度的目標考核工作,全面提升了學校目標考核工作的信息化水平,取得了較好的滿意度,表明本文所提出的Java EE架構穩定、可靠。下一步準備在該架構基礎上引入微服務思想,細化基礎數據部分,并為學校的其他業務工作服務。