国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種基于ES2SH框架的Java EE應用架構(gòu)

2018-11-16 09:11歐陽宏基宋笑雪
實驗室研究與探索 2018年10期
關鍵詞:表示層配置文件架構(gòu)

歐陽宏基, 李 紅,2, 宋笑雪

(1. 咸陽師范學院 計算機學院, 陜西 咸陽 712000; 2. 西安電子科技大學 智能感知與圖像理解教育部重點實驗室, 西安 710071)

0 引 言

基于框架的軟件復用是目前應用系統(tǒng)開發(fā)所采用的主流技術,框架提供了良好的基礎結(jié)構(gòu),只要按照框架的約定進行“填充式”開發(fā)即可獲得穩(wěn)定性高、擴展性強的軟件成品[1-2]。傳統(tǒng)Java EE應用以企業(yè)級(Enterprise JavaBean,EJB)框架為主進行構(gòu)建,具有依賴性高、開發(fā)難度大、交互體驗差、部署復雜、難于維護等缺點[3-4]。針對這些問題,開源的輕量級框架應用而生,其中以Struts、Spring、Hibernate、Mybatis等最具代表性。輕量級框架具有無侵入式、應用編程接口(Application Programming Interface,API)易于使用、配置簡單、開源等優(yōu)點,允許使用框架的部分技術進行系統(tǒng)局部功能開發(fā);同時不同框架之間允許集成,可充分發(fā)揮每種框架的優(yōu)勢而完成系統(tǒng)整體功能的開發(fā)。

本文研究了目前主流的Easy UI、Struts2、Spring、Hibernate等框架。在分析它們各自優(yōu)點的基礎上,提出基于ES2SH框架的Java EE應用架構(gòu)。該架構(gòu)利用Easy UI創(chuàng)建表示層,Struts2創(chuàng)建控制層,采用JavaScript對象標記(JavaScript Object Notation ,JSON)[5]作為表示層與控制層之間傳輸數(shù)據(jù)的格式。利用Hibernate創(chuàng)建數(shù)據(jù)持久層,通過Spring管理控制層與業(yè)務層、業(yè)務層與持久層之間組件的依賴關系,采用可擴展標記語言(eXtensible Markup Language,XML)文件+注解的方式進行Struts2、Spring和Hibernate的集成。將該架構(gòu)應用到高等院校目標考核管理系統(tǒng)的設計與實施中,詳細描述了該架構(gòu)應用的關鍵技術,為Java EE應用的開發(fā)提供了一定的參考價值。

1 相關技術

Easy UI是支持超文本標記語言(HyperText Markup Language,HTML)5標準的JavaScript框架,提供了豐富的用戶接口(User Interface,UI)組件支持Web應用的富客戶端效果,支持異步的 JavaScript 和 XML (Asynchronous JavaScript and XML,Ajax)請求與響應,兼容JSON格式的數(shù)據(jù)傳輸,具有良好的瀏覽器兼容性、開源、體積小、易于掌握等優(yōu)點[6]。Struts2是 Web開發(fā)框架,它利用核心控制器StrutsPrepareAndExecutorFilter和配置文件,完成了視圖、Action控制器和模型之間的分離[7-8]。Spring 是一個基于控制反轉(zhuǎn)(Inversion of Control,IOC)容器和面向方面編程(Aspect Oriented Programming,AOP)編程的輕量級框架。其中,IOC容器是一個Bean工廠,用來創(chuàng)建對象并管理對象之間的依賴關系[9];AOP能夠?qū)⑾到y(tǒng)業(yè)務邏輯與公共服務模塊相分離,以橫切關注點集中管理公共服務模塊[10],在系統(tǒng)運行時通過動態(tài)代理以正交方式織入業(yè)務邏輯。Hibernate是對Java數(shù)據(jù)庫連接(Java DataBase Connectivity,JDBC)的輕量級封裝,能夠完成實體對象與數(shù)據(jù)庫表、對象屬性與表字段、對象關聯(lián)與表關聯(lián)之間的轉(zhuǎn)換。同時提供了功能強大的Hibernate查詢語言(Hibernate Query Language,HQL),允許開發(fā)人員以面向?qū)ο蠓绞讲僮麝P系型數(shù)據(jù)庫[11-12]。注解是Java的一種元數(shù)據(jù),它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,主要用來生成文檔、跟蹤代碼的依賴性從而代替配置文件、編譯時語法檢查等[13]。

2 ES2SH架構(gòu)

2.1 ES2SH架構(gòu)模型

根據(jù)分層模型,基于上述框架建立滿足模型視圖控制器(Model View Controller,MVC)模式[14]的5層Java EE應用架構(gòu)模型,如圖1所示。表示層由Easy UI、Java服務器端頁面(Java Server Page,JSP)和Struts2標簽組成,通過表示層發(fā)送的請求統(tǒng)一由控制層的核心控制器接收,核心控制器根據(jù)配置文件將請求轉(zhuǎn)發(fā)到某個具體的Action組件。Action得到業(yè)務邏輯層的執(zhí)行結(jié)果后,將要呈現(xiàn)給表示層的數(shù)據(jù)封裝成JSON格式,通知核心過濾器調(diào)用視圖響應用戶請求。業(yè)務邏輯層通過Service接口向Action組件提供服務,具體的業(yè)務邏輯處理和計算由Service對象完成,Service對象由Spring IOC容器管理。業(yè)務邏輯運算過程中需要的持久化數(shù)據(jù)通過持久層獲取。數(shù)據(jù)持久層由數(shù)據(jù)訪問對象(Data Access Object,DAO)模式與Hibernate框架搭建,DAO接口定義持久化邏輯并作為業(yè)務邏輯層訪問的入口,DAO對象封裝Hibernate通過映射文件完成持久化對象(Persistent Object,PO)與數(shù)據(jù)存儲層之間的交互,DAO對象由Spring IOC容器管理。數(shù)據(jù)存儲層負責存儲應用系統(tǒng)所需要長久保存的數(shù)據(jù)以及之間的關聯(lián)關系,通過觸發(fā)器和存儲過程完成相關的匯總、統(tǒng)計計算。

圖1 S2SH框架分層架構(gòu)

從圖1可以看出,ES2SH架構(gòu)很好實現(xiàn)了各層的解耦合,層與層之間通過接口進行方法的調(diào)用,使得上層的實現(xiàn)不依賴于下層的變化而變化,很好地滿足了面向?qū)ο笤O計的“開-閉”原則。同時,相鄰層之間能直接“通信”,間接層之間不能直接“通信”,很好地滿足了面向?qū)ο笤O計的“迪米特法則”。

2.2 ES2SH框架的集成

ES2SH框架的集成主要是Struts2、Spring和Hibernate這三者之間的集成。具體集成思路是:以Spring為核心,向下整合Hibernate完成數(shù)據(jù)持久化操作;向上整合Struts2完成控制邏輯,分離數(shù)據(jù)顯示與業(yè)務處理。本文采用XML配置文件+注解的方式進行框架整合和系統(tǒng)開發(fā),其中基礎配置部分采用XML文件,包括Struts2、Spring、Hibernate的核心配置文件以及持久化類的映射文件。開發(fā)部分中的依賴關系采用注解,依賴關系體現(xiàn)在業(yè)務邏輯層對持久層的依賴、控制層對業(yè)務邏輯層的依賴。

2.2.1Spring與Hibernate整合

首先,定義Hibernate配置文件-Hibernate.config.xml。然后,在Spring配置文件中定義SessionFactory,在SessionFactory中配置數(shù)據(jù)庫連接池,可以實現(xiàn)數(shù)據(jù)庫連接對象的復用,提高訪問效率。同時,把Hibernate.config.xml文件注入給Spring,通過LocalSessionFactory的configLocation屬性用來讀取Hibernate配置文件。在Spring配置文件中定義事務管理器,由Spring控制Hibernate的事務。持久化邏輯中不用考慮事務相關的代碼,提高了開發(fā)效率。最后,在Spring配置文件中定義注解掃描,進行此項配置后,在應用開發(fā)部分就可采用注解方式進行整合。

2.2.2Spring與Struts2整合

Spring與Struts2框架集成有3種方案[15-16],本文采用將Struts2的Action組件納入Spring IOC容器管理的方法進行集成。因為該方法充分利用了IOC依賴注入的原理,通過IOC容器獲取Action組件,避免了Struts2 API與Spring API的緊密耦合。這兩者框架的整合不需要在Spring配置文件中進行配置,只需導入Struts2框架提供支持Spring 的插件包,并在Action類中加入@Controller和@Scope注解即可。

2.2.3使用的注解

開發(fā)部分用到的注解如表1所示,使用注解后,不用在 XML配置文件中顯式使用 進行Bean 的配置。Spring 在容器初始化時將自動掃描 base-package 指定的包及其子包下的所有 class文件,加了注解的類都納入IOC容器管理。

3 ES2SH架構(gòu)在目標考核管理系統(tǒng)中的應用

3.1 目標考核系統(tǒng)簡介

根據(jù)上述ES2SH框架的Java EE架構(gòu)和整合方法,設計并實現(xiàn)了咸陽師范學院目標考核管理系統(tǒng)。目標考核系統(tǒng)是采用計算機與網(wǎng)絡技術所實現(xiàn)的目標考核工作的管理信息系統(tǒng)。該系統(tǒng)的主要功能是:學校相關職能部門在發(fā)展規(guī)劃處的領導下,按年度、分指標對二級學院下達目標責任;二級學院教學秘書、各教師、輔導員等在自然年度內(nèi)按指標要求,錄入相關任務完成的具體信息;各職能部門在對錄入的信息審核后,根據(jù)指標分值和完成情況計算各二級學院的得分情況,根據(jù)得分高低來判斷各二級學院本年度任務完成的情況,為本年度的獎懲和來年目標任務的下達提供一定的參考。通過該系統(tǒng)體現(xiàn)了目標考核工作的公平、客觀、公開、反饋、嚴格、獎懲等原則,對全校教職工的工作具有良好的引導和激勵作用,促進了各項指標的如期實現(xiàn)。系統(tǒng)角色包括教師、各二級學院管理員、二級學院院長、各職能部門管理員、各職能部門領導、校領導和系統(tǒng)管理員。功能模塊如圖2所示。

表1 用到的注解

圖2 目標考核系統(tǒng)功能模塊

3.2 領域模型設計

領域模型設計主要是從面向?qū)ο蠼嵌龋鶕?jù)需求分析提取出系統(tǒng)的實體類、實體類之間的關系、業(yè)務對象和值對象。Hibernate會根據(jù)映射文件將實體類及其關系自動生成數(shù)據(jù)庫表,因此領域模型設計不再以傳統(tǒng)數(shù)據(jù)庫E-R設計為主。業(yè)務對象和值對象與數(shù)據(jù)庫無關,前者負責業(yè)務計算,后者負責在持久層與業(yè)務層、控制層與表示層之間傳遞數(shù)據(jù)。值對象中的屬性可能是某個或幾個實體類屬性的子集,這取決于業(yè)務層計算和表示層數(shù)據(jù)顯示的需要。 本系統(tǒng)設計的實體類一共有52個,分別表示用戶、職能部門賬戶、角色、權限、教材、專著、科研項目、科研論文、科研獎勵、部門、崗位、課程、班級、綜合指標、業(yè)績指標、指標下達、指標完成和指標得分等。鑒于篇幅限制,以指標管理模塊的綜合指標為例,實體類及其聯(lián)系如圖3所示。IndexLevelOne表示1級指標,IndexLevelTwo表示2級指標,IndexLevelThree表示3級指標。1級與2級指標之間是一對多關系,2級與3級指標是一對多關系。AssignTask表示目標任務,由各職能部門給各二級學院下達目標任務時使用。TaskDetail表示目標任務完成的具體信息,由各二級學院教學秘書和教師角色按照3級指標提交任務完成信息時使用。TaskSubtotal表示審核通過的任務信息,審核通過后計算對應3級指標的實際得分和超額得分,供按2級指標和1級指標統(tǒng)計某個學院得分時使用。

圖3 綜合指標實體類關系

3.3 數(shù)據(jù)持久層設計

數(shù)據(jù)持久層負責實體類與數(shù)據(jù)表之間的映射,設計思路是為每個實體類定義對應的DAO接口和DAO實現(xiàn)類[17],DAO接口中封裝該實體類的持久化邏輯并作為業(yè)務邏輯層的訪問入口,DAO實現(xiàn)類封裝Hibernate API具體實現(xiàn)持久化邏輯。通過DAO模式向業(yè)務邏輯層屏蔽數(shù)據(jù)持久化的細節(jié),實現(xiàn)兩者之間的解耦合。

由于每個實體類都具有保存、刪除、修改、按id查找、查找全部等共性持久化邏輯,為了將這些共性操作合并,同時減少持久化代碼的冗余度,設計了圖4所示的持久層邏輯結(jié)構(gòu)。其中BaseDao是采用泛型技術設

圖4 持久層邏輯結(jié)構(gòu)

計的所有DAO的父接口,其中封裝了所有實體類共有的持久化方法。泛型類BaseDaoImp是BaseDao的實現(xiàn)類,通過關聯(lián)的SessionFactory對象來獲取Hibernate的Session對象實現(xiàn)相關的持久化邏輯;在框架集成階段已經(jīng)將SessionFactory對象配置好了,所以通過@Resource注解表明從IOC容器獲取SessionFactory。具體DAO接口從BaseDao繼承,具體DAO接口的實現(xiàn)類繼承BaseDaoImp并添加@Repository注解。BaseDaoImp的部分核心代碼如下所示:

@Transactional

public abstract class BaseDaoImp implements BaseDao {

@Resource

private SessionFactory sessionFactory;

private Class clazz;

public DaoSupportImp()

{ // 使用反射得到T的真實類型

ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();

// 獲取第一個類型參數(shù)的真實類型

this.clazz = (Class) pt.getActualTypeArguments()[0]; }

// 獲取當前可用的Session

protected Session getSession() {

return sessionFactory.getCurrentSession();

}

//所有實體類的共性保存方法

public void save(T entity) {

getSession().save(entity);

}

….}

3.4 業(yè)務層設計

業(yè)務層完成系統(tǒng)核心業(yè)務邏輯,通過Service接口向控制層提供調(diào)用接口,Service接口實現(xiàn)類依賴業(yè)務對象完成業(yè)務處理與數(shù)據(jù)計算,調(diào)用持久層的DAO接口完成業(yè)務邏輯中需要持久化的部分[18],如圖5所示。

圖5 業(yè)務層類圖關系

以下是目標考核分值計算Service實現(xiàn)類的部分源碼,其中業(yè)務方法computeExcessByIndexOne是獲得某年某學院某個綜合1級指標的超額得分。該方法通過@Resource注解從IOC容器獲取所依賴的相關Service對象、DAO對象和業(yè)務對象(Business Object,BO),根據(jù)得到的1級指標完成得分和下達的目標任務得分,通過summaryProcessBO對象得到超額得分,并返回供控制層使用的值對象(Value Object,VO)。@Service注解表明該類對象是業(yè)務層對象,由Spring IOC容器管理。@Transactional注解表明該類中的方法啟用事務操作。

@Transactional

@Service("summaryProcessService")

public class SummaryProcessServiceImp implements SummaryProcessService {

// 綜合指標計算Service

@Resource

private TaskSubtotalService taskSubtotalService;

// 下達的目標任務Service

@Resource

private AssignTaskService assignTaskService;

//綜合一級指標Service

@Resource

private IndexLevelOneService indexLevelOneService;

//綜合一級指標Dao

@Resource

private IndexLevelOneDao levelOneDao;

//目標考核分值計算Dao

@Resource

private SummaryProcessDao summaryProcessDao;

//目標考核分值計算BO

@Resource

private SummaryProcessBO summaryProcessBO;

………………

public List com-pute-ExcessByIndexOne(int year,long deptId, long oneId)

{

// 綜合指標得分

float synthesizeScore;

// 超額得分

float excessScore;

List listVo = new ArrayList< TaskSubtotalByIndexOneVO>();

// 查找某院系某年某個一級指標的得分

TaskSubtotalByIndexOneVO oneVO = taskSubtotalService.getSubtotalByYearDeptOneId(year, deptId, oneId);

// 某年某學院某個一級指標的得分

synthesizeScore = oneVO.getScore();

//獲取某年某學院某個一級指標的任務下達分

float assignScore = assignTaskService.get-AssignTask-ScoreByAcceptDeptIndexOne(year, deptId, oneId);

//通過BO對象計算超額得分, 并修正綜合指標得分存放到listVO中

excessScore=summaryProcessBO.getExcessScore(synthesizeScore, assignScore);

TaskSubtotalByIndexOneVO vo = new TaskSubtotal-ByIndexOneVO();

vo.setIndexOneId(oneId);

vo.setIndexOneName(oneVO.getIndexOneName());

vo.setDepartmentName(oneVO.getDepartmentName());

vo.setScore(excessScore);

listVo.add(vo);

return listVo;

}

3.5 控制層設計

控制層接收表示層的請求和數(shù)據(jù),依據(jù)Struts2配置文件調(diào)用相關Action處理請求。所以配置文件和Action組件是該層設計的重點。本文將配置文件分為兩種:核心配置文件(struts.xml)和各模塊對應的配置文件。首先,引入struts2-json-plugin.jar包,在struts.xml中定義抽象package繼承json-default,支持Action返回JSON格式數(shù)據(jù)到表示層,其他配置文件的package繼承當前package。然后,在該package中配置自定義攔截器棧、默認Action、全局Result并引入各模塊對應的配置文件。在自定義攔截器棧中新增4個攔截器,分別是權限驗證攔截器、Session失效攔截器、日志記錄攔截器和異常攔截器。最后,在其他配置文件中定義相關Action和表示層的映射關系。

由于每個模塊在控制層都具備一些共同的操作,為了節(jié)省代碼量,設計了如圖6所示的Action組件類圖。其中,BaseAction是每個模塊對應Action的直接父類,它繼承ActionSupport類,使當前Action具備數(shù)據(jù)校驗、序列化、國際化和默認處理用戶請求等功能,從而簡化Action的開發(fā)。通過泛型ModelDriven接口獲取表示層傳遞過來的數(shù)據(jù),利用ModelDrivenInterceptor攔截器將這些參數(shù)封裝成實體對象(屬性Model表示)并壓入ValueStack,便于Action調(diào)用。pageSize和pageNum用來表示分頁操作的頁數(shù)和頁碼。通過@Resource注解定義所有業(yè)務層對應的Service接口。在構(gòu)造方法中通過反射獲取屬性Model對應的真實類型。具體某個模塊對應的Action繼承BaseAction后,加入@Controller和@Scope("protoType")注解并定義供表示層調(diào)用相關的方法。

圖6 Action組件類圖關系

3.6 表示層設計

表示層與用戶進行數(shù)據(jù)交互,接收用戶請求并響應。本系統(tǒng)中表示層主要由Struts 標簽、JSP頁面、Div、層疊樣式表(Cascading Style Sheets,CSS) 和Easy UI構(gòu)成,通過VO對象由表示層向控制層傳遞請求數(shù)據(jù),采用JSON由控制層向表示層傳遞響應數(shù)據(jù)。這樣做避免了顯示邏輯與控制層Java代碼的耦合,增強了表示層的重用性,提高了用戶體驗,便于后期測試和維護。以發(fā)展規(guī)劃處管理員角色進入系統(tǒng)后所呈現(xiàn)的主頁面為例,詳細說明表示層的實現(xiàn),如圖7所示。

首先,創(chuàng)建JSP頁面通過taglib指令引入Struts2標簽庫,通過Script標簽引入Easy UI對應的JS文件。然后,利用CSS+Div進行頁面布局,通過Easy UI標簽提供數(shù)據(jù)的輸入和顯示。最后,創(chuàng)建JS文件完成對應Easy UI控件的編程,并以Ajax方式發(fā)送請求到控制層的Action。圖7左側(cè)是利用Div創(chuàng)建的用于顯示登錄用戶權限的菜單,通過Struts2的〈s:iterator〉、〈s: property〉、〈s:if〉和〈s:else〉等標簽動態(tài)的讀取存放在Session中的用戶權限信息,點擊對應的權限后通過自定義的addPanel函數(shù)在主框架中添加一個頁面,該面板中利用Easy UI的datagrid控件顯示從控件層返回的JSON數(shù)據(jù),流程如圖8所示。顯示效果如圖7右側(cè)部分,通過Ajax請求方式,實現(xiàn)了頁面的局部刷新,提高了用戶瀏覽體驗。

圖7 發(fā)展規(guī)劃處管理員角色主頁面

圖8 Ajax方式發(fā)送請求的流程

4 結(jié) 語

本文對Easy UI、Struts2、Spring和Hibernate框架進行分析的基礎上,提出了基于ES2SH框架的Java EE應用架構(gòu)。以Spring為“橋梁”實現(xiàn)了架構(gòu)的集成,詳細描述了集成的原理和實現(xiàn)過程。將ES2SH架構(gòu)應用于某學院目標考核管理系統(tǒng)的開發(fā)實踐中,給出了各層的設計思想與核心代碼。目前該系統(tǒng)已在學校各職能部門、二級學院和全體教師之間展開運行,全面提升了學校目標考核工作的信息化水平,取得了較好的滿意度,表明本文所提出的Java EE架構(gòu)切實有效。

猜你喜歡
表示層配置文件架構(gòu)
基于FPGA的RNN硬件加速架構(gòu)
功能架構(gòu)在電子電氣架構(gòu)開發(fā)中的應用和實踐
互不干涉混用Chromium Edge
基于Spring的企業(yè)級Web項目架構(gòu)設計研究
基于Zookeeper的配置管理中心設計與實現(xiàn)
忘記ESXi主機root密碼怎么辦
為View桌面準備父虛擬機
WebGIS架構(gòu)下的地理信息系統(tǒng)構(gòu)建研究
ASP.NET三層構(gòu)架解析
基于SSH框架科研管理系統(tǒng)的設計
乌拉特中旗| 定陶县| 菏泽市| 宾阳县| 万安县| 井陉县| 佛山市| 普兰店市| 巴林右旗| 聂拉木县| 平原县| 罗城| 颍上县| 隆子县| 开原市| 桐梓县| 韩城市| 奇台县| 沙雅县| 石景山区| 五常市| 榆树市| 南开区| 汶川县| 徐闻县| 闻喜县| 大埔区| 广丰县| 石泉县| 安化县| 辉南县| 钟祥市| 皋兰县| 樟树市| 巧家县| 高阳县| 公主岭市| 班戈县| 墨脱县| 马龙县| 儋州市|