本文深入讲解<s:tree />的使用和通过DWR实现AJAX校验。
更多<s:tree />
在Struts 2的showcase中有两个<s:tree />的例子,分别是静态树与动态树。所谓的静态树即是在编写JSP代码时通过<s:treenode />生成树节点。我的上一篇文章的例子就是一个典型的静态树。而动态树则是在程序运行期间,Struts 2 运行时(Runtime)根据程序中的数据动态创建树节点。虽然在两个例子中<s:tree />的theme属性都为“ajax”,但是从严格意义上来说,这两种树都不属于AJAX树,因为它们都是在输出页面时将全部节点加载到其中,而不是在父节点展开时通过XHR(XMLHttpRequest)获取节点数据。
动态树
下面我们先看一下动态树的例子,接着再一步步地将其改造为名副其实的AJAX 树。下例将会把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];
}
}之所以需要对File类进行如此包装,是因为<s:tree />用于动态树时,rootNode、nodeIdProperty、nodeTitleProperty 和 childCollectionProperty等属性都必填的。

