999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種基于ES2SH框架的Java EE應用架構

2018-11-16 09:11:32歐陽宏基宋笑雪
實驗室研究與探索 2018年10期

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

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

0 引 言

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

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

1 相關技術

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

2 ES2SH架構

2.1 ES2SH架構模型

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

圖1 S2SH框架分層架構

從圖1可以看出,ES2SH架構很好實現了各層的解耦合,層與層之間通過接口進行方法的調用,使得上層的實現不依賴于下層的變化而變化,很好地滿足了面向對象設計的“開-閉”原則。同時,相鄰層之間能直接“通信”,間接層之間不能直接“通信”,很好地滿足了面向對象設計的“迪米特法則”。

2.2 ES2SH框架的集成

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

2.2.1Spring與Hibernate整合

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

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使用的注解

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

3 ES2SH架構在目標考核管理系統中的應用

3.1 目標考核系統簡介

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

表1 用到的注解

圖2 目標考核系統功能模塊

3.2 領域模型設計

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

圖3 綜合指標實體類關系

3.3 數據持久層設計

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

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

圖4 持久層邏輯結構

計的所有DAO的父接口,其中封裝了所有實體類共有的持久化方法。泛型類BaseDaoImp是BaseDao的實現類,通過關聯的SessionFactory對象來獲取Hibernate的Session對象實現相關的持久化邏輯;在框架集成階段已經將SessionFactory對象配置好了,所以通過@Resource注解表明從IOC容器獲取SessionFactory。具體DAO接口從BaseDao繼承,具體DAO接口的實現類繼承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();

// 獲取第一個類型參數的真實類型

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

// 獲取當前可用的Session

protected Session getSession() {

return sessionFactory.getCurrentSession();

}

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

public void save(T entity) {

getSession().save(entity);

}

….}

3.4 業務層設計

業務層完成系統核心業務邏輯,通過Service接口向控制層提供調用接口,Service接口實現類依賴業務對象完成業務處理與數據計算,調用持久層的DAO接口完成業務邏輯中需要持久化的部分[18],如圖5所示。

圖5 業務層類圖關系

以下是目標考核分值計算Service實現類的部分源碼,其中業務方法computeExcessByIndexOne是獲得某年某學院某個綜合1級指標的超額得分。該方法通過@Resource注解從IOC容器獲取所依賴的相關Service對象、DAO對象和業務對象(Business Object,BO),根據得到的1級指標完成得分和下達的目標任務得分,通過summaryProcessBO對象得到超額得分,并返回供控制層使用的值對象(Value Object,VO)。@Service注解表明該類對象是業務層對象,由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 控制層設計

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

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

圖6 Action組件類圖關系

3.6 表示層設計

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

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

圖7 發展規劃處管理員角色主頁面

圖8 Ajax方式發送請求的流程

4 結 語

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

主站蜘蛛池模板: 亚洲国产成人无码AV在线影院L| 亚洲无线视频| 538精品在线观看| 国产欧美日韩资源在线观看| 久久99国产乱子伦精品免| 亚洲综合色婷婷| 无码精品福利一区二区三区| 97se亚洲| 国产96在线 | 六月婷婷精品视频在线观看 | 免费国产高清视频| 欧美福利在线观看| 91亚洲精品国产自在现线| 91精品国产福利| 国产精品爽爽va在线无码观看 | 午夜老司机永久免费看片| 成人福利一区二区视频在线| 国产浮力第一页永久地址| 天天视频在线91频| 亚洲中文字幕在线观看| 精品国产成人高清在线| 午夜啪啪福利| 成人蜜桃网| 蜜臀AV在线播放| 欧美精品三级在线| 永久免费无码成人网站| 国产视频欧美| 国产原创自拍不卡第一页| 一本大道无码日韩精品影视| 亚洲中文字幕日产无码2021| 日韩美一区二区| 2021无码专区人妻系列日韩| 午夜国产在线观看| 午夜视频日本| 人妻熟妇日韩AV在线播放| 日本人妻一区二区三区不卡影院| 国产精品99久久久久久董美香| 欧美黄色a| 热久久这里是精品6免费观看| 国产成人精品高清在线| 日本道综合一本久久久88| 亚洲电影天堂在线国语对白| 91毛片网| 99爱视频精品免视看| 手机在线国产精品| 亚洲成a人在线观看| 2021亚洲精品不卡a| 伊人大杳蕉中文无码| 99re经典视频在线| 亚洲av无码牛牛影视在线二区| 日韩乱码免费一区二区三区| 99福利视频导航| 亚洲最大看欧美片网站地址| 欧美第九页| 国产又粗又猛又爽| 九九免费观看全部免费视频| 伊伊人成亚洲综合人网7777| 亚洲国产系列| 国产网友愉拍精品视频| 高清乱码精品福利在线视频| 亚洲欧美日韩久久精品| 伊人91在线| 一级毛片免费不卡在线| 91成人在线免费视频| 2020国产精品视频| 欧美怡红院视频一区二区三区| 国产精品久久自在自线观看| 少妇精品网站| 青青青伊人色综合久久| 91国内视频在线观看| 国产精品三级av及在线观看| 国产导航在线| 欧美激情一区二区三区成人| 国产激情第一页| 毛片大全免费观看| jizz国产视频| 嫩草国产在线| 国产免费黄| 欧美亚洲另类在线观看| 中字无码av在线电影| 成人午夜视频免费看欧美| 亚洲天堂高清|