树形结构在软件系统中是使用频率很是大的一种数据结构,包括一些算法的实现也是基于树形结构来进行的,好比基于二叉树的二分查找法等等。在软件系统中,树形结构更多的体如今树形菜单的构建上。对于树形结构咱们都能抽取出一个统一的类结构。好比:html
经过这个简单的结构咱们就能构建一个最基本的树。固然咱们使用richfaces,它已经给咱们提供了这样的树形结构接口和默认的实现类。咱们能够经过使用默认的实现类来构建树,也能够实现它的接口来自定义一个树。node
在OECP系统中,无可避免的存在着大量的树形结构,最典型的就是组织结构,这些树形结构充斥在系统的各个角落,做为最经常使用的,也是很是通用的结构和实现方式,咱们须要一个统一的规划和设计来处理,以便减小程序员重复的代码编写,既能够提供将来开发的效率同时也下降了维护的成本。RichFaces提供的<t:tree>已是一个高度集成的树形结构UI,咱们在UI层上的工做除了把相似于组织机构这样经常使用的组件封装成统一的标签调用以外,咱们不须要再作额外的处理。咱们须要在数据结构的统一构建上作些文章。在构建之初,咱们面临着几个问题。程序员
一、 返回树形结构的数据是否是业务组件的工做,需不须要考虑UI
二、 是一次完成构建树仍是动态构建树ajax
针对第一个问题,我认为返回树形结构的数据是否是属于业务范畴很难界定,可是业务组件不该该绑定UI组件,应该是客户端技术无关性的,这就形成业务组件即便封装了树形结构的数据,在UI表现上仍要针对UI组件进行一次树与树的转换,这无疑增长了两端的开发量,形成无谓的消耗。因此,咱们不考虑在EJB业务组件端进行树形结构的数据封装,而是直接返回相应的列表。算法
针对于第二个问题,咱们考虑到咱们使用技术体系,选择了一次完成构建树。为何选择这种方案,有什么优缺点呢?影响EJB分布式系统性能的关键是分布式调用带来的网络资源的消耗,要下降这种消耗,就要减小对分布式组件的调用。一次性返回全部的数据就是要减低这种调用EJB的频率。同时一次性构建树,在构建树的工具类中,咱们只须要处理这个List就能够了,而无须再次理会调用EJB,适合封装成统一的、适当通用的组件。可是构建过程可能比较麻烦,若是List中包含的实体类的结构不一致,构建的过程更复杂。动态构建树在书写上会比较简单,可是须要EJB组件提供更多的接口,并且因为构建过程当中要不断调用EJB,因此很难和EJB调用解耦,没法工具化处理。同时,在OECP项目中,全部的实体类都进行了统一的规划设计,抽象了统一的基础结构和操做,这给咱们统一构建树带来了更大的方便。设计模式
如今开始介绍基于RichFaces树的封装。
先看看树形结构效果图:网络
页面代码片断:数据结构
注:#{resourceRegisterAction.resourceTree}要实现Richfaces提供的TreeNode接口的实现ajaxSubmitSelection="true"说明是AJAX的提交方式,reRender="info,create,popMsg"这个很重要,代表该操做返回的数据要渲染的组件,好比回填Form,该处须要Form的ID,这样才能保证数据回填到特定的Form上,不然页面数据不变化。选择树节点须要进行相关的操做,就必须实现nodeSelectListener。
Action构建树代码:分布式
经过ResourceServiceDelegate.getInstance().getAllResources()获得全部的功能资源信息,EJB端只须要将全部的资源列表返回便可,简化了EJB组件数据运算之外的操做。最关键的是new RichTreeConverter<FunctionResourceEO>().list2tree(list, func);经过这个工具类将list转化成RichFaces树的数据结构。该构造过程采用深度优先遍历算法,在效率上还须要改进,但愿你们能批评指正。限于篇幅是该工具类的代码和实体抽象类的代码请下载下面的pdf文件进行阅读。ide
但愿该RichFaces自动构建树实现能带给各位朋友以抛砖引玉的做用,有什么问题能够写下您宝贵的留言,你们一块儿探讨共同进步,谢谢!