`
shirlly
  • 浏览: 1624495 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

用<s:tree/>构造动态树

阅读更多
例将会把WEB应用程序的目录树展现在JSP页面中。因此,我需要先包装一下java.io.File 类,代码如下:

package tutorial;

import java.io.File;

public class FileWrapper {
    private File file;

    public FileWrapper(String path) {
        file = new File(path);
    }
    
    public FileWrapper(File file) {
        this.file = file;
    }
    
    public String getId() {
        return "file_" + file.hashCode();
    }
    
    public String getName() {
        return file.getName();
    }
    
    public String getAbsolutePath() {
        return file.getAbsolutePath();
    }
    
    public FileWrapper[] getChildren() {
        File[] files = file.listFiles();
        if(files != null && files.length > 0) {
            int length = files.length;
            FileWrapper[] wrappers = new FileWrapper[length];
            for(int i = 0; i < length; ++i) {
                wrappers[i] = new FileWrapper(files[i]);
            }
            return wrappers;
        }
        return new FileWrapper[0];
    }
}

清单1 src/tutorial/FileWrapper.java
之所以需要对File类进行如此包装,是因为<s:tree />用于动态树时,rootNode、nodeIdProperty、nodeTitleProperty 和 childCollectionProperty等属性都必填的。

然后是Action类的代码如下:

package tutorial;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class DynamicTreeAction extends ActionSupport implements ServletRequestAware {
    private static final long serialVersionUID = 1128593047269036737L;
    
    private HttpServletRequest request;
    private FileWrapper root;

    public void setServletRequest(HttpServletRequest request) {    
        this.request = request;
    }
    
    public FileWrapper getRoot() {
        return root;
    }
    
    @Override
    public String execute() {
        root = new FileWrapper(request.getSession().getServletContext().getRealPath("/"));        
        return SUCCESS;
    }
}
清单2 src/tutorial/DynamicTreeAction.java
上述代码取得WEB应用程序的根目录的绝对路径后,初始化FileWrapper对象root。该对象将为JSP页面的<s:tree />的根节点。如下代码所示:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Struts 2 AJAX - More Tree</title>
        <s:head theme="ajax" debug="true" />
        <script type="text/javascript">
        /* <![CDATA[ */
            function treeNodeSelected(arg) {
                alert(arg.source.title + ' selected');
            }
            
            function treeNodeExpanded(arg) {
                alert(arg.source.title + ' expanded');
            }
            
            function treeNodeCollapsed(arg) {
                alert(arg.source.title + ' collapsed');
            }
            
            dojo.addOnLoad(function() {                
                var t = dojo.widget.byId('appFiles');
                dojo.event.topic.subscribe(t.eventNames.expand, treeNodeExpanded);                
                dojo.event.topic.subscribe(t.eventNames.collapse, treeNodeCollapsed);
                
                var s = t.selector;                
                dojo.event.connect(s, 'select', 'treeNodeSelected');
            });
        /* ]]> */    
        </script>
    </head>
    <body>
        <h2>
            Dynamic Tree Example
        </h2>
        <div style="float:left; margin-right: 50px;">
            <s:tree id="appFiles" theme="ajax" rootNode="root"
                nodeTitleProperty="name" nodeIdProperty="id"
                childCollectionProperty="children" />
        </div>
    </body>
</html>
清单3 WebContent/Tree.jsp
因为<s:tree />的treeCollapsedTopic和treeExpandedTopic属性都没有起作用,所以如果我们想要监听这两个事件,就必须使用上述代码的方法。

最后是struts.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="Struts2_AJAX_DEMO" extends="struts-default">
        <action name="DynamicTree" class="tutorial.DynamicTreeAction">
            <result>Tree.jsp</result>
        </action>
    </package>
</struts>
清单4 src/struts.xml
分享到:
评论
1 楼 aspwater 2012-05-09  
运行不了

相关推荐

    jquery ajax TreeView asp.net改进版

    &lt;%--&lt;script src="lib/jquery/plugins/treeview/js/tree3.js" type="text/javascript"&gt;&lt;/script&gt;--%&gt; &lt;!--你可以把下面的代码放到一个js文件当中--&gt; &lt;script type="text/javascript"&gt; var checknodes = "HJH8,...

    c语言suffix tree库

    构造前缀树,深度广度优先搜索等功能。 This library is an implementation of the suffix tree algorithm applied to indexing. A search on "suffix trees Ukkonen" on a search engine should give you an idea ...

    java基于链表实现树结构(算法源码)

    //(单节点树)构造方法 public TreeLinkedList() { this(null, null, null, null); } //构造方法 public TreeLinkedList(Object e, TreeLinkedList p, TreeLinkedList c, TreeLinkedList s) { element = e; ...

    Java基于向量实现的完全二叉树(算法源码)

    //构造方法:默认的空树 public ComplBinTree_Vector() { T = new Vector_ExtArray(); root = null; } //构造方法:按照给定的节点序列,批量式建立完全二叉树 public ComplBinTree_Vector(Sequence s) { this...

    dy:从目录树构造YAML

    dy 从目录树构造YAML描述全世界似乎都认为声明性配置最好用YAML表示。 这在Kubernetes和相关工具领域尤为普遍。 可怕的想法倾向于积累,导致对错误问题的。 尽管此工具不会假装移动山峰,但会尝试将其向正确的方向微...

    数据结构管道铺设课程设计含画图

    cout&lt;&lt;endl&lt;&lt;setw(3)&lt;&lt;findbyid(tree[jj].begin)&lt;&lt;" "&lt;&lt;setw(3)&lt;&lt;findbyid(tree[jj].end)&lt;&lt;" "&lt;&lt;setw(3)&lt;&lt;tree[jj].length; //return tree; cout&lt;&lt;endl&lt;&lt;endl; } void Graphm::draw() { initgraph(1024, 680...

    将字母编码为二进制数

    void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)//W存放N个字符的权值,构造哈夫曼树HT,并求出N个字符的哈夫曼编码HC { int m,i,s1,s2,start; int c,f; HuffmanTree p; char *cd; if(n&lt;=1) ...

    语言程序设计课后习题答案

    由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。...

    哈夫曼树的相关程序,试验

    构造哈夫曼树时使用静态链表作为哈夫曼树的存储。求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,每回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值...

    B树的C++实现

    然后在堆上创建一个数据类对象,把地址作为构造函数的参数创建树对象,下面给出一个使用示例。 #include &lt;string.h&gt; #include &lt;stdio.h&gt; #include "DataTypeForBtree.h" #include "BTree.h" struct tree_data { ...

    二叉排序树与平衡二叉树的实现

    计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。  ...

    哈夫曼树 上机实验 报告

     #include &lt;stdio.h&gt;  #include&lt;stdlib.h&gt;  #include&lt;string.h&gt;  #include&lt;malloc.h&gt;  #include&lt;math.h&gt;  #define M 10  typedef struct Fano_Node  {  char ch;  float weight;  }FanoNode[M];  ...

    初识人工智能--决策树算法.pdf

    &lt;2&gt; 划分信息熵—-假设选择属性A划分数据集S,计算属性A对集合S的划分信息熵值 case 1:A为离散类型,有k个不同取值,根据属性的k个不同取值将S划分为k各⼦集{s1 s2 …sk},则属性A划分S的划分信息熵为:(其中 "Si...

    (有向)图基于BFS的最短距离算法(java源码)

    final static int TREE = 1;//树边 final static int CROSS = 2;//横跨边 final static int FORWARD = 3;//前向跨边 final static int BACKWARD = 4;//后向跨边 //变量 protected Graph G;//图 //构造方法 ...

    数据结构实验(含源码)

    从文件中读取学生成绩数据:fscanf(文件指针,"%s %s %s %s %s %f %f", p-&gt;NO, p-&gt;Name, p-&gt;Mtel, p-&gt;Email, p-&gt; BornAddr, p-&gt;AScore, p-&gt;BScore); 输出学生成绩数据:printf("%s %s %s %s %s %f %f", p-&gt;NO, p-&gt;...

    ligerui-LigerRM-V2

    grid.ashx ---- 通用的ligerGrid表格数据加载入口 treegrid.ashx ---- 通用的ligerGrid表格树格式数据加载入口 tree.ashx ---- 通用的ligerTree树格式数据加载入口 select.ashx ---- 通用的ligerComboBox数据加载...

    赫夫曼编码(C语言版本)

    #include &lt;stdio.h&gt; #define MAXBIT 2000 /*定义哈夫曼编码的最大长度*/ #define MAXVALUE 1000 /*定义最大权值*/ #define MAXLEAF 256 /*定义哈夫曼树中最多叶子节点个数*/ #define MAXNODE MAXLEAF*2-1 /*...

    cpp-btree:现代 C++ B 树容器

    C ++ B树 此存储库中的代码基于。 C++ B-tree 是一个模板库,它基于 B-tree 数据结构实现... 红黑树中的节点每个条目需要三个指针(加上 1 位),而 B 树平均每个条目使用少于一个指针,从而显着节省内存。 例如, s

    Tidy-Drawing-of-trees:算法的实现,由Reingold和Tilford整理的树木的整洁图画

    将构造的树的根返回给main() 2. main.cpp:执行Tidy Drawings,然后调用draw.h中的函数进行openGL显示3. draw.h:使用openGL绘制树。 使用Midpoint圆图绘制节点,并使用Bresenham的线图绘制算法绘制线。 项目...

    python-GomoryHu:Python中的简单Gomory-Hu树数据结构实现

    最后,在构造树时,可以通过在Gomory-Hu树上遍历树并将最小成本从s保持为t来查询最小割。实作这是数据结构及其构造算法的非常简单的实现。 Ford-Fulkerson算法用于计算最大流量/最小切割。 也有更快的流动算法...

Global site tag (gtag.js) - Google Analytics