`
yongtree
  • 浏览: 233956 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

RichFaces自动构建树实现

阅读更多

树形结构在软件系统中是使用频率非常大的一种数据结构,包括一些算法的实现也是基于树形结构来进行的,比如基于二叉树的二分查找法等等。在软件系统中,树形结构更多的体现在树形菜单的构建上。对于树形结构我们都能抽取出一个统一的类结构。比如:

Java代码
  1. public class TreeNode{   
  2.     private String value;//树节点的值   
  3.     private String label;//树节点显示标签   
  4.     private boolean leaf;//是否是叶子节点   
  5.     private TreeNode parent;//父节点   
  6.     private List<TreeNode> childern;//孩子结点集合   
  7. }  

  通过这个简单的结构我们就能构建一个最基本的树。当然我们使用richfaces,它已经给我们提供了这样的树形结构接口和默认的实现类。我们可以通过使用默认的实现类来构建树,也可以实现它的接口来自定义一个树。

  在OECP系统中,无可避免的存在着大量的树形结构,最典型的就是组织结构,这些树形结构充斥在系统的各个角落,作为最常用的,也是非常通用的结构和实现方式,我们需要一个统一的规划和设计来处理,以便减少程序员重复的代码编写,既可以提供未来开发的效率同时也降低了维护的成本。RichFaces提供的<t:tree>已经是一个高度集成的树形结构UI,我们在UI层上的工作除了把类似于组织机构这样常用的组件封装成统一的标签调用之外,我们不需要再做额外的处理。我们需要在数据结构的统一构建上做些文章。在构建之初,我们面临着几个问题。

  1、 返回树形结构的数据是不是业务组件的工作,需不需要考虑UI
  2、 是一次完成构建树还是动态构建树

  针对第一个问题,我认为返回树形结构的数据是不是属于业务范畴很难界定,但是业务组件不应该绑定UI组件,应该是客户端技术无关性的,这就造成业务组件即使封装了树形结构的数据,在UI表现上仍要针对UI组件进行一次树与树的转换,这无疑增加了两端的开发量,造成无谓的消耗。所以,我们不考虑在EJB业务组件端进行树形结构的数据封装,而是直接返回相应的列表。

  针对于第二个问题,我们考虑到我们使用技术体系,选择了一次完成构建树。为什么选择这种方案,有什么优缺点呢?影响EJB分布式系统性能的关键是分布式调用带来的网络资源的消耗,要降低这种消耗,就要减少对分布式组件的调用。一次性返回所有的数据就是要减低这种调用EJB的频率。同时一次性构建树,在构建树的工具类中,我们只需要处理这个List就可以了,而无须再次理会调用EJB,适合封装成统一的、适当通用的组件。但是构建过程可能比较麻烦,如果List中包含的实体类的结构不一致,构建的过程更复杂。动态构建树在书写上会比较简单,但是需要EJB组件提供更多的接口,而且由于构建过程中要不断调用EJB,所以很难和EJB调用解耦,无法工具化处理。同时,在OECP项目中,所有的实体类都进行了统一的规划设计,抽象了统一的基础结构和操作,这给我们统一构建树带来了更大的方便。

  现在开始介绍基于RichFaces树的封装。
  先看看树形结构效果图:

  页面代码片段:

XML/HTML代码
  1. <rich:tree style="width:300px"  
  2.                         value="#{resourceRegisterAction.resourceTree}" var="item"  
  3.                         switchType="client" ajaxSubmitSelection="true"  
  4.                         reRender="info,create,popMsg"  
  5.                 nodeSelectListener="#{resourceRegisterAction.processSelection}"  
  6.                         ajaxKeys="#{null}">  
  7.                         <rich:treeNode>  
  8.                             <h:outputText value="#{item.name}" />  
  9.                         </rich:treeNode>  
  10. </rich:tree>  

注:#{resourceRegisterAction.resourceTree}要实现Richfaces提供的TreeNode接口的实现ajaxSubmitSelection="true"说明是AJAX的提交方式,reRender="info,create,popMsg"这个很重要,表明该操作返回的数据要渲染的组件,比如回填Form,该处需要Form的ID,这样才能保证数据回填到特定的Form上,否则页面数据不变化。选择树节点需要进行相关的操作,就必须实现nodeSelectListener。
Action构建树代码:

Java代码
  1. public TreeNode<FunctionResourceEO> getResourceTree() {   
  2.             if (resourceTree == null) {   
  3.                try {   
  4.                 List<FunctionResourceEO> list = ResourceServiceDelegate   
  5.                         .getInstance().getAllResources();   
  6.                 FunctionResourceEO func = new FunctionResourceEO();   
  7.                 func.setName("功能资源");   
  8.                 resourceTree = new RichTreeConverter<FunctionResourceEO>()   
  9.                         .list2tree(list, func);   
  10.               } catch (Exception e) {   
  11.                   e.printStackTrace();   
  12.               }   
  13.           }   
  14.             return resourceTree;   
  15. }  

  通过ResourceServiceDelegate.getInstance().getAllResources()得到所有的功能资源信息,EJB端只需要将所有的资源列表返回即可,简化了EJB组件数据运算以外的操作。最关键的是new RichTreeConverter<FunctionResourceEO>().list2tree(list, func);通过这个工具类将list转化成RichFaces树的数据结构。该构造过程采用深度优先遍历算法,在效率上还需要改进,希望大家能批评指正。限于篇幅是该工具类的代码和实体抽象类的代码请查看原文:http://www.po-soft.com/blog/yongtree/324.html

  希望该RichFaces自动构建树实现能带给各位朋友以抛砖引玉的作用,有什么问题可以写下您宝贵的留言,大家一起探讨共同进步,谢谢!

 

《RichFaces自动构建树实现》转载自百洋软件研究实验室

分享到:
评论
1 楼 yourenyouyu2008 2010-12-21  
最简单的richfaces tree使用方式
http://yourenyouyu2008.iteye.com/blog/798333

相关推荐

    richfaces自动构建树实现.docx

    RichFaces 自动构建树实现 RichFaces 自动构建树实现是基于 Java 语言和 RichFaces 框架的树形结构实现。树形结构在软件系统中非常常见,包括树形菜单的构建、基于二叉树的二分查找法等等。RichFaces 提供了树形...

    richfaces 相关资料2

    6. **RichFaces自动构建树实现.pdf** - 类似于前面的文档,这个PDF文件可能提供了更详细的步骤或示例,指导读者如何使用RichFaces自动构建树结构。 **总结** RichFaces是一个流行的JavaServer Faces (JSF)组件库,...

    richfaces中文开发文档

    2. **组件丰富**:提供了一系列预构建的JSF组件,如数据表、日历、图表、滑块、树形结构等,这些组件不仅功能强大,还支持多种皮肤和主题。 3. **事件处理**:通过Ajax事件处理机制,可以实现异步操作,使得用户...

    richfaces实战(目前市面上最好的richfaces资料)

    在《Practical RichFaces》一书中,作者Max Katz详细介绍了如何利用RichFaces框架来构建高效、易用的企业级Web应用。本书被认为是目前市面上关于RichFaces的最佳资料之一。 #### 二、RichFaces的特点 1. **强大的...

    Simple JSF application with RichFaces

    根据给定文件的信息,我们可以提炼出关于如何构建一个简单的JSF应用并集成RichFaces的关键知识点。下面将对这些知识点进行详细的阐述。 ### 一、简述 本文档旨在指导开发者如何构建一个简单的JavaServer Faces ...

    Practical RichFaces, 2nd Edition

    - **第14章:RichFaces CDK:构建自定义组件** - 教授如何利用RichFaces组件开发工具包(CDK)来开发自己的组件。 #### 五、深入理解核心概念 本书不仅提供了详细的组件使用教程,更重要的是强调了对JSF和RichFaces...

    RichFaces 4 Developer Guide

    ### RichFaces 4 开发者指南 #### 一、引言 RichFaces 4 是一款功能强大的企业级...通过掌握这些知识点,开发者不仅可以更好地利用 RichFaces 4 构建出高效、美观的应用程序,还能深入理解其背后的原理和技术细节。

    EXTJS+RICHFACES

    3. **丰富的组件库**:包括表格、树形视图、图表、日期选择器等多种组件,可快速构建复杂界面。 4. **皮肤和主题**:提供多种预定义的皮肤和主题,方便调整界面风格,解决界面样式难以调配的问题。 5. **服务器端和...

    seam 2.x web development

    对于涉及复杂业务流程的应用程序,Seam 2.x内置了强大的工作流引擎,可以方便地实现各种业务逻辑的自动化处理。这有助于提高系统的灵活性和可扩展性。 **4. 国际化与本地化** Seam框架支持多语言环境下的国际化和...

    JSF Spring hibernate2

    RichFaces组件包括表格、图表、树形结构、对话框等,这些组件大多支持Ajax,可以实现部分页面的刷新,提高应用的响应速度。 在"JSFSHTest2"这个项目中,很可能是在原有的JSFSHTest1基础上进行了扩展和优化,加入了...

    JSF电子书两本打包

    3. **Component Tree**:JSF维护一个组件树,每个UI组件都在树中有一个位置,这使得组件之间的通信和状态管理变得简单。 4. **Lifecycle**:JSF有六种生命周期阶段,包括初始化、应用请求值、处理验证、更新模型值、...

    JSF概论

    3. **模型(Model)**:模型通常由JavaBeans或EJBs实现,存储并处理业务数据。JSF通过EL(Expression Language)来访问和操作模型对象。 4. **控制器(Controller)**:JSF的控制器是通过事件驱动机制工作的。当...

    JSF2新特性以及配置

    **JSF2(JavaServer Faces 2)是Java EE平台上的一个用户界面框架,用于构建Web应用程序。在JSF2中引入了许多新...在实际项目中,结合JSF2的社区支持和扩展如RichFaces,可以创建出交互性强、功能丰富的Web应用程序。

    JBoss Seam入门介绍

    构建基于Seam的应用程序涉及利用上述特性来设计和实现功能。从创建组件、定义业务逻辑到整合前端界面,Seam提供了一套完整的工具链和API,帮助开发者快速搭建企业级应用。例如,通过声明式状态管理,可以轻松管理...

    JSF教程

    有许多第三方库如PrimeFaces、RichFaces、IceFaces等提供了大量的UI组件和增强功能,丰富了JSF的开发体验。 **10. 实战演练** 通过实际的项目案例,学习如何使用JSF创建用户登录、注册、展示数据表等常见功能,...

    jsf 2.0(jar+源码+api+新特性示例)

    6. **内置AJAX支持**:JSF 2.0集成了Ajax功能,无需额外的库如RichFaces或PrimeFaces即可实现异步数据更新。 7. **Faces Flow**:提供了一种新的导航方式,使得大型应用程序的流程管理更加有序和可维护。 8. **CDI...

    《JSF入门》简体中文版

    10. **富客户端组件(Rich Client Components)**:JSF社区和厂商提供了大量的第三方组件库,如PrimeFaces、RichFaces等,它们提供了丰富的富客户端组件,如图表、树形结构、日期选择器等。 通过阅读《JSF入门》...

Global site tag (gtag.js) - Google Analytics