Dojo 通过名为“TreeRPCController”的控件实现 AJAX 树,它会监听被控制树的事件。当发生展开节点的事件时,TreeRPCController就会向URL发送XHR请求,该URL由TreeRPCController的RPCUrl 属性定义。XHR请求格式类似如下格式:
http://localhost:8080/Struts2_Ajax2/AjaxTree.action?action=getChildren&data={"node":{"widgetId":"file_226092423","objectId":"C:\\Program Files\\Tomcat 5.5\\webapps\\Struts2_Ajax2","index":0,"isFolder":true},"tree":{"widgetId":"appFiles","objectId":""}}&dojo.preventCache=1182913465392
清单5 XHR样本
显而易见,请求中包含三个参数,分别是action为“getChildren”(固定值),data一个包含当前节点与树信息的JSON串和dojo.preventCache随机串,用于缓存不同节点的请求响应(父节点只会在第一次被展开时到服务器端加载数据,之后都是从浏览器的缓存中读取数据,可以提高应用程序性能)。
首先我要先写一个加载树节点数据的Action类,代码如下:
package tutorial;
import java.util.Map;
import com.googlecode.jsonplugin.JSONExeption;
import com.googlecode.jsonplugin.JSONUtil;
public class AjaxTreeAction extends DynamicTreeAction {
private static final long serialVersionUID = 3970019751740942311L;
private String action;
private String data;
private FileWrapper[] wrappers;
public void setAction(String action) {
this.action = action;
}
public void setData(String data) {
this.data = data;
}
public FileWrapper[] getWrappers() {
return wrappers;
}
@Override
public String execute() {
if("getChildren".equals(action)) {
try {
Object o = JSONUtil.deserialize(data);
String path = ((Map) ((Map) o).get("node")).get("objectId").toString();
wrappers = new FileWrapper(path).getChildren();
} catch (JSONExeption e) {
e.printStackTrace();
}
return "ajax";
}
return super.execute();
}
}
清单6 src/tutorial/AjaxTreeAction.java
上述代码可能需要解释一下:
action属性对应于XHR中的action,如果它为“getChildren”时,则需要进行加载子节点操作。否则,会读取树的根节点,并返回JSP页面;
通过上面XHR的分析,大家可以知道data是代表树和当前节点的JSON串,故应将其反串行化为Map对象,并将其 objectId属性取出。通常情况下,Dojo树的objectId属性代表服务器端的对象的标识,在本例中为文件夹的绝对路径;
wrappers属性表示当前文件夹下的文件数组,它被传送到Freemarker页面,翻译为Dojo树节点数组的JSON串。
下面是Freemarker页面的代码:
[
<#list wrappers as r>
{ "title": "${r.name}", "isFolder": <#if r.children?size gt 0>true<#else>false</#if>, "id": "${r.id}", "objectId": "${r.absolutePath?js_string}" }<#if r_has_next>,</#if>
</#list>
]清单7 WebContent/AjaxTree.ftl
以上代码中<#list></#lsit>的写法是Freemarker中遍历集合的写法;而<#if r.children?size gt 0>判断“r”对象的children属性是否为空;r.absolutePath?js_string 就是将“r”的absolutePath属性的值输出为Javascript 的字串符形式;<#if r_has_next></#if>判断集合是否有下一项数据。如果希望更详细地了解Freemarker的使用,请参考该手册。
接下来,让我们看看Action的配置代码片段:
<action name="AjaxTree" class="tutorial.AjaxTreeAction">
<result>AjaxTree.jsp</result>
<result name="ajax" type="freemarker">AjaxTree.ftl</result>
</action>
清单8 src/struts.xml配置片段
最后是JSP页面代码:
<%@ 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');
}
dojo.addOnLoad(function() {
var t = dojo.widget.byId('appFiles');
var s = t.selector;
dojo.event.connect(s, 'select', 'treeNodeSelected');
});
/* ]]> */
</script>
</head>
<body>
<h2>
AJAX Tree Example
</h2>
<div style="float:left; margin-right: 50px;">
<script type="text/javascript">
/* <![CDATA[ */
dojo.require("dojo.lang.*");
dojo.require("dojo.widget.*");
dojo.require("dojo.widget.Tree");
dojo.require("dojo.widget.TreeRPCController");
/* ]]> */
</script>
<div dojoType="TreeRPCController" widgetId="treeController"
DNDcontroller="create" RPCUrl="<s:url />"></div>
<div dojoType="Tree" widgetId="appFiles" toggle="fade" controller="treeController">
<div dojoType="TreeNode" title='<s:property value="root.name" />'
widgetId='<s:property value="root.id" />'
isFolder='<s:property value="root.children.length > 0" />'
objectId='<s:property value="root.absolutePath" />'>
</div>
</div>
</div>
</body>
</html>
清单9 WebContent/AjaxTree.jsp
由于上面所提及的原因,我在上述的代码中并没有使用<s:tree />标志,而是使用了Dojo的写法——创建 widgetId 为“treeController”的 TreeRPCController 并将设为树的控制器。
分享到:
相关推荐
本文将基于提供的文件信息,详细介绍如何利用Struts2和Dojo来实现动态树,并深入探讨其中涉及的关键技术和步骤。 #### 1. 理解Struts2与Dojo集成 **Struts2简介**:Struts2是Apache组织下的一个开源项目,它是...
9. **struts2-tiles-plugin.jar**:Tiles是用于创建重用和组合的网页布局的框架,这个插件使Struts2能够利用Tiles来构造复杂的页面结构。 10. **其他依赖的库**:可能还包括其他的第三方库,如log4j.jar(日志记录...
例如,`struts2-dojo-plugin`提供与Dojo JavaScript库的集成,`struts2-json-plugin`支持JSON序列化和反序列化。 8. **类型转换**:Struts2提供了自动类型转换机制,能够将HTTP请求参数自动转换为Action字段的类型...
OGNL是Struts2中用于动态表达和数据绑定的语言,当未正确配置或更新时,可能会成为攻击的入口点。 Struts2的2.3.32版本发布主要是为了修复此类安全漏洞,以提高系统的安全性。开发者应该及时更新到这个或更高版本,...
S2-045涉及Struts2的Dojo插件,而S2-046则与Struts2的FreeMarker模板引擎有关。这两个漏洞都可以通过特定的请求参数触发,导致服务器上执行攻击者指定的代码。避免这些问题的最佳做法是保持Struts2框架的最新状态,...
总结一下,dojo的Ajax功能通过xhr模块提供了强大的异步通信能力,使得Java开发者能够轻松地在Struts1和Struts2框架中构建动态、交互式的Web应用。通过引入dojo-0.4.3-ajax.jar,你可以享受到dojo的Ajax功能,提高Web...
3. `struts2-dojo-plugin-2.3.32.jar`:提供了与Dojo JavaScript库的集成,用于创建富客户端界面。 4. `struts2-spring-plugin-2.3.32.jar`:整合Spring框架的插件,支持依赖注入。 5. `struts2-tiles-plugin-2.3.32...
本文将深入介绍Struts2 Tree标签的两种形式:静态树与动态树,并通过具体实例进行讲解。 #### 二、静态树 静态树是在页面加载时即构建好的树形结构,适用于数据量较小且固定的场景。其创建过程较为简单,主要包括...
3. **struts2-dojo-plugin.jar**:提供了与Dojo JavaScript库的集成,用于创建富客户端界面。 4. **struts2-json-plugin.jar**:支持JSON数据格式的处理,便于与Ajax交互。 5. **struts2-tiles-plugin.jar**:整合...
可能需要升级相关插件或库,如Struts2的UI插件(例如Struts2 Dojo插件、Struts2 jQuery插件等)。 5. **修改配置**:新版本可能会引入一些配置更改,阅读官方发布的更新日志,了解可能需要调整的地方,如`struts....
4. **插件漏洞**:Struts2有许多插件,如Struts2 Dojo、Struts2 Sitemesh等,它们可能会有自己的安全漏洞。保持这些插件的最新版本是防止攻击的重要步骤。 Struts2漏洞检查工具2019版 V2.3.exe 是一个专为检测这些...
- 主要的jar包可能包括`struts2-core.jar`(核心库)、`struts2-convention-plugin.jar`(约定优于配置插件)、`struts2-json-plugin.jar`(JSON支持)和`struts2-dojo-plugin.jar`(Dojo UI库支持)等。...
3. **S2-045(CVE-2017-5637)**,与S2-048类似,是一个远程代码执行漏洞,主要影响Struts2的Struts2 Dojo展示模块。攻击者可以通过精心设计的请求触发漏洞,执行服务器端的任意命令。 4. **S2-016(CVE-2013-2261...
8. **插件问题**: Struts2提供了许多插件,如 strut2-convention-plugin 和 strut2-dojo-plugin。如果插件配置不当或版本不兼容,可能导致错误。仔细阅读插件文档,按照指示进行配置。 9. **日志错误**: Struts2...
- `struts2-dojo-plugin`/`struts2-jquery-plugin`:提供了与Dojo或jQuery库的集成,便于创建交互式的用户界面。 - `docs`:框架的文档,包括API参考和用户指南。 - `examples`:示例应用,帮助开发者快速上手。 **...
2. **插件**:Struts 2支持多种插件,以扩展其功能,如 strut2-convention-plugin 和 strut2-dojo-plugin,分别用于自动化配置和提供富客户端交互功能。 3. **示例应用**:提供了一些示例应用程序,帮助开发者了解...
例如,Struts2-dojo-plugin提供了对Dojo库的支持,方便实现富客户端界面。 8. **最佳实践**:论文可能涵盖了使用Struts进行开发的最佳实践,包括良好的代码组织、有效的错误处理、安全编码和测试策略等。 通过对...
例如,在Struts2项目中,可以在`struts.xml`文件中增加以下配置: ```xml <param name="root">returnMap ``` 3. **后端Action返回Map数据**:后端逻辑处理完毕后,通过返回一个Java Map类型的对象来构造JSON...
5. **Plugins**:Struts 2支持丰富的插件,比如 strut2-convention-plugin 自动配置插件,strut2-dojo-plugin 提供 dojo JavaScript 库的集成,strut2-json-plugin 支持JSON格式的数据交互。 描述中提到的“为了...
6. 框架应用:现代开发中,如jQuery、Prototype、Dojo等JavaScript库简化了Ajax的使用,而Spring MVC、Struts2等Java框架也提供了与Ajax集成的解决方案。了解这些框架可以提升开发效率,降低出错率。 7. 安全性考虑...