通过一次小小的实践,终于了解如何使用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
FeedBack:
http://www.blogjava.net/Files/steady/catalogview.rar
我是用commandLink来做的链接,按照你的要求,可以用outputLink来做链接。
把我相应的代码替换掉就可以了。
后面的id=XXX,是在
我在用tree2时出现如上错误,不知如何解决。
我把部门表生成tree2树显示,在新增和修改节点时显示正常;但我在删除节点时如果当前节点下有两个以上的子节点运行正常,当其下只有一个子节点时就出以上错误了。
这个错误出现后我关闭IE从新再打开此页,功能树又显示正常了。 回复 更多评论
session.putValue("UserID", Integer.toString(intUSERID)); //用户ID
session.putValue("UserName",User_Name);//用户登录名
session.putValue("UserGroupID","0");//用户组ID
我在登录后的其它页面中只用取出以上session就OK了。
请问在jsf中实现同样的功能应该如何做?配置如下,已经可以定义session,只是不清楚在登录后的其它Bean中如何取出session,因为我的功能树要根据谁登录的取对应的功能。
用户登录
sysLogin
com.inphit.pms.web.system.SysLogin
session
serviceLocator
#{ServiceLocatorImpl}
回复 更多评论
jsp:
-------------------------------------
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;
} 回复 更多评论
你可能缺少Filter,我也遇到过这样的问题但是在web.xml中加入Filter后就解决了
MyFacesExtensionsFilter
org.apache.myfaces.component.html.util.ExtensionsFilter
maxFileSize
20m
Set the size limit for uploaded files.
Format: 10 - 10 bytes
10k - 10 KB
10m - 10 MB
1g - 1 GB
<!-- extension mapping for adding , , and other resource tags to JSF-pages -->
MyFacesExtensionsFilter
<!-- servlet-name must match the name of your javax.faces.webapp.FacesServlet entry -->
Faces Servlet
<!-- extension mapping for serving page-independent resources (javascript, stylesheets, images, etc.) -->
MyFacesExtensionsFilter
/faces/myFacesExtensionResource/* url-pattern>
如果你在项目中没有使用到Myfaces的扩展组件(t:开头的),则你不需要配置这个Filter.
可是,如果你用了Myfaces的扩展组件,你必须为你的web程序配置这个Filter.
回复 更多评论
多谢 回复 更多评论
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8485249/viewspace-429904/,如需转载,请注明出处,否则将追究法律责任。
<%=items[i].content%>
<%if(items[i].items.items.length) { %><%=items[i].items.items[j].username%> 回复 <%=items[i].items.items[j].tousername%>: <%=items[i].items.items[j].content%>
转载于:http://blog.itpub.net/8485249/viewspace-429904/