您的位置:首页 > 理论基础 > 计算机网络

MyFaces Tree2控件使用 -----From http://blog.163.com/net_wood/blog

2008-06-05 10:02 501 查看
MyFaces开源网站: http://www.irian.at/myfacesexamples/home.jsf
================================================

JSF Tree2 实践
原址:http://www.blogjava.net/steady/archive/2005/12/01/22068.aspx
通过一次小小的实践,终于了解如何使用tomahawk中的tree2这个组件了,并且写了小段程序,从xml中读取树的结构,生成一个tree,不过tree2不能直接和xml绑定是一个遗憾,那样就会省不少事情了。记下一点心得,以供后来参考了。

对tree2的操作分为两部分,一部分是在页面中通过tag定义样式相关的东西,一部分就是通过编程添加树的节点,起初看了sample以后总是以为这东西有多么的复杂,其实逻辑是很简单的,只是sample中定义了多种不同的样式的节点,看上去很复杂而已。

下面附上我对sample简化过的这段tag来说明一下。

<t:tree2 value="#{catalog.node}" var="node" >"clientside" varNodeToggler="t" >

<f:facet >"folder">

<h:panelGroup>

<f:facet >"expand">

<t:graphicImage value="images/yellow-folder-open.png" rendered="#{t.nodeExpanded}" border="0"/>

</f:facet>

<f:facet >"collapse">

<t:graphicImage value="images/yellow-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>

</f:facet>

<h:outputText value="#{node.description}"/>

</h:panelGroup>

</f:facet>

</t:tree2>

tree2的主tag定义了tree的根节点和一些相关的参数。嵌套的那个facet定义了一种节点的样式,包括展开与关闭时的图片,以及显示的文字内容。

在程序里面,我们root TreeNodeBase = new TreeNodeBase(…)来创建一个root节点,然后通过root.getChildren().add(new TreeNodeBase(…))为其添加子节点,任何一个节点都可以添加任意多的子节点,通过这样的操作,我们可以很容易的生成一个tree的结构了,实际上,这个tree的结构是通过递归从xml中读取出来,生成一个和xml tree完全相同的结构。

除了明白如何去用这个tree2之外的收获就是,终于明白了如何去通过递归方法遍历一个树形结构,虽然在学校里学过遍历的算法,也抄过例程,但从来没有理解过是怎么一回事,终于在实践中理解了,实践才是软件的根本之道。

程序的其它部分放在附件里面了,如果有兴趣了可以和我讨论tree2,讨论其它JSF的东西。

http://www.blogjava.net/Files/steady/catalog.rar

先拿回来收藏了再说,等验证后再把结果贴出来。

===========================================================================================

析Tree2(一) 原址:http://www.blogjava.net/steady/archive/2006/01/13/27904.html

在我的 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}" <t:tree2 id="serverTree" value="#{navigationBacker.treeData}"

var="node" varNodeToggler="t" clientSideToggle="false" showNav="false"

showRootNode="false">

<f:facet name="project-folder">

<h:panelGroup>

<h:commandLink action="#{t.toggleExpanded}" actionListener="#{navigationBacker.processAction}">

<t:graphicImage value="/images/yellow-folder-open.png"

rendered="#{t.nodeExpanded}" border="0" />

<t:graphicImage value="/images/yellow-folder-closed.png"

rendered="#{!t.nodeExpanded}" border="0" />

</h:commandLink>

<h:commandLink action="#{navigationBacker.toViewId}"

styleClass="#{t.nodeSelected ? 'documentSelected':'document'}"

actionListener="#{navigationBacker.nodeClicked}"

value="#{node.description}" immediate="true">

<f:param name="db_id" value="#{node.identifier}" />

</h:commandLink>

<h:outputText value=" (#{node.childCount})" styleClass="childCount"

rendered="#{!empty node.children}" />

</h:panelGroup>

</f:facet>

<f:facet name="person-folder">

<h:panelGroup>

NavigationBacker.java

这里有一段辅助代码用于从 h:commandLink 中获取 f:param 用于多种用途。

注:在上面的例子里,backing bean都存放于 session 作用域里,可以在WEB-INF/examples-config.xml 中进行配置。

很多朋友和我交流了一些有关 Tree2 的问题,我把一些大家经常碰到的问题拿出来,希望刚开始学习的朋友能够避免再犯一些这样的错误。

1.首先就是关于 myfaces 包的问题,Myfaces 1.1.1 release 版本的 Tree2 是有 bug 的,大概在十一月份的时候修正了大部分问题,但是由于这以后并没有 release 版本出来,所以大家可以使用一些较新一点的 Nightly Build,可以去这里找找http://cvs.apache.org/builds/myfaces/nightly/ ,不过从元旦后似乎改用了 Maven 后还没有一个 Build 出来,我手上有一个12.30 Build的版本,如果需要的话可以和我联系。因为这些 Nightly Build 不确定可能还会有其它的一些问题,所以用的时候要慎重一点。

2. 有些朋友就直接把代码贴上去用,会碰到一些诸如点击没有反应或者图标显示不出来的问题,很多时候是因为没有加上MyFaces' Extensions Filter,相关的内容可以参考我前面写的http://www.blogjava.net/steady/archive/2005/11/17/20170.html

希望这两篇介绍 Tree2 的文章能给大家一些新的认识,今后也会努力拿出更多更好的东西来和大家分享
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