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

struts2+DOJO构造动态树

    博客分类:
  • Dojo
阅读更多
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 并将设为树的控制器。

分享到:
评论
1 楼 ccue 2009-04-14  
我用struts2.16内置dojo
使用dojo.xhrGet({url:"../ajax/loadCommodity.action",
            handleAs:"json",
            load:drawTable,
            content:{id:commodityId}});
报错,[Exception... "'Error: dojo.xhrGet is not a function' when calling method: [nsIDOMEventListener::handleEvent]" nsresult: "0x8057001c (NS_ERROR_XPC_JS_THREW_JS_OBJECT)" location: "<unknown>" data: no]
好象不支持

相关推荐

    struts2_jodo_tree

    本文将基于提供的文件信息,详细介绍如何利用Struts2和Dojo来实现动态树,并深入探讨其中涉及的关键技术和步骤。 #### 1. 理解Struts2与Dojo集成 **Struts2简介**:Struts2是Apache组织下的一个开源项目,它是...

    struts2所需jar包

    9. **struts2-tiles-plugin.jar**:Tiles是用于创建重用和组合的网页布局的框架,这个插件使Struts2能够利用Tiles来构造复杂的页面结构。 10. **其他依赖的库**:可能还包括其他的第三方库,如log4j.jar(日志记录...

    struts2api.zip

    例如,`struts2-dojo-plugin`提供与Dojo JavaScript库的集成,`struts2-json-plugin`支持JSON序列化和反序列化。 8. **类型转换**:Struts2提供了自动类型转换机制,能够将HTTP请求参数自动转换为Action字段的类型...

    struts2-2.3.32 相关jar包

    OGNL是Struts2中用于动态表达和数据绑定的语言,当未正确配置或更新时,可能会成为攻击的入口点。 Struts2的2.3.32版本发布主要是为了修复此类安全漏洞,以提高系统的安全性。开发者应该及时更新到这个或更高版本,...

    Struts2漏洞利用工具2017版

    S2-045涉及Struts2的Dojo插件,而S2-046则与Struts2的FreeMarker模板引擎有关。这两个漏洞都可以通过特定的请求参数触发,导致服务器上执行攻击者指定的代码。避免这些问题的最佳做法是保持Struts2框架的最新状态,...

    dojo的ajax的jar包

    总结一下,dojo的Ajax功能通过xhr模块提供了强大的异步通信能力,使得Java开发者能够轻松地在Struts1和Struts2框架中构建动态、交互式的Web应用。通过引入dojo-0.4.3-ajax.jar,你可以享受到dojo的Ajax功能,提高Web...

    Struts2 2.3.32

    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

    本文将深入介绍Struts2 Tree标签的两种形式:静态树与动态树,并通过具体实例进行讲解。 #### 二、静态树 静态树是在页面加载时即构建好的树形结构,适用于数据量较小且固定的场景。其创建过程较为简单,主要包括...

    struts2.3.7所有jar包

    3. **struts2-dojo-plugin.jar**:提供了与Dojo JavaScript库的集成,用于创建富客户端界面。 4. **struts2-json-plugin.jar**:支持JSON数据格式的处理,便于与Ajax交互。 5. **struts2-tiles-plugin.jar**:整合...

    struts2-core-2.5.10 升级相关jar包

    可能需要升级相关插件或库,如Struts2的UI插件(例如Struts2 Dojo插件、Struts2 jQuery插件等)。 5. **修改配置**:新版本可能会引入一些配置更改,阅读官方发布的更新日志,了解可能需要调整的地方,如`struts....

    Struts2漏洞检查工具2019版 V2.3.zip

    4. **插件漏洞**:Struts2有许多插件,如Struts2 Dojo、Struts2 Sitemesh等,它们可能会有自己的安全漏洞。保持这些插件的最新版本是防止攻击的重要步骤。 Struts2漏洞检查工具2019版 V2.3.exe 是一个专为检测这些...

    struts-2.3.4.1第一部分

    - 主要的jar包可能包括`struts2-core.jar`(核心库)、`struts2-convention-plugin.jar`(约定优于配置插件)、`struts2-json-plugin.jar`(JSON支持)和`struts2-dojo-plugin.jar`(Dojo UI库支持)等。...

    struts漏洞检测工具2017

    3. **S2-045(CVE-2017-5637)**,与S2-048类似,是一个远程代码执行漏洞,主要影响Struts2的Struts2 Dojo展示模块。攻击者可以通过精心设计的请求触发漏洞,执行服务器端的任意命令。 4. **S2-016(CVE-2013-2261...

    struts2错误集合

    8. **插件问题**: Struts2提供了许多插件,如 strut2-convention-plugin 和 strut2-dojo-plugin。如果插件配置不当或版本不兼容,可能导致错误。仔细阅读插件文档,按照指示进行配置。 9. **日志错误**: Struts2...

    struts-2.3.37-all.rar

    - `struts2-dojo-plugin`/`struts2-jquery-plugin`:提供了与Dojo或jQuery库的集成,便于创建交互式的用户界面。 - `docs`:框架的文档,包括API参考和用户指南。 - `examples`:示例应用,帮助开发者快速上手。 **...

    struts-2.3.20.3-all源码包

    2. **插件**:Struts 2支持多种插件,以扩展其功能,如 strut2-convention-plugin 和 strut2-dojo-plugin,分别用于自动化配置和提供富客户端交互功能。 3. **示例应用**:提供了一些示例应用程序,帮助开发者了解...

    收集的几篇论文关于STRUTS

    例如,Struts2-dojo-plugin提供了对Dojo库的支持,方便实现富客户端界面。 8. **最佳实践**:论文可能涵盖了使用Struts进行开发的最佳实践,包括良好的代码组织、有效的错误处理、安全编码和测试策略等。 通过对...

    dojo与json应用

    例如,在Struts2项目中,可以在`struts.xml`文件中增加以下配置: ```xml &lt;param name="root"&gt;returnMap ``` 3. **后端Action返回Map数据**:后端逻辑处理完毕后,通过返回一个Java Map类型的对象来构造JSON...

    struts-2.3.25-all.zip part1

    5. **Plugins**:Struts 2支持丰富的插件,比如 strut2-convention-plugin 自动配置插件,strut2-dojo-plugin 提供 dojo JavaScript 库的集成,strut2-json-plugin 支持JSON格式的数据交互。 描述中提到的“为了...

    JSP+Ajax网站开发典型实例_Part_1.rar

    6. 框架应用:现代开发中,如jQuery、Prototype、Dojo等JavaScript库简化了Ajax的使用,而Spring MVC、Struts2等Java框架也提供了与Ajax集成的解决方案。了解这些框架可以提升开发效率,降低出错率。 7. 安全性考虑...

Global site tag (gtag.js) - Google Analytics