随笔 - 170  文章 - 536  trackbacks - 0
<2005年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

我参与的团队

随笔分类(103)

搜索

  •  

积分与排名

  • 积分 - 410550
  • 排名 - 134

最新评论

阅读排行榜

通过一次小小的实践,终于了解如何使用tomahawk中的tree2这个组件了,并且写了小段程序,从xml中读取树的结构,生成一个tree,不过tree2不能直接和xml绑定是一个遗憾,那样就会省不少事情了。记下一点心得,以供后来参考了。

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

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

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

    <f:facet name="folder">

        <h:panelGroup>

            <f:facet name="expand">

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

            </f:facet>

            <f:facet name="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

posted on 2005-12-01 09:26 steady 阅读(10264) 评论(32)  编辑  收藏 所属分类: JSF & Myfaces

FeedBack:
# re: JSF Tree2 实践 2005-12-03 15:06 山人
你好,请问如何在字节点上设置超链接。比如点树的任一节点我想让页跳到我指定的页(x.jsp?id=123).
急用,请老兄帮帮忙.
我的email:taoyinzhou@hotmail.com  回复  更多评论
  
# re: JSF Tree2 实践 2005-12-04 10:15 steady
附上我页面的代码:
http://www.blogjava.net/Files/steady/catalogview.rar
我是用commandLink来做的链接,按照你的要求,可以用outputLink来做链接。
把我相应的代码替换掉就可以了。
后面的id=XXX,是在<f:param>里面指定的并且嵌套在outputLink里面。  回复  更多评论
  
# re: JSF Tree2 实践 2005-12-10 08:40 山人
你好,我那个问题如你说的已经解决了。

我是在做一个翻版的项目,以前是我用.net做(asp.net+C#+NHibernate+sqlServer)的,现要把它做成跨平台的java版,所以选用了jsf(myfaces)+spring+hibernate方案。整了快一个月了,终于调试通过了用户认证和功能树生产(数据库用mysql),感觉java是比.net复杂多了。
今天开始学用myfaces的dataScroller组件。  回复  更多评论
  
# re: JSF Tree2 实践 2005-12-10 14:04 steady
在现阶段,JSF在标准,实现,工具支持,第三方组件上要比ASP.NET差不少,特别是扩展,除了tomahawk好一点外就没有太多又免费又好用的组件了。工具上,我目前看到最好用的就是BEA Workshop Studio(M7 NitroX),最新版本是 3.0M2,支持最新发布的tomahawk的所有组件,可视化编辑功能也比较好。  回复  更多评论
  
# re: JSF Tree2 实践 2005-12-10 14:32 山人
没有用过 BEA Workshop Studio(M7 NitroX) ,我现在用eclipse3.1+myEclipse4.0(破解版).
JSF Myaces(tomahawk)虽然目前资源不多,不过我还是看好的。  回复  更多评论
  
# re: JSF Tree2 实践 2005-12-10 16:45 steady
我们这里做项目时用的是Exadel,感觉是对JSF支持的算是仅次于Workshop,目前来看MyEclipse感觉还是比较适合做struts时代的东西。  回复  更多评论
  
# re: JSF Tree2 实践 2005-12-20 17:13 山人
java.lang.IllegalStateException: Encountered a node [0] + with an illogical state. Node is expanded but it is also considered a leaf (a leaf cannot be considered expanded.
我在用tree2时出现如上错误,不知如何解决。
我把部门表生成tree2树显示,在新增和修改节点时显示正常;但我在删除节点时如果当前节点下有两个以上的子节点运行正常,当其下只有一个子节点时就出以上错误了。
这个错误出现后我关闭IE从新再打开此页,功能树又显示正常了。  回复  更多评论
  
# re: JSF Tree2 实践 2005-12-20 18:15 steady
在Myfaces的JIRA上有这样的错误报告,我也碰到过的,是一个bug,现在新的nightly build中没有这样的问题,但因为不是一个release版本,所以其他地方可能会有一些bug。  回复  更多评论
  
# re: JSF Tree2 实践 2005-12-21 09:38 山人
谢谢
问题解决了。我下了一个 myfaces-20051215 版本测试正常  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-04 09:48 山 人
你好,我在用户登录以后,想记录下用户名、用户ID、等信息,以备在登录后的其它页面中可以取出用户ID。在用纯jsp(java代码写在jsp页中)写代码时,可以在登录页面后把ID等定义为session如下:
session.putValue("UserID", Integer.toString(intUSERID)); //用户ID
session.putValue("UserName",User_Name);//用户登录名
session.putValue("UserGroupID","0");//用户组ID
我在登录后的其它页面中只用取出以上session就OK了。

请问在jsf中实现同样的功能应该如何做?配置如下,已经可以定义session,只是不清楚在登录后的其它Bean中如何取出session,因为我的功能树要根据谁登录的取对应的功能。

<managed-bean>
<description>
用户登录
</description>
<managed-bean-name>sysLogin</managed-bean-name>
<managed-bean-class>com.inphit.pms.web.system.SysLogin</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>serviceLocator</property-name>
<value>#{ServiceLocatorImpl}</value>
</managed-property>
</managed-bean>  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-13 11:07 巨土无比
你好,问个基础的问题:
rendered="#{t.nodeExpanded} 和 value="#{node.description} 里面的t和node是不是<t:tree2 value="#{catalog.node}" var="node" id="clientside" varNodeToggler="t" > 里面的var和varNodeToggler? 这两个有什么区别吗? nodeExpanded和description这两个方法是在哪里定义的?  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-13 11:13 steady
第一个var表示tree中的一个节点,即backing bean中new出来的new TreeNodeBase("folder", name, id, false);
varNodeToggler指的是当前tree节点的状态,展开或者关闭,可以参考javadoc中org.apache.myfaces.custom.tree2.TreeStateBase,这里使用了它的isNodeExpanded方法。   回复  更多评论
  
# re: JSF Tree2 实践 2006-01-13 11:33 巨土无比
我写了一个简单树,但是无法展开,只能显示根节点,帮忙看看哪里的问题:
jsp:
<f:view>
<t:tree2 id="clientTree" value="#{tree.treeData}" var="node" varNodeToggler="t" showRootNode="false">
<f:facet name="menu">
<h:panelGroup>
<f:facet name="expand">
<t:graphicImage value="images/person.png" rendered="#{t.nodeExpanded}" border="0"/>
</f:facet>
<f:facet name="collapse">
<t:graphicImage value="images/person.png" rendered="#{!t.nodeExpanded}" border="0"/>
</f:facet>
<h:outputText value="#{node.description}" styleClass="nodeFolder"/>
</h:panelGroup>
</f:facet>

<f:facet name="item">
<h:panelGroup>
<h:commandLink immediate="true" styleClass="#{t.nodeSelected ? 'documentSelected':'document'}" actionListener="#{t.setNodeSelected}">
<t:graphicImage value="images/document.png" border="0"/>
<h:outputText value="#{node.description}"/>
</h:commandLink>
</h:panelGroup>
</f:facet>
</t:tree2>
</f:view>
-------------------------------------
Tree.java:
public TreeNode getTreeData()
{
TreeNode treeData = new TreeNodeBase("root", "根", false);

// construct a set of fake data (normally your data would come from a database)

// populate Frank's portion of the tree
TreeNodeBase menuNode = new TreeNodeBase("menu", "产品管理", false);
menuNode.getChildren().add(new TreeNodeBase("item", "锦囊", true));
treeData.getChildren().add(menuNode);

// populate Betty's portion of the tree
menuNode = new TreeNodeBase("menu", "后缀管理", false);
menuNode.getChildren().add(new TreeNodeBase("item", "神秘园", true));
treeData.getChildren().add(menuNode);

menuNode = new TreeNodeBase("menu", "用户统计", false);
menuNode.getChildren().add(new TreeNodeBase("item", "伊甸园", true));
treeData.getChildren().add(menuNode);

menuNode = new TreeNodeBase("menu", "其它", false);
menuNode.getChildren().add(new TreeNodeBase("item", "预警设置", true));
treeData.getChildren().add(menuNode);

return treeData;
}  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-13 11:34 巨土无比
只能显示:
产品管理

后缀管理

用户统计

其它

但是无法展开,点击后没有任何反应  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-13 11:38 巨土无比
现在可以了,刚才是用的firefox,现在用的是ie就可以了,有意思,还有这限制呢  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-13 11:51 steady
Tree2本身并没有这个问题的,我一直是在FireFox下跑的,一直很正常,但是Myfaces 1.1.1版本的Tree2确实有bug,可以拿比较新的源码Build一下,应该能够解决这个问题。  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-13 11:52 巨土无比
又有问题了,用ie的话,如果刷新一下,又报错说“网页有错误”,然后就又无法展开了,只有新打开一个ie或者在原来的ie上回车才可以正常显示,请问这是什么原因呢?  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-13 11:55 巨土无比
最新的myfaces就是1.1.1啊,你是说用nightly builds?我的qq:601998086,加我吧,聊起来方便,验证信息填myfaces吧,呵呵。  回复  更多评论
  
# re: JSF Tree2 实践 2006-01-14 07:52 kingwell
tree2不是太稳定
做过两个tree交互移动其中一个tree的node到另外一个tree上面,有时候会发生illegalstate的问题,感觉不是太稳定  回复  更多评论
  
# re: JSF Tree2 实践 2006-03-11 09:14 hunter
tree2的value绑定javabean的属性,那属性类型到底是TreeModel,还是TreeNode?在有的例子中用的是TreeNode(见上文),有的用TreeModel(见Tree2 Explained 解析Tree2一文)。
我觉得应该用TreeModel。  回复  更多评论
  
# re: JSF Tree2 实践 2006-03-31 10:20 wanfan
@巨土无比
我像上面那样做 也出现这样的问题 只能显示根节点 不能显示叶子节点   回复  更多评论
  
# re: JSF Tree2 实践 2006-04-26 11:00 128kj_com
非常想与贵站做友情链接,诚邀您到我站自助添加,立即生效,首页显示。
http://www.128kj.com  回复  更多评论
  
# re: JSF Tree2 实践 2006-05-23 13:36 huyan722
@巨土无比
你可能缺少Filter,我也遇到过这样的问题但是在web.xml中加入Filter后就解决了
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.component.html.util.ExtensionsFilter</filter-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>20m</param-value>
<description>Set the size limit for uploaded files.
Format: 10 - 10 bytes
10k - 10 KB
10m - 10 MB
1g - 1 GB
</description>
</init-param>
</filter>

<!-- extension mapping for adding <script/>, <link/>, and other resource tags to JSF-pages -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<!-- servlet-name must match the name of your javax.faces.webapp.FacesServlet entry -->
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

<!-- extension mapping for serving page-independent resources (javascript, stylesheets, images, etc.) -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</ url-pattern>
</filter-mapping>
如果你在项目中没有使用到Myfaces的扩展组件(t:开头的),则你不需要配置这个Filter.
可是,如果你用了Myfaces的扩展组件,你必须为你的web程序配置这个Filter.
  回复  更多评论
  
# re: JSF Tree2 实践 2006-11-18 20:54 jsf_beginner
请问例子的BaseBean是哪个包里的?
  回复  更多评论
  
# re: JSF Tree2 实践 2007-01-12 22:35 lion.huang
你好,能把那个backbean原代码传我一份吗?
谢谢!
email:lion_6@163.com
QQ:262542058  回复  更多评论
  
# re: JSF Tree2 实践[未登录] 2007-03-15 17:23 K
请问能不能给树的节点加上右键菜单?  回复  更多评论
  
# re: JSF Tree2 实践 2007-07-11 12:44 仙子
用TREE2做一个带选择框的树,如何做到点上一级的选择框,自动点选下一级的选择框  回复  更多评论
  
# re: JSF Tree2 实践[未登录] 2007-09-19 00:02 simon
麻烦给我发一份myfaces-20051215 ,simon_cheng1@hotmail.com
多谢  回复  更多评论
  
# re: JSF Tree2 实践 2007-11-14 17:10 wbaihp
请问我按照你们的说法作了一下,为什么我的<t:graphicImage value="../images/yellow-folder-open.png"
rendered="#{t.nodeExpanded}" border="0" />中提示
t cannot be resolved  回复  更多评论
  
# re: JSF Tree2 实践 2008-02-01 08:43 legend_only
现在我展开TREE2树的根结点,怎么才能做到呢???

还有个问题就是树的结点展开后,在关闭,前面的图标就不变了,还是展开时的.
页面刚载入的时候是正确的,是关闭的图标,展开后就回不去了~~  回复  更多评论
  
# re: JSF Tree2 实践 2008-05-20 13:55 bryan
你好,我想问一下的是我用
<h:commandLink immediate="true" styleClass="#{t.nodeSelected ? 'documentSelected':'document'}" actionListener="#{t.setNodeSelected}"
action="#{treeMenu.nodeClicked}" target="content">
<t:graphicImage value="images/document.png" border="0"/>
<h:outputText value="#{node.description}"/>
<f:param name="nodeid" value="#{node.identifier}"/>
</h:commandLink>

在nodeClicked我用的是返回nodeid的值,再通过face-config.xml中的设置导航到一个页面上,不知还有没有更好的办法啊?想知道你的nodeClicked的事件代码是怎样啊?
我现在的是用一个框架将主页面分为三个部分,通过点击树形菜单导航到相应的功能页面  回复  更多评论
  
# re: JSF Tree2 实践 2008-05-20 13:56 bryan
我的联系邮箱chizeng@126.com  回复  更多评论
  

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


网站导航: