歐陽宏基,于博,葛萌
(1.咸陽師范學(xué)院計算機學(xué)院,咸陽712000;2.河南建筑職業(yè)技術(shù)學(xué)院信息工程系,鄭州450064)
基于JFinal框架的Java EE應(yīng)用研究*
歐陽宏基1,于博2,葛萌1
(1.咸陽師范學(xué)院計算機學(xué)院,咸陽712000;2.河南建筑職業(yè)技術(shù)學(xué)院信息工程系,鄭州450064)
基于S2SH框架的Java EE應(yīng)用存在著配置繁瑣、編碼工作量大、體積龐大、對第三方j(luò)ar依賴較多等問題,為此,提出一種基于JFinal框架的Java EE開發(fā)方法。首先對JFinal框架的體系結(jié)構(gòu)和執(zhí)行流程進行了詳細描述。然后,結(jié)合部分示例代碼從模型、視圖、控制器三個方面給出了JFinal框架的具體實現(xiàn)過程。最后,將Final框架與S2SH框架進行了全方位對比分析。結(jié)果表明:基于JFinal框架的Java EE開發(fā)方法能夠極大的提高開發(fā)效率,同時具有良好的穩(wěn)定性和擴展性。
JFinal框架;S2SH框架;Java EE應(yīng)用;極速開發(fā);MVC模式
隨著Java技術(shù)與互聯(lián)網(wǎng)的快速發(fā)展,Java EE應(yīng)用經(jīng)歷了從JSP+Servlet+JavaBean[1]的開發(fā)方案到以MVC設(shè)計模[2]+框架的開發(fā)方案的轉(zhuǎn)變,前者適合于小型規(guī)模的Java Web應(yīng)用,后者適合于大型企業(yè)級應(yīng)用。在以框架為基礎(chǔ)的開發(fā)方案中,以Struts、Spring、Hibernate、Mybatis等框架應(yīng)用最具代表性,目前的主要研究集中在分析框架的構(gòu)成、通過框架之間的集成進行系統(tǒng)開發(fā)、測試并驗證框架的性能等方面[3]。
文獻[4]提出一種基于Struts1與Hibernate框架集成的開發(fā)方案,主要是通過Struts1實現(xiàn)控制邏輯,在Action組件中通過DAO模式調(diào)用Hibernate API來訪問數(shù)據(jù)庫,從而解決了系統(tǒng)耦合度高、JDBC訪問數(shù)據(jù)庫復(fù)雜等問題。文獻[5]提出一種基于SSH(Struts+Spring+Hibernate)框架的Web開發(fā)方法,并應(yīng)用到EPON性能監(jiān)控管理系統(tǒng)的開發(fā)中,通過實驗測試證明了該方法的可靠性和穩(wěn)定性。文獻[6]提出整合Spring與Ibatis框架的Web開發(fā)方案,并應(yīng)用到信用卡業(yè)務(wù)系統(tǒng)的開發(fā)中,證明了該方案的穩(wěn)定性和維護性。雖然上述基于各種框架的Java Web開發(fā)方案都具有很好的穩(wěn)定性和擴展性等,但是都存在著兩個方面的缺點:①每個框架都只在某個方面具有優(yōu)勢(例如Struts的優(yōu)勢是控制邏輯),相互之間需要整合來完成整體的開發(fā),學(xué)習(xí)成本較高、不易上手;②每個框架都需要配置文件的支持才能運行,而且層與層之間需要域模型對象的支持才能傳遞數(shù)據(jù),系統(tǒng)越復(fù)雜,配置文件和域模型對象越多,必然會導(dǎo)致開發(fā)效率的下降。
針對上述問題,提出一種基于JFinal框架的Java EE開發(fā)方法,該方法具有以下優(yōu)點:①能夠極大減少代碼量,無需配置文件和各種域模型對象;②基于MVC架構(gòu),支持AOP編程,擁有Struts2的絕大部分功能[7];③基于Plugin體系結(jié)構(gòu),易于擴展。
JFinal是一款國產(chǎn)的、基于MVC+ORM的開源Java Web框架。它遵循Apache 2.0協(xié)議,其設(shè)計目的是以盡可能少的代碼量來獲得穩(wěn)定、易于擴展、可復(fù)用的Java EE應(yīng)用。JFinal框架不但具備S2SH等主流框架所提供的功能,而且還擁有Ruby、Python等動態(tài)語言的開發(fā)效率[8-9]。
JFinal框架的體系結(jié)構(gòu)如圖1所示,它由Handler、Interceptor、Controller、Render、Plugin 五大部分組成[10]。每個部分都是基于接口實現(xiàn),支持完整的自定義,擴展性強,使用靈活,彼此獨立同時又互相協(xié)助。
圖1 JFinal框架體系結(jié)構(gòu)
Handler是請求處理器,完成對所有請求的公共處理。它的本質(zhì)是AOP+責(zé)任鏈模式的變種[11],由初始配置的Handler和框架默認(rèn)的ActionHandler一起構(gòu)成一條鏈,依次執(zhí)行??赏ㄟ^Handler完成Java EE應(yīng)用的權(quán)限、安全驗證等功能。Interceptor是JFinal AOP的實現(xiàn)方式,通過實現(xiàn)Interceptor接口以及使用@Before annotation可以細粒度地進行配置。Interceptor并非線程安全的,線程安全攔截器需要繼PrototypeInterceptor來實現(xiàn)。Controller充當(dāng)MVC模式中的控制器,對HttpServletRequest和HttpServletResponse進行了封裝,是線程安全的。主要包括三大方面的功能:(1)提供了一系列的獲取、設(shè)置屬性的方法以及重定向的方法;(2)用來定義Action,Controller以及在其中定義的public無參方法就是一個Action;(3)提供了一系列的Render方法來渲染視圖返回給客戶端。Render是渲染器,負責(zé)將服務(wù)器端的數(shù)據(jù)組裝成不同的視圖類型并返回給客戶端。JFinal目前支持的視圖類型有:FreeMarker、JSP、Velocity、JSON、File、Text、Html 以 及 通 過 繼 承Render抽象類來實現(xiàn)的自定義視圖類型。PlugIn是JFinal的插件部分,目前提供了與druid、ehcache、c3p0、Spring等第三方插件的集成,同時支持與用戶自定義插件的集成。
JFinal框架的執(zhí)行流程如下:
(1)客戶端提交一個請求,請求中包含了服務(wù)器端處理該請求的URI;
(2)所有請求會被JFinalFilter攔截,然后調(diào)用Handler進行詳細處理;
(3)Handler是一個鏈條式的調(diào)用,其中包含了0到N個用戶自定義的Handler,鏈條的末端是ActionHandler;
(4)進入ActionHandler后,首先根據(jù)請求從緩存的ActionMapping中獲取到具體處理請求的Action對象,再通過Action對象找到所在的Controller,然后根據(jù)Action和Controller構(gòu)造出Action-Invoker對象;
(5)調(diào)用ActionInvocation的invoke進行具體處理,首先是攔截器的調(diào)用,攔截器調(diào)用中會重新回調(diào)ActionInvocation的invoke方法,攔截器調(diào)用完畢后,會調(diào)用當(dāng)前操作的method方法;
(6)當(dāng)進入具體controller的新增方法時,調(diào)用父類的getModel方法,從request中解析出所需要的數(shù)據(jù),通過反射設(shè)定給具體的Model實體類,最終通過ActiveRecord來進行數(shù)據(jù)存儲;
(7)最后通過頁面渲染render調(diào)用相應(yīng)的視圖,響應(yīng)本次請求。
由于JFinal是基于MVC模式的一體化開發(fā)框架,所以構(gòu)建于JFinal之上的Java EE應(yīng)用主要實現(xiàn)三個方面的內(nèi)容:①完成控制器部分的定義,包括實體類對應(yīng)的Controller、Interceptor攔截器和具體的Action方法;②模型部分的定義,根據(jù)系統(tǒng)功能分析,建立Model模型和數(shù)據(jù)庫的訪問工具;③選擇合適的視圖類型響應(yīng)客戶端請求?;贘Final的Java EE應(yīng)用系統(tǒng)框架如圖2所示。
圖2 基于JFinal框架的Java EE架構(gòu)
JFinal采用了API引導(dǎo)式的配置方式,通過繼承JFinalConfig類來定義Web應(yīng)用的各種組件。JFinalConfig提供了5個抽象方法分別從常量、路由、插件、攔截器和處理器等方面對系統(tǒng)進行全面配置。其中,(1)void configConstant(Constants me),該方法用于配置JFinal常量,例如開發(fā)模式常量的配置、默認(rèn)視圖類型的配置等。(2)void configRoute(Routes me),該方法配置JFinal訪問路由,用來將一個URL定位到某個Action。(3)void configPlugin(Plugins me),該方法用來配置JFinal的插件,例如數(shù)據(jù)庫連接池和ActiveRecord數(shù)據(jù)訪問工具等。(4)void configIntercpetor(Interceptor me),該方法用來配置攔截器,在此處配置的攔截器屬于全局范圍。(5)void configHandler(Handlers me),該方法用來配置Handler,Handler可以接管所有web請求,并對應(yīng)用擁有完全的控制權(quán),可以很方便地實現(xiàn)更高層的功能性擴展。
JFinal采用AOP方式實現(xiàn)攔截器,通過實現(xiàn)Interceptor接口來定義具體的攔截器。攔截器配置共分為:Global、Controller和 Action等三個級別。Global級攔截器通過JFinalConfig.configInterceptor(Interceptors me)方法進行配置,對所有Action進行攔截;Controller級攔截器使用注解@Before annotation在Controller類定義前進行配置,對當(dāng)前Controller中的所有Action進行攔截;Action級攔截器使用注解@Before annotation在Action定義前進行配置,僅對該Action進行攔截。以下是用戶權(quán)限攔截器的相關(guān)代碼:
實現(xiàn)思路是從Session中獲取當(dāng)前登錄用戶信息,并且判斷該用戶能否訪問某個具體的Action。如果用戶沒有登錄或者不具備訪問某個Action的權(quán)限,對該請求進行攔截并定位到登錄頁面。該攔截器是全局級別的,在2.1節(jié)的configIntercpetor(Interceptor me)方法中進行配置。
Controller是JFinal核心類之一,作為MVC模式中的控制器。具體開發(fā)中通過定義Controller的子類來實現(xiàn)控制器,定義若干Action來執(zhí)行業(yè)務(wù)邏輯。
JFinal框架采用了ActiveRecord模式進行數(shù)據(jù)庫的ORM操作。ActiveRecordPulgIn是JFinal框架提供的實現(xiàn)ActiveRecord模式的組件,該組件主要完成配置數(shù)據(jù)源、設(shè)定開發(fā)模式與數(shù)據(jù)庫方言、建立數(shù)據(jù)庫表與Model映射關(guān)系等方面的任務(wù)。
利用ActiveRecordPlugin訪問數(shù)據(jù)庫主要通過三個步驟來實現(xiàn):首先創(chuàng)建數(shù)據(jù)源并賦值給ActiveRecordePlugin對象。因為ActiveRecordePlugin封裝了IDataSourceProvider接口用來表示數(shù)據(jù)源,C3p0Plugin是對C3P0數(shù)據(jù)庫連接池進行封裝的插件并實現(xiàn)了IDataSourceProvider接口,因此該對象就可以看作是一個數(shù)據(jù)源的實現(xiàn)。然后在數(shù)據(jù)庫表與模型類之間建立映射關(guān)系,具體是通過ActiveRecordPluin的addMapping(String tableName,String primaryKey,Class
通過上述代碼可以看出,通過ActiveRecord訪問數(shù)據(jù)庫無需為模型類單獨建立任何配置文件,即使模型類發(fā)生改變,以上代碼也無需任何變動,從而提高了開發(fā)效率并降低了維護成本。
JFinal提供了兩種開啟事務(wù)的方式:聲明式事務(wù)和攔截器型事務(wù)。聲明式事務(wù)只需要在相關(guān)的Action方法前添加注解@Before(Tx.class)即可。攔截器型事務(wù)共有三種,由ActiveRecord提供。其中TxByRegex攔截器可通過傳入正則表達式對action進行攔截,當(dāng)actionKey被正則匹配上將開啟事務(wù);TxByActionKeys可以對指定的actionKey進行攔截并開啟事務(wù);TxByActionMethods可以對指定的method進行攔截并開啟事務(wù)。攔截器型事務(wù)需要在2.1節(jié)描述的configIntercpetor()方法中進行配置。
Model類是ActiveRecord中最重要的組件之一,它充當(dāng)MVC模式中的Model部分。Model類應(yīng)用了泛型思想,具備DAO模式和POJO的功能,提供了通用的持久化操作、數(shù)據(jù)分頁獲取、表字段與屬性映射等方法。所以只需根據(jù)持久化需要定義實體模型類從Model繼承即可擁有強大的數(shù)據(jù)庫操作方法。假定有個學(xué)生實體,它對應(yīng)的模型組件部分源碼如下:
其中dao是一個全局常量,這樣做的目的是為了給控制器和其它模型組件提供訪問Student的接口。例如查詢某個專業(yè)的學(xué)生信息,可以執(zhí)行下面的代碼:
任何一個Web應(yīng)用都需要對數(shù)據(jù)的有效性、合法性進行校驗,防止非法數(shù)據(jù)進入系統(tǒng)。Validator類是JFinal提供的數(shù)據(jù)校驗的基類,該類封裝了一些應(yīng)用中所通用的校驗方法,例如:判斷是否為必填數(shù)據(jù)、判斷字符串的位數(shù)、字符串是否與正則表達式匹配、電子郵箱地址、數(shù)值范圍等。開發(fā)人員可以繼承Validator類來定義具體的校驗邏輯。以下是常用的若干校驗邏輯源碼:
validate方法用來對頁面提交的各項數(shù)據(jù)進行校驗,當(dāng)validate方法中有某一項校驗不通過時執(zhí)行handleError方法,將錯誤提示信息帶回到相關(guān)的頁面。getActionKey()方法能夠得到調(diào)用當(dāng)前校驗邏輯所對應(yīng)的Action,這樣就可以使得不同的Action能共享相同的校驗邏輯,從而避免代碼的重復(fù)編寫。由于Validator類本質(zhì)上是攔截器,需要在對應(yīng)的Action前添加注解@Before(XXXXInterceptor.class)使得校驗器起作用。
將JFinal框架與S2SH框架進行對比分析,比較點如表1所示。基礎(chǔ)配置方面:JFinal是一個一站式的Java EE開發(fā)框架,相對于S2SH架構(gòu)的集成式開發(fā)方式而言,具有很小容量的核心Jar包,學(xué)習(xí)成本較低。編碼量方面:JFinal不需要開發(fā)人員定義POJO,無需對屬性編寫set和get方法和配置文件;而S2SH框架需要編寫POJO,并且在控制層、業(yè)務(wù)層和持久層都要提供對應(yīng)的配置文件,所以JFinal框架能夠極大地提高Java EE的開發(fā)效率。在持久化方面:S2SH框架采用ORM方式完成實體類與數(shù)據(jù)表的映射,JFinal框架采用原生JDBC訪問數(shù)據(jù)庫。由于ORM最終會翻譯成JDBC訪問數(shù)據(jù)庫,所以在一些復(fù)雜關(guān)聯(lián)查詢的場景,JDBC的性能會明顯高于ORM[12]。
表1 JFinal框架與S2SH框架比較
提出一種基于JFinal框架的Java EE應(yīng)用開發(fā)方法,對JFinal框架的體系結(jié)構(gòu)、執(zhí)行流程進行了詳細分析。從模型、視圖、控制器三個方面對JFinal框架在Java EE應(yīng)用中的具體實現(xiàn)進行了詳細描述并給出相關(guān)核心源碼。與當(dāng)前流行的、基于S2SH框架的Java EE開發(fā)方法進行了全方位對比,結(jié)果表明JFinal框架在核心jar包容量、開發(fā)效率、持久化性能方面都要優(yōu)于S2SH框架。JFinal框架的出現(xiàn)無疑為Java EE應(yīng)用實現(xiàn)提供了一條高效的途徑,相信未來會有更多的Java EE應(yīng)用構(gòu)建于JFinal框架之上。
[1]肖輝輝.基于JSP+Servlet+JavaBean的網(wǎng)上拍賣系統(tǒng)設(shè)計與實現(xiàn)[J].電腦開發(fā)與應(yīng)用,2013,26(8):16-20.Xiao Huihui.Design and Implementation of Online Auction System Based on JSP+Servlet+JavaBean[J].Computer Development and Application,2013,26(8):16-20.
[2]劉紅霞,陸文迪.改進的MVC設(shè)計模式的研究與應(yīng)用[J].計算機工程與科學(xué),2015,37(9):1688-1691.Liu Hongxia,Lu Wendi.Research and Implementation and Improved MVC Design Pattern[J].Computer Engineering&Science,2015,37(9):1688-1691.
[3]姜林美,李國剛,杜勇前.結(jié)合AOP思想和依賴注入技術(shù)的輕量級MVC框架 [J].華僑大學(xué)學(xué)報 (自然科學(xué)版),2016,37(1):92-97.Jiang Linmei,Li Guogang,Du Yongqian.A Light-weight MVC Framework Combining AOP and Dependency Injection[J].Journal of Huaqiao University(Natural Science),2016,37(1):92-97.
[4]王海濤,賈宗璞.基于Struts和Hibernate的Web應(yīng)用開發(fā)[J].計算機工程,2011,37(9):112-114.Wang Haitao,Jia Zongpu.Web Application Development Based on Struts and Hibernate[J].Computer Engineering,2011,37(9):112-114.
[5]龔尚福,龔琴,馮健.基于SSH框架的EPON性能管理系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機應(yīng)用,2013,33(2):571-574.Gong Shangfu,Gong Qin,Feng Jian.Design and Implementation of EPON Performance Management System Based on SSH Framework [J].Journal of Computer Applications,2013,33(2):571-574.
[6]高秀慧,高建華.基于J2EE框架的Web應(yīng)用可靠性研究[J].計算機工程與設(shè)計,2013,34(4):1270-1275.Gao Xiuhui,Gao Jianhua.Research on Web Application Reliability Based on J2EE Framework[J].Computer Engineering and Design,2013,34(4):1270-1275.
[7]葛萌,歐陽宏基.Struts2框架在信息發(fā)布系統(tǒng)中的應(yīng)用研究[J].微處理機,2014,35(2):40-43.Ge Meng,Ouyang Hongji.Application Research of Information Release System Based on Struts2 Framework[J].Microprocessors,2014,35(2):40-43.
[8]龔貞,李斌.Ruby on Rails構(gòu)建Web敏捷開發(fā)[J].科技信息,2010,(13):479-481.Gong Zhen,Li Bin.Agile Web Development with Ruby on Rails[J].Science&Technology Information,2010,(13):479-481
[9]宮薇薇,祝繼常,韓煦.基于Python的網(wǎng)頁版物理實驗快速建設(shè)技術(shù)[J].大學(xué)物理實驗,2016,29(5):114-117.GongWeiwei,Zhu Jichang,Han Xu.Rapid Construction Technology of Web Page Physical Experiment Based on Python [J].Physical Experiment of College,2016,29(5):114-117.
[10]楊寧,劉丹軍.基于JFinal框架的Java Web應(yīng)用開發(fā)研究[J].電腦知識與技術(shù),2014,10(7):1440-1443.Yang Ning,Liu Danjun.Java Web Application Development Research Based on JFinal[J].Computer Knowledge and Technology,2014,10(7):1440-1443.
[11]夏艷秋,袁汝華.基于JFinal框架和HTML5技術(shù)的手機應(yīng)用開發(fā)平臺設(shè)計 [J].計算機與現(xiàn)代化,2014(1):201-205.Xia Yanqiu,Yuan Ruhua.Mobile Application Development Platform Based on JFinal and HTML5[J].Computer and Modernization,2014(1):201-205.
[12]歐陽宏基,葛萌,陳偉.基于JDBC的數(shù)據(jù)持久層性能優(yōu)化研究[J].網(wǎng)絡(luò)新媒體技術(shù),2016,5(5):9-15.Ouyang Hongji,Ge Meng,Chen Wei.Research on Performance Optimization of Data Persistence Layer Based on JDBC[J].Journal of Network New Media,2016,5(5):9-15.
Research on Java EE Application Based on JFinal Framework
Ouyang Hongji1,Yu Bo2,Ge Meng1
(1.Computer College,Xianyang Normal University,Xianyang 712000,China;2.Information Engineering Department,Henan Technical College of Construction,Zhengzhou 450064,China)
The Java EE application based on S2SH framework has many problems,such as complicated configuration,large coding workload,large volume,and more dependence on third party jar.For these problems,a method of developing Java EE based on JFinal framework is presented.Firstly,the architecture and execution process of JFinal framework are described in detail.Then,combined with some examples of code from three aspects of the model,view and controller,the specific realization process of JFinal framework is given.Finally,Final framework and S2SH framework are fully compared and analyzed.The results show that Java EE development method based on JFinal framework can greatly improve the development efficiency and have good stability and scalability.
JFinal framework;S2SH framework;Java EE application;High speed development;MVC pattern
10.3969/j.issn.1002-2279.2017.04.012
TP311
A
1002-2279-(2017)04-0045-06
陜西省教育廳科研計劃項目(14JK1796)咸陽師范學(xué)院“青年骨干教師”培養(yǎng)項目(XSYGG201615)
歐陽宏基(1982—),男,陜西寶雞人,講師,碩士,主研方向:軟件工程,Java EE應(yīng)用。
葛萌(1980—),女,陜西咸陽人,講師,碩士,主研方向:軟件工程,圖像處理。
于博(1981—),男,陜西咸陽人,講師,碩士,主研方向:軟件工程,嵌入式系統(tǒng)。
2017-03-08