随笔 - 170  文章 - 536  trackbacks - 0
<2006年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

我参与的团队

随笔分类(103)

搜索

  •  

积分与排名

  • 积分 - 410456
  • 排名 - 134

最新评论

阅读排行榜

   

在我的 blog 中,JSF Tree2 组件一直都是一个热门的讨论话题,为了向大家介绍更多关于Tree2的内容,我翻译了这篇原产于 Apache Myfaces 社区的介绍 Tree2 的文章,希望大家能够对 Tree2 有更深的认识。

在最后会附上一些我在使用中的体会,和大家分享,如果大家有什么想法的话,可以和我多多交流了。本人第一次翻译文章,难免会有很多不足之处,请大家谅解,也请多多指点。

英文原作:http://www.blogjava.net/steady/archive/2006/01/12/27814.html

转载自:http://wiki.apache.org/myfaces/Tree2

正文如下:

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及宽带连接中使用的中型大小的树。对于大型的树,或者你需要照顾到一些低带宽的用户的需要时,你就需要使用服务端树。你可以通过<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 中嵌套facetJSF将会选出与 getType() 方法返回值同名的 facet 用于呈现。如果该节点没有找到相符的 facet,将会导致一个错误,并且这个方法不会返回null

List getChildren() 方法返回一个 List,其中包含了该节点下所有的 TreeNode,这就表示这些节点将被呈现为该节点下的子结点。该 List 不能包含 null,如果该 List 的大小和getChildCount()不符,将会报错。子结点将按照它们在 List 中的顺序呈现出来。

   后面一半的将会尽快完成翻译,大约今晚或明天就可以拿出来了。

posted on 2006-01-13 12:59 steady 阅读(2502) 评论(1)  编辑  收藏 所属分类: JSF & Myfaces

FeedBack:
# re: 解析Tree2(一) 2008-12-11 16:07 arron
你好 我在也在用tomahawk的tree2 整合facelets,不过一直没有成功,不知道什么原因  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: