基于JFinal框架的Java EE应用研究*
2017-09-11欧阳宏基于博葛萌
欧阳宏基,于博,葛萌
(1.咸阳师范学院计算机学院,咸阳712000;2.河南建筑职业技术学院信息工程系,郑州450064)
基于JFinal框架的Java EE应用研究*
欧阳宏基1,于博2,葛萌1
(1.咸阳师范学院计算机学院,咸阳712000;2.河南建筑职业技术学院信息工程系,郑州450064)
基于S2SH框架的Java EE应用存在着配置繁琐、编码工作量大、体积庞大、对第三方jar依赖较多等问题,为此,提出一种基于JFinal框架的Java EE开发方法。首先对JFinal框架的体系结构和执行流程进行了详细描述。然后,结合部分示例代码从模型、视图、控制器三个方面给出了JFinal框架的具体实现过程。最后,将Final框架与S2SH框架进行了全方位对比分析。结果表明:基于JFinal框架的Java EE开发方法能够极大的提高开发效率,同时具有良好的稳定性和扩展性。
JFinal框架;S2SH框架;Java EE应用;极速开发;MVC模式
1 引言
随着Java技术与互联网的快速发展,Java EE应用经历了从JSP+Servlet+JavaBean[1]的开发方案到以MVC设计模[2]+框架的开发方案的转变,前者适合于小型规模的Java Web应用,后者适合于大型企业级应用。在以框架为基础的开发方案中,以Struts、Spring、Hibernate、Mybatis等框架应用最具代表性,目前的主要研究集中在分析框架的构成、通过框架之间的集成进行系统开发、测试并验证框架的性能等方面[3]。
文献[4]提出一种基于Struts1与Hibernate框架集成的开发方案,主要是通过Struts1实现控制逻辑,在Action组件中通过DAO模式调用Hibernate API来访问数据库,从而解决了系统耦合度高、JDBC访问数据库复杂等问题。文献[5]提出一种基于SSH(Struts+Spring+Hibernate)框架的Web开发方法,并应用到EPON性能监控管理系统的开发中,通过实验测试证明了该方法的可靠性和稳定性。文献[6]提出整合Spring与Ibatis框架的Web开发方案,并应用到信用卡业务系统的开发中,证明了该方案的稳定性和维护性。虽然上述基于各种框架的Java Web开发方案都具有很好的稳定性和扩展性等,但是都存在着两个方面的缺点:①每个框架都只在某个方面具有优势(例如Struts的优势是控制逻辑),相互之间需要整合来完成整体的开发,学习成本较高、不易上手;②每个框架都需要配置文件的支持才能运行,而且层与层之间需要域模型对象的支持才能传递数据,系统越复杂,配置文件和域模型对象越多,必然会导致开发效率的下降。
针对上述问题,提出一种基于JFinal框架的Java EE开发方法,该方法具有以下优点:①能够极大减少代码量,无需配置文件和各种域模型对象;②基于MVC架构,支持AOP编程,拥有Struts2的绝大部分功能[7];③基于Plugin体系结构,易于扩展。
2 JFinal框架
JFinal是一款国产的、基于MVC+ORM的开源Java Web框架。它遵循Apache 2.0协议,其设计目的是以尽可能少的代码量来获得稳定、易于扩展、可复用的Java EE应用。JFinal框架不但具备S2SH等主流框架所提供的功能,而且还拥有Ruby、Python等动态语言的开发效率[8-9]。
2.1 JFinal框架体系结构
JFinal框架的体系结构如图1所示,它由Handler、Interceptor、Controller、Render、Plugin 五大部分组成[10]。每个部分都是基于接口实现,支持完整的自定义,扩展性强,使用灵活,彼此独立同时又互相协助。
图1 JFinal框架体系结构
Handler是请求处理器,完成对所有请求的公共处理。它的本质是AOP+责任链模式的变种[11],由初始配置的Handler和框架默认的ActionHandler一起构成一条链,依次执行。可通过Handler完成Java EE应用的权限、安全验证等功能。Interceptor是JFinal AOP的实现方式,通过实现Interceptor接口以及使用@Before annotation可以细粒度地进行配置。Interceptor并非线程安全的,线程安全拦截器需要继PrototypeInterceptor来实现。Controller充当MVC模式中的控制器,对HttpServletRequest和HttpServletResponse进行了封装,是线程安全的。主要包括三大方面的功能:(1)提供了一系列的获取、设置属性的方法以及重定向的方法;(2)用来定义Action,Controller以及在其中定义的public无参方法就是一个Action;(3)提供了一系列的Render方法来渲染视图返回给客户端。Render是渲染器,负责将服务器端的数据组装成不同的视图类型并返回给客户端。JFinal目前支持的视图类型有:FreeMarker、JSP、Velocity、JSON、File、Text、Html 以 及 通 过 继 承Render抽象类来实现的自定义视图类型。PlugIn是JFinal的插件部分,目前提供了与druid、ehcache、c3p0、Spring等第三方插件的集成,同时支持与用户自定义插件的集成。
2.2 JFinal框架的执行流程
JFinal框架的执行流程如下:
(1)客户端提交一个请求,请求中包含了服务器端处理该请求的URI;
(2)所有请求会被JFinalFilter拦截,然后调用Handler进行详细处理;
(3)Handler是一个链条式的调用,其中包含了0到N个用户自定义的Handler,链条的末端是ActionHandler;
(4)进入ActionHandler后,首先根据请求从缓存的ActionMapping中获取到具体处理请求的Action对象,再通过Action对象找到所在的Controller,然后根据Action和Controller构造出Action-Invoker对象;
(5)调用ActionInvocation的invoke进行具体处理,首先是拦截器的调用,拦截器调用中会重新回调ActionInvocation的invoke方法,拦截器调用完毕后,会调用当前操作的method方法;
(6)当进入具体controller的新增方法时,调用父类的getModel方法,从request中解析出所需要的数据,通过反射设定给具体的Model实体类,最终通过ActiveRecord来进行数据存储;
(7)最后通过页面渲染render调用相应的视图,响应本次请求。
3 基于JFinal的Java EE应用构建
由于JFinal是基于MVC模式的一体化开发框架,所以构建于JFinal之上的Java EE应用主要实现三个方面的内容:①完成控制器部分的定义,包括实体类对应的Controller、Interceptor拦截器和具体的Action方法;②模型部分的定义,根据系统功能分析,建立Model模型和数据库的访问工具;③选择合适的视图类型响应客户端请求。基于JFinal的Java EE应用系统框架如图2所示。
图2 基于JFinal框架的Java EE架构
3.1 创建JFinal配置类
JFinal采用了API引导式的配置方式,通过继承JFinalConfig类来定义Web应用的各种组件。JFinalConfig提供了5个抽象方法分别从常量、路由、插件、拦截器和处理器等方面对系统进行全面配置。其中,(1)void configConstant(Constants me),该方法用于配置JFinal常量,例如开发模式常量的配置、默认视图类型的配置等。(2)void configRoute(Routes me),该方法配置JFinal访问路由,用来将一个URL定位到某个Action。(3)void configPlugin(Plugins me),该方法用来配置JFinal的插件,例如数据库连接池和ActiveRecord数据访问工具等。(4)void configIntercpetor(Interceptor me),该方法用来配置拦截器,在此处配置的拦截器属于全局范围。(5)void configHandler(Handlers me),该方法用来配置Handler,Handler可以接管所有web请求,并对应用拥有完全的控制权,可以很方便地实现更高层的功能性扩展。
3.2 定义拦截器
JFinal采用AOP方式实现拦截器,通过实现Interceptor接口来定义具体的拦截器。拦截器配置共分为:Global、Controller和 Action等三个级别。Global级拦截器通过JFinalConfig.configInterceptor(Interceptors me)方法进行配置,对所有Action进行拦截;Controller级拦截器使用注解@Before annotation在Controller类定义前进行配置,对当前Controller中的所有Action进行拦截;Action级拦截器使用注解@Before annotation在Action定义前进行配置,仅对该Action进行拦截。以下是用户权限拦截器的相关代码:
实现思路是从Session中获取当前登录用户信息,并且判断该用户能否访问某个具体的Action。如果用户没有登录或者不具备访问某个Action的权限,对该请求进行拦截并定位到登录页面。该拦截器是全局级别的,在2.1节的configIntercpetor(Interceptor me)方法中进行配置。
3.3 定义Controller
Controller是JFinal核心类之一,作为MVC模式中的控制器。具体开发中通过定义Controller的子类来实现控制器,定义若干Action来执行业务逻辑。
3.4 创建ActiveRecordPlugin
JFinal框架采用了ActiveRecord模式进行数据库的ORM操作。ActiveRecordPulgIn是JFinal框架提供的实现ActiveRecord模式的组件,该组件主要完成配置数据源、设定开发模式与数据库方言、建立数据库表与Model映射关系等方面的任务。
利用ActiveRecordPlugin访问数据库主要通过三个步骤来实现:首先创建数据源并赋值给ActiveRecordePlugin对象。因为ActiveRecordePlugin封装了IDataSourceProvider接口用来表示数据源,C3p0Plugin是对C3P0数据库连接池进行封装的插件并实现了IDataSourceProvider接口,因此该对象就可以看作是一个数据源的实现。然后在数据库表与模型类之间建立映射关系,具体是通过ActiveRecordPluin的addMapping(String tableName,String primaryKey,Class
通过上述代码可以看出,通过ActiveRecord访问数据库无需为模型类单独建立任何配置文件,即使模型类发生改变,以上代码也无需任何变动,从而提高了开发效率并降低了维护成本。
3.5 开启事务
JFinal提供了两种开启事务的方式:声明式事务和拦截器型事务。声明式事务只需要在相关的Action方法前添加注解@Before(Tx.class)即可。拦截器型事务共有三种,由ActiveRecord提供。其中TxByRegex拦截器可通过传入正则表达式对action进行拦截,当actionKey被正则匹配上将开启事务;TxByActionKeys可以对指定的actionKey进行拦截并开启事务;TxByActionMethods可以对指定的method进行拦截并开启事务。拦截器型事务需要在2.1节描述的configIntercpetor()方法中进行配置。
3.6 创建模型组件
Model类是ActiveRecord中最重要的组件之一,它充当MVC模式中的Model部分。Model类应用了泛型思想,具备DAO模式和POJO的功能,提供了通用的持久化操作、数据分页获取、表字段与属性映射等方法。所以只需根据持久化需要定义实体模型类从Model继承即可拥有强大的数据库操作方法。假定有个学生实体,它对应的模型组件部分源码如下:
其中dao是一个全局常量,这样做的目的是为了给控制器和其它模型组件提供访问Student的接口。例如查询某个专业的学生信息,可以执行下面的代码:
3.7 数据校验
任何一个Web应用都需要对数据的有效性、合法性进行校验,防止非法数据进入系统。Validator类是JFinal提供的数据校验的基类,该类封装了一些应用中所通用的校验方法,例如:判断是否为必填数据、判断字符串的位数、字符串是否与正则表达式匹配、电子邮箱地址、数值范围等。开发人员可以继承Validator类来定义具体的校验逻辑。以下是常用的若干校验逻辑源码:
validate方法用来对页面提交的各项数据进行校验,当validate方法中有某一项校验不通过时执行handleError方法,将错误提示信息带回到相关的页面。getActionKey()方法能够得到调用当前校验逻辑所对应的Action,这样就可以使得不同的Action能共享相同的校验逻辑,从而避免代码的重复编写。由于Validator类本质上是拦截器,需要在对应的Action前添加注解@Before(XXXXInterceptor.class)使得校验器起作用。
4 JFinal框架与S2SH框架对比分析
将JFinal框架与S2SH框架进行对比分析,比较点如表1所示。基础配置方面:JFinal是一个一站式的Java EE开发框架,相对于S2SH架构的集成式开发方式而言,具有很小容量的核心Jar包,学习成本较低。编码量方面:JFinal不需要开发人员定义POJO,无需对属性编写set和get方法和配置文件;而S2SH框架需要编写POJO,并且在控制层、业务层和持久层都要提供对应的配置文件,所以JFinal框架能够极大地提高Java EE的开发效率。在持久化方面:S2SH框架采用ORM方式完成实体类与数据表的映射,JFinal框架采用原生JDBC访问数据库。由于ORM最终会翻译成JDBC访问数据库,所以在一些复杂关联查询的场景,JDBC的性能会明显高于ORM[12]。
表1 JFinal框架与S2SH框架比较
5 结束语
提出一种基于JFinal框架的Java EE应用开发方法,对JFinal框架的体系结构、执行流程进行了详细分析。从模型、视图、控制器三个方面对JFinal框架在Java EE应用中的具体实现进行了详细描述并给出相关核心源码。与当前流行的、基于S2SH框架的Java EE开发方法进行了全方位对比,结果表明JFinal框架在核心jar包容量、开发效率、持久化性能方面都要优于S2SH框架。JFinal框架的出现无疑为Java EE应用实现提供了一条高效的途径,相信未来会有更多的Java EE应用构建于JFinal框架之上。
[1]肖辉辉.基于JSP+Servlet+JavaBean的网上拍卖系统设计与实现[J].电脑开发与应用,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设计模式的研究与应用[J].计算机工程与科学,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]姜林美,李国刚,杜勇前.结合AOP思想和依赖注入技术的轻量级MVC框架 [J].华侨大学学报 (自然科学版),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应用开发[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性能管理系统的设计与实现[J].计算机应用,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应用可靠性研究[J].计算机工程与设计,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框架在信息发布系统中的应用研究[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构建Web敏捷开发[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的网页版物理实验快速建设技术[J].大学物理实验,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应用开发研究[J].电脑知识与技术,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技术的手机应用开发平台设计 [J].计算机与现代化,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的数据持久层性能优化研究[J].网络新媒体技术,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)咸阳师范学院“青年骨干教师”培养项目(XSYGG201615)
欧阳宏基(1982—),男,陕西宝鸡人,讲师,硕士,主研方向:软件工程,Java EE应用。
葛萌(1980—),女,陕西咸阳人,讲师,硕士,主研方向:软件工程,图像处理。
于博(1981—),男,陕西咸阳人,讲师,硕士,主研方向:软件工程,嵌入式系统。
2017-03-08