摘要:大型企业信息化过程中,通过不断建设信息系统辅助办公,以提高生产效率。然而不同的信息系统中,由于设计、开发人员不同,带来了项目风险、效率、成本等一系列问题。采用统一的开发框架和组件,可以节约成本、提高效率,降低因开发人员更换、不熟悉框架造成的风险。采用统一的开发框架,可以提高系统安全性,在反复测试过程中,减少其bug,程序更加健壮。
关键词关键词:MVC;J2EE开发框架;信息系统;组件
DOIDOI:10.11907/rjdk.143883
中图分类号:TP319
文献标识码:A文章编号文章编号:16727800(2015)002012603
作者简介作者简介:韩彩云(1986-),女,山西长治人,硕士,镇江高等职业技术学校信息工程系助教,研究方向为开发框架、数据挖掘、信息技术。
0引言
统一的开发框架将过去使用的公共方法、工具类、组件、模块等构建一个通用的J2EE开发框架,其主要目的是以后所有信息系统开发都采用统一的开发框架,规范信息化系统开发工作,降低公司项目开发风险和成本,缩短开发周期,使开发人员更多专注于业务逻辑实现,真正做到代码重用、框架重用\[1\],针对不同的系统功能定制框架,去掉冗余模块。同时,不断升级统一开发框架,根据不同的开发语言、不同的数据库,不断升级开源框架,尽量做到简单、易用、安全、稳定。
1开发框架
开发框架是一个传统的基于MVC模式的J2EE开发框架平台\[2\],采用多层结构,分别为展示层、控制层、业务逻辑层、数据访问层,每一层都对应一个常用的开源框架作为支撑。控制层采用Struts为控制器,目前在商业上应用较为广泛的是Struts1.x,较为稳定和安全。数据访问层采用Hibernate作为持久化关系映射框架。采用Spring IOC管理业务逻辑层、数据库访问层的对象。前端框架中包含了JQuery、图形框架JFreeChart、润乾报表等。图1为开发框架系统平台。
开发框架由基础组件、技术组件、业务组件构成。基础组件主要有系统安全、工具类、统一认证、统一权限、异常管理、日志管理、后台任务、系统监控、系统参数加载、系统业务代码管理等。技术组件主要由列表控件、表单控件、下拉框控件、时间控件等前端组件构成,主要用于展示页面。业务组件主要包含附件管理、高级查询、业务组织树、人员树、缓存框架定制查询等。基础组件作为系统最基本层,为系统提供初始化、安全、日志、监控、参数、公共代码、工具类等支撑,使系统安全、可靠、稳定。技术组件、业务组件用于构建页面元素,丰富页面功能,为界面操作性、友好性提供支撑。图2为系统结构图,展示了基础组件、技术组件、业务组件如何构建统一开发平台。
图1开发框架系统分层图2统一开发平台结构
1.1展示层
展示层主要由JQuery、JFreeChart、润乾报表等前段展示框架构成。JQuery\[3\]为Ajax前端框架,用于构建展示页面和实现前端业务逻辑、控制逻辑,具有丰富的方法和组件,其提供了十几种图片组件,为开发框架构建了功能丰富的前端框架。JQuery是一个开源前端框架,可以根据原有的开源代码进行扩展,使扩展后的方法、组件更加适用于系统业务功能的实现。开发人员可以使用JQuery的树、表单、列表、菜单、图片等组件构成一个复杂的功能页面并展示出来。
JFreeChart和润乾报表作为统计分析、制作报表的框架和工具,具有丰富的模板。JFreeChart提供区域图、柱状图、折线图、饼图、组合图等3D和2D图形,可以满足各种展示和查看需求。润乾报表提供报表展示和报表导出功能,直观的数据和丰富的报表样式,给予用户丰富的体验。
1.2控制层
开发框架的控制层采用Struts1.3\[4\]为逻辑控制层,主要响应和处理用户请求。开发框架提供了一个控制层基类Action,对于一些基本控制逻辑进行统一处理,规范逻辑层编写规则,提高了系统安全性。控制层基类主要提供权限校验、关键字符过滤,以及调用统一异常处理组件、监控组件、日志组件等,开发人员在开发过程中将不用关心异常、日志、权限等问题的处理,只专注系统业务逻辑的实现,降低了开发人员的要求,减少了重复代码编写,提高了开发效率。
1.3业务逻辑层
开发框架的业务逻辑层十分简单,为功能的实现提供了一个接口、一个实现类,以及封装了控制层传递给业务逻辑层的参数类。业务逻辑层封装一个抽象的基类,提供一些共通的方法,每个业务类都扩展到该基类,实现共通的抽象方法。当控制层调用逻辑层时,如果需要传递参数,就创建该业务类的参数对象,设置参数对象的属性值,然后再传递给业务逻辑层。在业务逻辑类实现过程中,对需要进行数据插入、更新、删除的方法加入Spring\[5\]特有的事务处理标注@Transactional,使用Spring框架进行统一的事务管理,减少事务控制代码的重复开发。业务逻辑层最为关键的地方是对Spring框架的引入,Spring提供了IOC容器和声明式事务管理,减少了组件之间的依赖关系,通过IOC的配置,使组件得到了最大可能的重复利用。Spring的IOC依赖注入主要是对控制层Action类注入Service接口和对业务逻辑层Service类的Dao接口。对数据库访问的事务控制主要在Service类调用Dao的delete、update、insert等涉及数据操作方法时使用。
1.4数据访问层
开发框架的数据访问层采用Hibernate,一个轻量级的持久化开源框架,提供了强大的数据库访问支撑,为开发提供了很多方便,程序员不需要关心底层数据库类型,只要在基类中封装好通用的数据库访问方法,极大提高了开发效率。当然对于复杂的实体关系和相关查询,也需要编写sql语句,减少HQL的编写。同时Hibernate提供性能优化策略:缓存、延迟加载、关联优化等,以提高查询效率。
2基础组件
基础组件主要有系统安全、工具类、统一认证、统一权限、异常管理、日志管理、后台任务管理、系统监控、系统参数、系统公共代码管理等。系统安全组件主要处理用户验证、权限验证、关键字符过滤、url连接过滤(黑名单、白名单)、跨站攻击过滤等。本模块主要采用Filter方式对用户请求进行过滤,依次进行用户登陆校验、资源访问权限校验、关键字符过滤、参数转码等,确保正确的用户访问,防止越界访问。
工具类是每个业务系统都会用到的,而且各个业务系统都要定制各自的工具类,适用于不同的场景,具有一定的共通性。统一开发平台构建统一、共通的工具类,提供不同参数,如参数、返回值、方法名称等,满足各种应用场景,使之在不同业务系统之间能很好地兼容和复用,提高开发效率。工具类主要有数值、日期、数据库、文件、FTP、WebService、报表、导出、权限等工具类。
认证:每个业务系统都有一个登陆管理模块,开发框架提取出统一的认证组件,在每个业务系统中都采用该组件进行用户登陆管理,不管是单点登陆,还是统一认证都可以使用该组件。其兼容性强,不同的前端框架都提供强大支持。
每个系统需要访问统一权限平台,获取业务系统角色和角色权限,减少开发人员为权限而花费时间,缩短开发周期。
异常管理为业务系统提供统一的管理,是非常重要的模块,可保证系统稳定性、健壮性。异常分为Error和Exception,其中Exception又分为RuntimeException、非RuntimeException。Error为系统运行过程中的内部错误,以及资源耗尽的情形。RuntimeException为指针越界访问、类型转换、空指针等,这个是程序员编写代码造成的错误。非RuntimeException一般为外部错误,如IOException。异常管理处理办法将所有异常在控制层进行处理,Service层、Dao层不对异常进行处理,直接抛出异常。根据抛出异常对象类型,在控制层进行分类保存到数据库,然后系统维护人员、开发人员根据异常管理界面查看异常信息。如果异常是Error和非RuntimeException,如IOException、内存不够、数据库连接等异常,维护人员要查看文件系统是否有文件,要关闭系统运行的无效程序,减少内存损耗,查看数据库实例是否运行正常。如果异常为NullPointerException、类型转换错误、引用错误等异常,则需要开发人员修改相应代码。
2.1任务管理
主要提供后台任务管理。后台任务实现采用Quartz框架,只需实现org.quartz.Job接口,在Execute方法中编写执行逻辑。在MVC的J2EE项目中,可以通过在Spring配置文件中设置job的执行周期,配置任务执行方法。如果不通过Spring配置job,也可以直接在代码中执行周期,在服务器启动时同时启动quartz调度器。但是这种方式不灵活,因为在服务器上发布应用后就不能修改任务调度参数了。
开发框架提供了一个后台任务管理模块,在后台任务管理页面上灵活配置后台任务调度信息,如Cron表达式、后台任务执行类、执行方法、优先级等,然后通过启动按钮控制来启动后台任务,通过停止按钮控制正在运行、等待执行的后台任务。通过该模块,可以实时新增任务,修改任务执行参数,停止后台任务,不需要每次都去修改配置文件,使后台任务更加灵活可控。
2.2公共代码管理
传统MIS系统会为业务对象的每个维度都维护一张表或者存放静态变量,如果这样,将大量增加开发工作量和系统复杂度,而且维护成本也会增加。公共代码管理模块将这些业务对象的维度抽取,统一维护,建立共通的代码,提供需要的业务功能模块,以降低工作量和难度。
公共代码模块主要维护代码和维度值的对应关系,然后提供一个共通的方法获取维度。在前端展示维度时,显示公共代码值,不用关心维度值的代码。当存放业务对象维度时,将公共代码存放到维度字段中。系统的业务功能有层级关系,维度展示样式有列表和树,所以公共代码模块的表需要设计为树结构,便于展示和实现,同时提供前端维护界面,方便开发人员使用。通过新增、编辑、删除维护公共代码,通过导入、导出,升级维护系统公共代码。
2.3系统参数
系统参数加载作为系统启动时初始化参数,如登陆方式、白名单、黑名单、FTP配置、加密方式等系统相关参数,存放在数据库系统参数表中,每次启动系统时,自动加载表中的系统参数数据,不用每次去修改系统参数类。同时,提供系统参数配置界面,通过界面维护系统参数数据,重新加载参数。设置系统全局静态变量,不用重新在服务器上发布系统,提高了系统灵活性。
2.4日志管理
系统运行日志一般都存放在一个文件中,运维人员每天定时去服务器上调取日志文件,上传到FTP,然后程序员花费大量时间从日志文件中查找异常,分析问题,整个过程繁琐、复杂,效率极低。日志管理模块省去这些步骤,将日志分类存放到数据库中,程序员可以直接在日志管理界面中查找、过滤error类型日志,提取日志信息,分析并解决问题。
开发框架日志管理模块采用log4j记录日志。该模块将日志分门别类保存到数据库表中,为系统开发人员提供日志管理界面。开发人员通过日志界面查看错误日志信息。log4j日志级别从低到高分别为debug、info、warn、error、fatal,一般log4j配置error级别,系统后台代码异常、错误通过日志管理模块记录到数据库。对于前段代码,需要特殊处理,初始化前端时,需要为Windows对象绑定error事件处理方法,该方法将前段错误日志记录并调用后台代码保存到数据库中。
3技术组件
技术组件主要封装前端页面元素,使页面的元素组件化、对象化,可以直接使用对象创建一个实例,直接使用,减少页面构建时间。如参数封装、日期时间组件、通用弹出框、下拉复选框、下拉复选树、界面通用初始化方法、常量、搜索组件、下拉图选择组件等采用共通方法。表1为JQuery常用组件,每个类型都包含了多种展现组件\[5\]。
表1JQuery组件清单
类型[]常见组件
表单[]日期时间控件、批量输入框、带图片下拉框、下拉复选框、颜色选择控件、微调控件、表格下拉列表、星级评分控件等
菜单[]抽屉式菜单、下拉菜单、水平下拉菜单、上下文菜单、垂直菜单、导航菜单、多层级树形菜单、可折叠菜单等
表格[]带过滤条件的表格、表格动态分页、分组表头、列表树、表格列锁定表、格本地分页、表格比率条、缓冲式表格等。
树[]Treeview、jstree、filetree、zTree等
Tab页[]可滚动的tab控件、MagicTabs、idTabs、UI Tabs Paging等
地图控件[]jHERE、JMaps、谷歌地图控件GMAP3、矢量地图控件JQVAMP、GPS、百度地图标注控件等
分页[]Pagingnation
Tip提示[]PoshyTip、Opentip、DToolTip、气泡提示控件、消息通知控件等。
验证[]Validation
图片组件[]Imgareaselect、easy slide、easynew、jqzoom、thickbox、prettyphoto、slider gallery等
4业务组件
业务组件为一个需要和后台交互的、共通的前端组件,如业务组织树、单位树、基准组织树、附件管理、界面初始化共通、高级查询等。从不同项目的业务功能中提取一些共通的功能,进行封装、组件化,方便程序员使用。不需要实现后台逻辑和前端复杂代码,直接在前端创建对象,给对象传递相关参数,实现想要的功能。为了使用某些业务组件,如附件管理、高级查询,需要数据库表支撑,对于不同的数据库,也需要提供不同的建表脚本。
5结语
统一的开发框架平台采用经典MVC分层设计,集成Struts、Spring、Hibernate、JQuery等开源框架,每层分工明确,提供了公共组件、工具类、功能模块,构建了一个基础的、通用的开发框架,解决了信息系统开发框架搭建问题,提高了效率、降低了成本,同时提高了信息系统的可靠性、安全性、可控性。
参考文献参考文献:
\[1\]周晓锋,刘馨月,张靖波.基于可重用组件技术的软件开发方法\[J\].信息技术,2005(11):139142.
\[2\]陶国荣.jQuery权威指南\[M\].北京:机械工业出版社,2011.
\[3\]TED N HUSTED, CEDRIC DUMOULIN, GEORGE FRANCISCUS, et al. Struts in action\[M\].New York: Manning Publications Co,2002:125150.
\[4\]CRAIG WALLS.Spring in action\[M\].3rd Edition耿渊,张卫滨,译.北京:人民邮电出版社, 2013:100125.
\[5\]MARTIN FOWLER.企业级应用架构中模式的应用\[M\].王怀民,周斌,译.北京:机械工业出版社, 2003:225245.
责任编辑(责任编辑:杜能钢)