基于Maven的J2EE后台管理系统代码生成器

2014-10-15 07:39
计算机与现代化 2014年2期
关键词:代码生成后台代码

魏 颖

(天津大学管理与经济学部,天津 300072)

0 引言

近些年,Web技术快速发展,B/S模式已经成了当今系统的主流模式。与此同时,越来越多的优秀软件开发人员参与到J2EE[1-2]开源框架的开发中,打造出了一批易用且完善的Web框架,如Spring、MyBatis、Hibernate等,大大降低了Web系统的开发门槛。为了提升系统的开发效率、降低系统的维护成本,大多数Web系统都采用MVC分层模式进行开发。MVC模式是一种“分治”的思想[3],将数据的访问、逻辑处理和数据的展现分开,使每一层次都专注于自己的业务处理。后台管理系统提供的功能大部分是针对数据库的CRUD(增、删、改、查)操作,其逻辑简单,流程相对固定。但是在实际的开发中,程序员往往要花费大量的时间去重复编写各层次的代码,包括后台程序代码和前台页面展示代码,不但增加了程序员工作量,而且还影响了软件的开发进度。因此,自动化代码生成一直以来都是软件工程师追求的目标。本文针对后台管理系统的特性,利用Freemarker模板技术,设计了一个可自动生成基于MVC模式的J2EE后台管理系统的代码生成器,用于后台程序代码和前台页面的自动生成。

1 代码生成器介绍

本代码生成器根据用户的配置,针对数据库单表或联表生成从前台页面到后台处理的CRUD代码。软件开发人员可以在自动生成系统的基础上,进行二次开发,打造符合需求的后台管理系统。

现有的代码生成工具主要服务于生成数据库操作代码和业务代码,没有提供对前台页面的代码生成接口,并且代码模板都预置在系统中,用户无法改变代码结构和风格,灵活性比较差。相比于业界已有的代码生成器,本代码生成器的优点如下:

(1)用户可自定义代码生成任务。

为了满足不同用户的需要,本代码生成器提供3种代码生成任务,分别是生成整套系统、生成基本架构和生成数据库操作代码。用户可以结合自身需要在命令批处理文件中自行定义代码生成任务。

(2)用户可自行开发代码模板。

Freemarker是一个使用纯Java编写的开源模板引擎[4],能够基于模板生成各类文件,具有语法简单明了、结构清晰和解析效率高等特点,目前广泛应用在Web界面、Email模板和其他模板定义方面。由于Freemarker的易上手特性,用户在遵循自定义模板规则的基础上,可以很轻松地设计和开发自己的代码模板,然后在业务模型文件中指定代码模板路径,就可生成符合自身需求的代码。

(3)可以自动生成前台页面。

jQuery[5-6]是一款优秀的 JS框架,由于其简单明了的语法、良好的浏览器兼容性和强大的功能,已经广泛应用于Web系统的开发。Bootstrap是由著名社交网站Facebook提供的一款开源CSS框架,能让设计人员很快地构建自己的系统前台,并且对PC端和移动端都提供良好的兼容性。本代码生成器以jQuery和Bootstrap作为前台框架,提供针对数据库的增删改查操作的界面生成功能。

(4)生成的系统默认提供角色权限配置功能。

由于提供角色权限配置功能基本上是后台管理系统的通用需求,所以本代码生成器生成的后台管理系统默认提供此功能。新版的Spring Security 3框架具有完善的安全体系[7-8],在用户认证和用户授权方面都提供了很好的支持。本系统提供的角色权限配置是在Spring Security的基础上,进行二次开发,使用户可以根据自身的需要灵活地对权限进行配置。

2 架构体系

本代码生成器生成的后台系统采用Maven作为项目管理工具,以J2EE为系统架构,前端引用jQuery和Bootstrap框架。

2.1 Maven

Maven是Apache提供的一款基于项目对象模型(Project Object Model,POM)的开源项目管理工具,是Ant的进化,为项目提供包管理、编译和发布等一系列功能。它包含了一个项目对象模型、一组标准集合、一个项目生命周期(Project Lifecycle)、一个依赖管理系统(Dependency Management System)和用来运行定义在生命周期阶段(Phase)中插件(Plugin)目标(Goal)的逻辑。当使用Maven时,可以用一个明确定义的项目对象模型来描述项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件[9]。Maven可以让开发人员快速地构建一个项目,有效地解决包管理和项目发布问题,并且可以与持续集成进行无缝对接。对于大型的系统,采用Maven作为项目管理工具,可以有效地进行分工协作。

2.2 项目架构

本代码生成器遵循MVC模式,选择Spring Web、Spring和MyBatis作为J2EE框架。其中,Spring Web负责前端数据的展示和处理,Spring负责整个项目的统筹和管理,MyBatis作为持久层框架,负责处理数据库的CRUD操作。各框架各司其职,这种分层的体系结构一方面能够很好地解决各模块的耦合性问题,使代码结构更加明了,有利于项目的维护;另一方面为代码生成器的设计提供了便利性,只需根据每层的特点编写对应的模板文件,大大提高了编码效率,降低了用户自定义模板的难度。项目各层交互如图1所示。

图1 J2EE体系结构图

(1)PO和VO对象。

一张数据库表对应一个PO对象,PO对象是简单的Java对象,没有任何的业务逻辑处理,只有与数据表字段对应的属性和Setter/Getter方法。PO对象的主要用途是接收和封装单张数据表CRUD的结果数据,在业务逻辑处理层和数据持久层进行传递。VO对象的作用主要是接收和封装前端数据展示层的数据,通过前端数据处理层传递给业务逻辑层,业务逻辑层负责VO和PO的转换。PO和VO的主要区别在于PO服务于数据库,而VO服务于前端数据展示。

(2)展示层。

在本系统中,由Spring Web框架负责展现层。前端数据展示由JSP、jQuery和Bootstrap协同配合完成,通过Get或Post请求,经过Spring Web Servlet容器处理,定位到对应的数据处理即Controller方法。与此同时,请求参数被封装到指定的VO对象中,传递给Controller方法。经过Controller方法的处理,再传递给逻辑处理层,逻辑处理层处理之后将结果返回给 Controller,Controller通过 Spring Web Servlet再将数据返回前台,通过Spring Web标签将数据显示在页面上。

(3)逻辑处理层。

顾名思义,逻辑处理层主要负责业务逻辑的处理,是整个系统的核心和精髓,但具体的业务会增加逻辑处理代码的耦合度,不利于系统的扩展和维护。为了解决此问题,本系统通过Spring容器管理逻辑处理和数据持久层,为各层组件的灵活配置提供便利性。

(4)数据持久层。

数据持久层主要负责关系数据表与Java对象(即PO和VO对象)的映射,本系统使用MyBatis作为持久层框架,相比Hibernate或 OJB等全自动式ORM框架,MyBatis可以自行定义、优化SQL语句,因此被称为半自动式ORM框架[10-11]。MyBatis由Mapper和SQL Map两大组件组成,其中Mapper负责定义数据口操作接口,SQL Map负责SQL语句的组装。为了减少程序员的工作量,提高代码编写效率和正确性,MyBatis官方网站提供了一款代码生成器iBator,可生成针对数据库单表进行增删改查操作的Mapper、SQL Map和PO对象。本代码生成器也会调用iBator生成单表的增删改查的持久层代码。

3 代码生成器的设计和实现

3.1 代码生成器概念模型

