程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 深入討論JSF中Tree2組件使用方法

深入討論JSF中Tree2組件使用方法

編輯:JAVA編程入門知識
 Tree2組件使用Html表格將你的數據呈現為一個樹。這個樹是動態的:當用戶點擊它們時它們可以展開或者折疊。該組件同時支持客戶端和服務端的交互方式,在客戶端交互時使用了javascript。在隨後的例子中,每次用戶的點擊將產生一個Request / Response 周期,並在新的視圖狀態(View State)中重新呈現新的樹結構。
  
  注:在後面的例子中只有可見的(已經展開的節點)數據被傳送到客戶端。而在第一個例子(客戶端Tree),在每個HTML Response中,整個樹都被發送到客戶端浏覽器。樹的每個節點都包含了不少的HTML代碼(假定每個節點200個字符,這個大小將取決於你希望在節點上顯示的信息的量),這些信息將被傳送到浏覽器,其中包括了那些不可見的節點(沒有展開的節點),因為它們的一個祖系節點被展開。假如你有一個深度有四層的樹,平均每個結點擁有四個子結點,這時候你就需要傳輸10 + 102 + 103 + 104 = 11 110個節點,每個節點有200個字符,這個樹總共就有2 222 000個字符,也就是2M的數據。這個例子將向用戶說明,雖然純客戶端Tree會給客戶端帶來更好的用戶體驗,但隨之而來的帶寬問題迅速的增長。純客戶端的樹適用於小型的樹,或者在Intranet及寬帶連接中使用的中型大小的樹。對於大型的樹,或者你需要照顧到一些低帶寬的用戶的需要時,你就需要使用服務端樹。你可以通過<?XML:namespace prefix = t />的clientSideToggle這個屬性來選擇你使用的是客戶端的樹或者服務端的樹,<t:tree2>的clientSideToggle這個屬性來選擇你使用的是客戶端的樹或者服務端的樹,<t:tree2 clientSideToggle="false" ...>將會使用服務端的樹,屬性值設為true將會使用客戶端的樹,默認值為true。
  
  Backing Bean:
  
  Tree2組件對Backing Bean中的一個TreeModel進行操作。通常情況,你只要把這個TreeModel綁定到這個組件上就可以了,就像這樣:
  
  <t:tree2 value="#{myHandler.treeModel}"
  下面需要建立一個類MyHandler,在faces-config.xml中的managed bean配置成myHandler,在例子中這個類提供了一個方法getTreeModel()用於返回一個TreeModel用於表示你的數據。
  
  public class MyHandler {
   public TreeModel getTreeModel() {
  ......
   }
  }
  TreeModel實際上是對TreeNode實例進行了一些簡單的包裝。
  
  TreeNode是一個接口,其中和tree2相關有四個方法:
  
  String getType()
  boolean isLeaf()
  List getChildren()
  int getChildCount()
  其它方法都沒有什麼用處了,可能會在今後的版本中取消。它們要求開發者在開發backing bean中做一些並不必要的操作。
  
  int getChildCount() 方法返回這個節點的子結點數量,這個方法了很輕易的采用如下的方式實現:
  
  public final int getChildCount() {
  return getChildren().size();
  }
  該方法的出現使得對於子結點的延遲加載變的可行。該方法的實現只需要返回該節點的子結點數量,而不需要返回每個子結點的實例。
  
  boolean isLeaf() 方法在該節點沒有子節點的時候返回true。這樣,一個很直截了當的實現可以這樣:
  
  public final boolean isLeaf() {
  return getChildren().isEmpty();
  }
  不管你提供了什麼樣的實現,在任何時間任何情況下你都得保持getChildren().isEmpty() ==> isLeaf()。isLeaf()方法實際上控制了節點被怎樣呈現:是否被當做樹葉節點(不能被繼續展開)。
  
  String getType() 方法決定了用怎樣的方式來呈現這個節點。在 JSF 頁面中,可以在 <t:tree2> 的Tag 中嵌套facet,JSF將會選出與 getType() 方法返回值同名的 facet 用於呈現。假如該節點沒有找到相符的 facet,將會導致一個錯誤,並且這個方法不會返回null。
  
  List getChildren() 方法返回一個 List,其中包含了該節點下所有的 TreeNode,這就表示這些節點將被呈現為該節點下的子結點。該 List 不能包含 null,假如該 List 的大小和getChildCount()不符,將會報錯。子結點將按照它們在 List 中的順序呈現出來。
  
  改變Tree中的內容
  
  (當展開樹的節點時,在後台延遲加載)
  
  在郵件列表中有很多關於這項任務的問題和討論,我(Marcel,一個 JSF 的初學者)在這裡總結一下。假如你有更好的解決方案,請更新這些文字。
  
  在這裡存在的一個問題就是我要這樣把“+”圖標去掉:
  
  · <t:tree2 ... showNav="false" ...>
   
  然後再讓文件夾圖標(代表包含子節點的節點)變的可點擊:
  
  · <h:commandLink action="#{t.toggleEXPanded}" actionListener="#{navigationBacker.processAction}">
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved