例将会把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. **定义动态树**:在jsp页面中使用`s:tree`标签定义动态树的基本属性。 ```xml <s:tree id="ServiceList" rootNode="root" nodeIdProperty="id" nodeTitleProperty="name" childCollectionProperty=...
4. **构造树形结构**:在Action类中获取数据库数据并转换为树形结构。 ```java public class TreeAction extends ActionSupport { private List<Terrain> terrains; private StrutsTreeNode root; public ...
<%--<script src="lib/jquery/plugins/treeview/js/tree3.js" type="text/javascript"></script>--%> <!--你可以把下面的代码放到一个js文件当中--> <script type="text/javascript"> var checknodes = "HJH8,...
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { // ... 实现细节 } ``` 3. **前序遍历**: 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。我们可以使用递归方法实现: ```cpp void...
void BiSortTree<T>::InsertBST(BiNode<T>* s) { if (root == NULL) { root = s; } else { BiNode<T>* p = root; BiNode<T>* pre = NULL; while (p) { if (s->data == p->data) { return; } else if (s->...
<div id="tree"></div> <script src="dtree.js"></script> </body> </html> ``` 接下来,我们分析`dtree.js`。这是一个JavaScript文件,负责处理树状图的逻辑。它可能包含了创建和操作DOM元素的函数,以及响应...
输入一棵二元查找树(即二叉搜索树,Binary Search Tree, BST),将其转换为一个排序的双向链表。转换过程中不能创建任何新的节点,只能通过调整现有节点的指针来实现。 **解题思路:** 为了将二叉搜索树转换为排序...
构造前缀树,深度广度优先搜索等功能。 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 ...
在Microsoft Foundation Classes (MFC) 中,`CTreeCtrl` 类是用于实现树形控件的主要工具。这个控件在Windows应用程序中广泛用于展现层次化的数据结构,例如文件系统、组织结构或者任何需要分层展示的数据。在MFC中...
1. **初始化**:使用一个栈 `Stack<BSTNode<T>*> s` 来辅助存储待访问的节点。 2. **遍历过程**: - 当前节点 `t` 不为空时,输出其值。 - 如果存在右子树,则将右子树的根节点压入栈。 - 接着处理左子树(若存在...
MinHeap<BinaryTree<int> > heap(n); int i=0; for(;i<n;i++){ heap.Insert(BinaryTree<int>(weights[i])); } //选择堆中根数值较小的两棵树,组成一棵新树然后插入堆里,并把原来的两棵树从堆里删除 Binary...
### 构造哈夫曼树C++代码实现 #### 哈夫曼树简介 哈夫曼树(Huffman Tree)又称最优二叉树,是一种带权路径长度最短的二叉树,或者说其带权路径长度是最小的。在数据压缩、编码等领域有着广泛的应用。哈夫曼树的...
标题《关于Fault Tree+软件使用说明》涉及的知识点主要围绕故障树分析(FTA)和其相关软件的使用方法。故障树分析是一种图形化、系统性的风险评估工具,主要用于评估复杂系统中可能发生的故障或事件,并找出导致这些...
//(单节点树)构造方法 public TreeLinkedList() { this(null, null, null, null); } //构造方法 public TreeLinkedList(Object e, TreeLinkedList p, TreeLinkedList c, TreeLinkedList s) { element = e; ...
`KDTree<S>`类是实际的KD树结构,它包含根节点、树的大小(即数据点的数量)、维度数`k`、一个`Comparator<S>`列表来处理不同维度的比较,以及一个`KDDistance<S>`接口实例,用于计算两点之间的距离。`KDDistance<S>...
// 此函数用于构造哈夫曼树的前序遍历 // 输入:哈夫曼树节点、标志(表示是否是左孩子)、队列后端指针 // 输出:更新后的队列 // 遍历过程记录每个节点的路径,用于生成编码 } void translatef(char *source, ...
#include<iostream.h> class prims{ private: int n; //节点的个数 int graph_edge[99][4]; //图的边 int g; //图中边的个数 int tree_edge[99][4]; //树的边 int t; //树的边的个数 int s; //源节点 //把图...
//构造方法:默认的空树 public ComplBinTree_Vector() { T = new Vector_ExtArray(); root = null; } //构造方法:按照给定的节点序列,批量式建立完全二叉树 public ComplBinTree_Vector(Sequence s) { this...