代码生成器的原理:按照规则定义输入文件,解析输入文件得到符合要求的输入数据模型,将输入数据模型按照特定的规则转为输出文件。本代码生成器利用Freemarker模板技术实现输入和输出的转换。使用模板的目的是将不变的代码处理逻辑和可变的数据分离开来,这样生成器的专注点就在于解析出可变的数据。由于Freemarker是一款基于Java语言的模板引擎,因此可以利用模板标签引用到Java对象中的各种属性,将可变的数据和不变的代码处理逻辑合为一体,组装出系统所需要的各种组件。通过利用模板技术,不仅可以减少代码编写工作量,提高生成程序的准确性,还可以使代码生成器满足用户自定义代码逻辑的需求,用户只需定义自己的程序模板,就可以生成出符合自身需求的业务组件。

如图2所示,本代码生成器可以分为3大块内容,业务描述文件、代码生成引擎和模板文件。代码生成引擎就像一个工厂,将业务描述文件和模板文件进行组装,最后产出后台管理系统。代码生成器的基本流程是:软件开发人员首先分析自身的需求,在业务描述文件里定义数据规则和组件规则,如需要用到的数据表信息、数据表之间的关联和对应关系信息、每个字段对应的前台组件信息等;然后通过代码生成器中的数据解析引擎解析业务描述JSON文件,将解析得到的数据和模板文件结合,生成后台管理系统。

具体来说,本代码生成器一共包括3种类型的代码生成器:DAO代码生成器,负责数据持久层的代码生成;Controller代码生成器,负责生成除页面以外的所有代码;CRUD代码生成器,在调用以上两种代码生成器的基础上,继续生成增删改查页面、项目的目录结构和配置文件。

图2 代码生成器流程图

3.2 代码生成器程序模型

3.2.1 业务描述文件定义

业务描述文件负责描述整个后台管理系统的业务逻辑,具体包括项目配置信息、数据库连接信息、数据表信息和页面UI信息4方面的配置。本系统采用JSON作为业务文件的定义形式。随着Web2.0技术的不断发展,Ajax技术大放异彩,JSON作为在异步传输中被广泛采用的数据交换语言,已经拥有了很成熟的发展体系。JSON和XML同为数据传输语言,具有很好的扩展性,都能满足自定义数据格式的需求,但是相比XML,JSON编码容易,解析成本低[6],所以本系统采用JSON描述业务逻辑。下面是业务描述文件数据表信息部分,其中tables中封装的是数据表信息,fields中封装的是数据列信息,component中封装的是某个字段对应的前端组件信息。

图3 业务数据类图

3.2.2 业务文件解析

业务文件解析器负责将业务描述JSON字符转化为代码生成器可识别的Java对象,为代码生成提供数据源。本文的解析器是在开源组织Apache提供的JSON解析工具Jackson的基础上进一步加工和封装所形成的,具体的处理过程为:首先对业务描述文件进行检查,例如,JSON字符是结构定义是否有误,业务描述是否符合规则等,如不符合预期,则抛出异常信息;其次将业务数据解析转化为Java对象并加载到内存中,供代码生成器访问。本系统所使用的业务对象类如图3所示,具体包括项目基本信息、数据库基础信息和数据表信息,其中数据表信息又由数据列信息和前端组件信息两部分组成。通过这样的对象结构设计和组合,就可以将业务描述信息全部加到Java对象中,为代码生成器提供结构化的数据源。

3.2.3 代码模板定义

本代码生成器基于模板技术,在模板中定义程序原型,再由代码生成器和模板引擎共同合成最终的程序文件。本文将以Service层代码模板为例,阐述本系统使用的模板文件的结构和原理。Service层主要负责数据库的CRUD的逻辑操作,图4是Service层插入数据到数据库的模板片段。

图4 Service层插入数据到数据库的模板片段

从图4中可以看到,整个代码分为两部分,其中${}中的代码为动态代码,其他为静态代码。对于静态代码,代码解析器不会做任何的解析直接输出到对应的程序文件中,对于动态代码,代码解析器会从业务对象中取出对应的数据,输出给Freemarker模板引擎,然后由模板引擎进行动态替换,合成最终的程序文件。

表1 模板说明表

本后台系统采用的是J2EE体系结构,与J2EE体系相对应,本文提供了每一层的代码模板,具体如表1所示,其中表现层除了 Controller模板外,在Component文件夹中定义了前端页面所使用的组件模板,在uiTemplate目录下定义了前端展示的增删改查页面。

图5 代码生成器类图

3.2.4 代码生成引擎

本代码生成器是以command.bat文件为入口,通过命令行方式驱动代码生成器的运行,如图5所示,其中commandLine负责命令的接收,在命令行中以参数的形式指定生成器类型和业务文件。可选的生成器包括 generateDAO、generateController、generateCRUD三种类型,其中generateDAO负责生成数据持久层代码,generateController在generateDAO的基础上生成逻辑层和控制层的后端代码,generateCRUD在generateController的基础上继续生成前台页面。代码生成过程如图5所示:首先commandLine调用JSONParser进行业务文件解析,将解析结果以对象的形式保存下来,然后commandLine利用 Java的反射机制[13-14],调用DefaultGenerator中对应的生成器方法并将业务参数传递过去,进行代码生成。

4 结束语

众所周知,中小软件外包公司承接的项目中Web后台系统占有较大的比例,很适合利用本文设计的代码生成器进行项目开发。经过努力和推广,本代码生成器已经在某软件外包公司中得到应用。根据使用之后的反馈结果,使用代码生成器可以快速构建一个后台系统雏形,明显地缩短了项目的开发周期,减少了软件开发人员的重复工作。但是与此同时,也暴露出了一些问题,如:业务文件语法复杂;只能生成系统指定J2EE架构的 Web项目;只支持 Oracle和 My SQL两种类型的数据库等。针对实际使用中的问题,在后续的开发中,将对代码生成器进行逐步的完善,达到最终支持完全可视化配置和驱动的目标。

[1]曹鸣鹏,赵伟,许林英.J2EE技术及其实现[J].计算机应用,2001,21(10):20-23.

[2]袁梅冷,黄烟波,黄家林,等.J2EE应用模型中MVC软件体系结构的研究与应用[J].计算机应用研究,2003,20(3):147-149.

[3]陆荣幸,郁洲,阮永良,等.J2EE平台上MVC设计模式的研究与实现[J].计算机应用研究,2003,20(3):144-146.

[4]李刚.Struts 2.1权威指南[M].北京:电子工业出版社,2009.

[5]单东林,张晓菲,魏然.锋利的jQuery[M].北京:人民邮电出版社,2009:35-42.

[6]费拉纳提.Javascript权威指南(第5版)[M].李强,等译.北京:机械工业出版社,2007:56-67.

[7]丁振凡.基于Spring Security的Web资源访问控制[J].宜春学院学报,2012,34(8):71-74.

[8]焦宁波,常炳国.Spring Security构建灵活的企业级安全应用[J].计算机光盘软件与应用,2011(1):7-8.

[9]百度百科.Maven[EB/OL].http://baike.baidu.com/view/336103.htm,2013-07-23.

[10]李澎林,朱国清,吴斌.基于iBatis SQL Map的数据持久层实现应用研究[J].浙江工业大学学报,2008,36(1):72-76.

[11]刘军,戴金山.基于Spring MVC与iBatis的轻量级Web应用研究[J].计算机应用,2006,26(4):840-843.

[12]韩义波,宋莉,宋俊杰.Ajax技术结合XML或JSON的使用比较[J].电脑知识与技术,2009(1):101-103.

[13]王开,谭翼,周兰江.Java中反射机制浅析及应用[J].电脑知识与技术,2007(1):255-256.

[14]张航,蓝雯飞.探寻Java反射机制的奥秘[J].计算机光盘软件与应用,2011(9):203.

猜你喜欢
代码生成后台代码
Lustre语言可信代码生成器研究进展
创世代码
创世代码
创世代码
创世代码
后台暗恋
代码生成技术在软件开发中的应用
前台、后台精彩花絮停不了
后台朋友
基于XML的代码自动生成工具