论坛首页 Java企业应用论坛

忘掉普元EOS、构建自己的企业级快速应用开发平台

浏览 83294 次
精华帖 (0) :: 良好帖 (14) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2008-08-25   最后修改:2009-10-28

希望这篇文章能够对那些正在或即将开发自己团队的J2EE应用快速开发平台的个人或公司能有所启发!    

      像EOS这样动辄几十上百万的平台不是每个公司都愿意花钱去买的!因此构建一套穷人级的企业快速开发平台成了很多团队的首选,而对于小团队来说,构建一套自己可以维护的开发平台才是最重要的。下面,我将以我的平台的开发过程为例来详细解析这个过程!  

“如果能把项目中大量的代码编写工作变得轻松,是多好的一件事!  "

        在使用了AppFuse之后,我有个想法,能不能利用velocity这个优秀的模板引擎,用一种更加直观的模式,把开发项目中的重复代码让它自动生成, 生成之后的基础代码,按照实际的需求稍作修改便可以运行,极大的提高工作效率。这样的话,程序员就可以从大量的重复劳动中解放出来,将精力更多的投入到业 务分析及学习中。

        这个想法一直在我的脑海里横亘不去,尤其在做了大量的重复模块后,深刻体会了重复Coding的那种浪费生命的痛苦后,这种冲动尤为强烈。

         离开旧公司,到了新公司之后,由于职位和公司定位的不同,让我有时间开始把快速开发平台和自动代码生成器的开发真正的摆上开发日程上了。

          第一步 ,自动代码生成器生成 的是业务模块,那么底层必须有一套框架能够为它提供支撑,而且这套基础框架要足够灵活,并且和单个模块的耦合性要比较弱。要解耦模块之间的联系,势必要用 到MVC分层设计。感谢Java的开放性,使它有这么许许多多的MVC框架可以使用。我采用的当然是目前最流行的 SSH(Struts+Spring+Hibernate)的组合(以前项目一直在用,也有些成熟的积累),花了三个月的时间,通过一个项目的实际应用来 使这个框架基本成型。其目前功能包括:

        1:灵活完善的权限管理功能(包括用户管理、角色管理、组织机构管理、资源管理、资源角色映射管理...)。原来计划采用开源的JGuard来托管这部分 的功能,因为一些特殊的原因放弃了(考虑要和工作流引擎的权限部分做集成),只采用了其权限管理的一些设计思想。

        2:基于Spring的AOP实现的日志和权限管理(通过Spring的代理也将Struts的Action托管了,使的对Action的调用也能被 AOP侦测到),这样对每个功能的调用,如果需要日志纪录的话,之间将其配置到Spring的配置文件中就可以了。

        3:UI上实现了类似.NET的Validation验证,这点很重要,想必大家都深刻体会到利用JavaScript或Struts的验证机制来实现前端页面数据验证的痛苦了吧:),我们实现的功能如下图所示:

       

        4、多套UI风格样式。这个不是很必须,但是作为一套成功的系统,良好的用户体验也是必不可少的。

        5、支撑模块:2套报表引擎(一个是基于JasperReport实现的B/S版本报表;另外一个是类Excel的报表引擎),流程引擎(其实就我个人来看,工作流引擎才是这套系统的灵魂 ,有了它,所有流程性应用包括表单、业务流、权限都可以通过配置并结合Beanshell脚本来获得 ,以下是我们报表和流程设计器的一些截图:

 

 

工作流引擎截图

 

报表截图

 

        6、i18n的支持,由于我们有很多国外的客户,这块是必须的。

 

有了这个基础支撑平台之后,就可以开始着手开放我们的代码生成器了。

        第二步 :开发代码生成器。 AppFuse基于Ant的自动代码生成模式让我深恶痛绝,究其原因,一句话--“不够人性化”,我们做的首先必须考虑可用性,因此决定采用可视化的UI 模式。由于我用的是NetBean编辑器,做可视化的Swing开发不成问题(这点要感谢SUN啊,出了个和VB一样简单的IDE)。我实现的代码生成器 的界面如下:

  

 

怎么样?是不是够傻瓜化啊?呵呵,是个人都能用啊!

       从上面大家可以看到,我们这个代码生成器和Hibernate的POJO对象生成工具类似,也是基于数据库的模型来生成代码的,不同的是,我们生成的代码 范围更广,不仅包括了POJO对象暨相应的hbm.xml文件,另外还包括相应的DAO(Server层)、相应的Action、Form类、相关的 JSP文件(list页面、edit页面、Excel导出页面等等)、资源文件及相关的Struts和Spring的配置子文件(Struts和 Spring均支撑将配置拆分成多个配置,我们利用这种特性来减低模块之间的耦合性。)

        至于数据库模型的获得,可以利用JDBC的MetaData(元数据模型) 的功能来获得,我们目前维护了表的完整的主键、外键关系(父子表)

 第三步:配置模板。有了可视化的数据库表映射模型,也获得了数据库表及其主外键关系的详细信息,接下来当然是根据这些信息来生成代码了。这里我们用了强大的Velocity模板 技术,这样不仅可以灵活的处理复杂的表映射对象之间的关系,也能够灵活的进行变更升级。而且我们能够通过所获得的数据库模型,在页面上自动实现基于Javascript的数据验证“非空验证、字符长度验证、数字验证,日期验证”。

          呵呵,通过以上3个步骤的工作,我们的基础开发平台和自动代码生成器就大功告成了!目前我们生成的代码可以直接编译通过,通过简单的系统配置后,可以直接在服务器上跑! 由于模板种类多,而且模板中自动实现的代码功能已经非常完善了,所以一些特殊的业务需求只需要在自动生成的代码基础上做简单修改就可以了!

         基础开发平台和代码生成器投入使用后,对我们项目开发的资源投入的改善是非常明细的,目前基于基础平台和代码生成器的配合,我们已经做了6、7个系统了,平均每个系统的 开发时间至少要比以前节约40%,有的项目甚至达到了80%以上(我们最高的一天,处理了40多个表的增、删、该、查的功能,及中文本地化)。而且,另外 很重要的一点,生成的代码无形中统一了程序员的设计风格,我们通过这套开发机制,能够最大限度的保证我们开发的系统质量,保证模块可以在不同系统之间的自 由迁移,最大限度的实现复用!在项目开发中节省出来的大量时间,也让我们可以去研究更多的开源中间件和系统,来增强我们的基础平台,从而形成一个良性的循 环!

 我们做了多套模板,能够针对单表操作,及父子表操作来自由组合搭配。以下就是我们系统的一些功能截图,除了中文化之外,基本上没有修改:

单表操作:

父子表关联操作:

 

 

================================================================

呵呵,这么长时间了,还有人关注这个帖子,谢谢大家的捧场了!
顺便通报一下我们平台目前的状况:
1、增加了Web Service接口功能,基于spring-xfire实现的,目前基于server这一层的所有接口,在代码生成器生成代码(或手工添加接口) 时,xfire会对其自动封装并对外暴露。并同时集成访问接口。程序员不用直接接触wsdl了(安全方面目前只是通过IP过滤来简单实现)。
   这样的话,同样基于平台的A、B两个独立系统,可以通过WebService进行相互调用,同时,从本地调用变更为webService调用不需要修改任何代码,只要修改配置文件的一行定义就可以了!
   这个应该算是我们平台的一个标志性的里程碑了吧!从一定意义上来说,这才真正成为一个开放的平台,算SOA化了,呵呵!

2、模板更加丰富了,基于工作流应用我们目前已经有了一套通用模式,可以和流程引擎进行无缝结合!针对流程应用的模板可以生成绝大部分引擎相关部 分的代码,程序员只需要修改流程定义模板的名称就可以了!同时针对一对多,一对一关系的模板进行了大量优化,能够适应更多的企业应用场景了!

  目前的平台还是主要针对开发人员,是企业应用快速开发 平台,我们后续规划将其和我们已经有的一套应用快速搭建 平台进行整合,以使其能够同时被业务人员和开发人员使用。简单业务就由业务人员通过搭建平台的可视化的流程和表单配置来实现,复杂业务再由技术人员通过开发平台来实现。
   最后再谈一下应用快速开发平台的定位吧,相信这也是大家最近争论的一个焦点,说有用的有之,说用处不大的也有之。我个人的观点是:只要你的平台够灵活,模 板够多、够复杂、兼容的业务场景越多,它就有用,而且很有用;反之,如果平台底层呆板,模板简单,它的用处就不大。至于其它的什么维护的便利性什么的我就 不再多说了,免得有吹嘘之嫌了,反正大家仁者见仁,智者见智!套用一句常话就是---寒天饮冰水,冷暖自知!
  我个人目前的工作重点已经转移到企业应用快速搭建(配置)平台上来,目前也有些心得,将其和应用快速开发平台的整合也颇有些成效,后续得空将续开些新博文,和大家共享,希望各位继续赏脸捧场!!!!

  • 大小: 56.4 KB
   发表时间:2008-08-25  
这种生成器太初级了,只能算工具级的
0 请登录后投票
   发表时间:2008-08-25  
用appfuse已经3年多了。感觉还行。我们所有的项目都是基于appfuse的。


佩服楼主的精神,不知道是否有共享的打算?

0 请登录后投票
   发表时间:2008-08-25  
惊鸿逝水 写道
这种生成器太初级了,只能算工具级的

类似普元的可视化业务流设计实际上在我们的工作流引擎中也有体现,完全可视化的业务流程拖拽设计。

至于代码生成器,我的设计原则就是一定要尽量简单,其实其也不可能复杂,它无非就是维护一个数据库中表、主键、外键关联的一个映射而已,生成代码的复杂性其实都体现在代码模板中了!

 

0 请登录后投票
   发表时间:2008-08-25  
业务流程设计也不是什么新东西,关键是能定义一个好的业务流程Schema,拖拽爱怎么实现都行。
平台级的代码生成器,需要考虑:
1、正向向导生成代码
2、代码逆向生成向导
3、必要的编译检查。

以上不是一个简单模板可以实现
0 请登录后投票
   发表时间:2008-08-25  
惊鸿逝水 写道
业务流程设计也不是什么新东西,关键是能定义一个好的业务流程Schema,拖拽爱怎么实现都行。
平台级的代码生成器,需要考虑:
1、正向向导生成代码
2、代码逆向生成向导
3、必要的编译检查。

以上不是一个简单模板可以实现


"逆向",服了,怎么生成? 基于Hibernate Model生成数据库表?
复杂化了,同学!!

另外在楼主的项目中又看到了我的表单验证框架的影子,

另外楼主可以看下我的项目,为代码生成器开发一套GUI,还是太麻烦了
http://code.google.com/p/rapid-framework

0 请登录后投票
   发表时间:2008-08-25  
说实话,楼主的代码生成器还是很简单的,有很多的问题没有考虑到,更不用提什么忘掉eos了,普元的eos还是很厉害的,非常佩服eos studio的开发团队,尽管是竞争对手...
帖一张我们团队实现的代码生成工具的结构图吧,惭愧的说对eos studio还是参考了一点点滴
哪位感兴趣我可以在下面详细解说

另:velocity是很强大,但是其有一个致命的缺点,我们都在搞代码生成,我们也都知道大部分代码生成完之后肯定会被开发人员修改,添加业务逻辑等等,那么如果重新生成呢,就会把开发人员修改的内容覆盖掉了,在这一点上eclipse jet就做的比较好了,我们也正在考虑从velocity迁移到jet上面
  • 大小: 36.8 KB
0 请登录后投票
   发表时间:2008-08-25  
惊鸿逝水 写道
业务流程设计也不是什么新东西,关键是能定义一个好的业务流程Schema,拖拽爱怎么实现都行。
平台级的代码生成器,需要考虑:
1、正向向导生成代码
2、代码逆向生成向导
3、必要的编译检查。

以上不是一个简单模板可以实现

呵呵,要澄清一下,这里的流程引擎可以生成流程业务需要的表单和业务流控制,可以基于流程定义生成持久化对象和后台存储,其和这里的代码生成器完全没有关系,代码生成器是用来处理非流程应用的代码生成工作。
由于流程引擎我们用的是反编译重构的商用系统,这里就不便透露更多信息了。除此之外,其它用的基本上都是开源产品和组件

0 请登录后投票
   发表时间:2008-08-25  
badqiu 写道
惊鸿逝水 写道
业务流程设计也不是什么新东西,关键是能定义一个好的业务流程Schema,拖拽爱怎么实现都行。
平台级的代码生成器,需要考虑:
1、正向向导生成代码
2、代码逆向生成向导
3、必要的编译检查。

以上不是一个简单模板可以实现


"逆向",服了,怎么生成? 基于Hibernate Model生成数据库表?
复杂化了,同学!!

另外在楼主的项目中又看到了我的表单验证框架的影子,

另外楼主可以看下我的项目,为代码生成器开发一套GUI,还是太麻烦了
http://code.google.com/p/rapid-framework


其实是看你的定位是什么,如果简单的定位于代码生成工具的话,那么基本上生成出来的代码还要经过大量的修改才能被项目开发人员所用
惊鸿逝水说的三点我认为说到了点子上,平台级的代码生成器确实要考虑这三点,也就是引导项目团队的开发方式
0 请登录后投票
   发表时间:2008-08-25  
lszwycn 写道
badqiu 写道
惊鸿逝水 写道
业务流程设计也不是什么新东西,关键是能定义一个好的业务流程Schema,拖拽爱怎么实现都行。
平台级的代码生成器,需要考虑:
1、正向向导生成代码
2、代码逆向生成向导
3、必要的编译检查。

以上不是一个简单模板可以实现


"逆向",服了,怎么生成? 基于Hibernate Model生成数据库表?
复杂化了,同学!!

另外在楼主的项目中又看到了我的表单验证框架的影子,

另外楼主可以看下我的项目,为代码生成器开发一套GUI,还是太麻烦了
http://code.google.com/p/rapid-framework


其实是看你的定位是什么,如果简单的定位于代码生成工具的话,那么基本上生成出来的代码还要经过大量的修改才能被项目开发人员所用
惊鸿逝水说的三点我认为说到了点子上,平台级的代码生成器确实要考虑这三点,也就是引导项目团队的开发方式


多表关联操作这部分也可以生成,但开源的话定位还是通用/易用,所以不想在模板文件上搞的过于复杂,难以二次修改,而且view这一层,要定制的东西实在太多.
而现在rapid上的模板文件已经满足普通的增删改查需要,简单修改就可以适应自己的项目.

并且rapid的野心并不只这些,以后的flex,ext2等view界面都会以插件的方式加入进来.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics