RichFaces自動構建樹實現

樹形結構在軟件系統中是使用頻率很是大的一種數據結構,包括一些算法的實現也是基於樹形結構來進行的,好比基於二叉樹的二分查找法等等。在軟件系統中,樹形結構更多的體如今樹形菜單的構建上。對於樹形結構咱們都能抽取出一個統一的類結構。好比:html

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,它已經給咱們提供了這樣的樹形結構接口和默認的實現類。咱們能夠經過使用默認的實現類來構建樹,也能夠實現它的接口來自定義一個樹。node

  在OECP系統中,無可避免的存在着大量的樹形結構,最典型的就是組織結構,這些樹形結構充斥在系統的各個角落,做爲最經常使用的,也是很是通用的結構和實現方式,咱們須要一個統一的規劃和設計來處理,以便減小程序員重複的代碼編寫,既能夠提供將來開發的效率同時也下降了維護的成本。RichFaces提供的<t:tree>已是一個高度集成的樹形結構UI,咱們在UI層上的工做除了把相似於組織機構這樣經常使用的組件封裝成統一的標籤調用以外,咱們不須要再作額外的處理。咱們須要在數據結構的統一構建上作些文章。在構建之初,咱們面臨着幾個問題。程序員

  一、 返回樹形結構的數據是否是業務組件的工做,需不須要考慮UI
  二、 是一次完成構建樹仍是動態構建樹ajax

  針對第一個問題,我認爲返回樹形結構的數據是否是屬於業務範疇很難界定,可是業務組件不該該綁定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樹的數據結構。該構造過程採用深度優先遍歷算法,在效率上還須要改進,但願你們能批評指正。限於篇幅是該工具類的代碼和實體抽象類的代碼請下載下面的pdf文件進行閱讀。ide

  但願該RichFaces自動構建樹實現能帶給各位朋友以拋磚引玉的做用,有什麼問題能夠寫下您寶貴的留言,你們一塊兒探討共同進步,謝謝!

 

相關文章
相關標籤/搜索