Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1178|回复: 0

struts2使用tree动态加载数据

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2011-6-6 15:46:13 | 显示全部楼层 |阅读模式
    当文件层次比较深,数据量比较大时,反应会很慢。这时候应该使用Ajax与动态数据。Ajax能够只加载当前显示所需的少量数据。Dojo框架的数控件支持Ajax.struts2的Tree标签只是生成Dojo的树标签,理论上也应该支持Ajax,不过到目前为止,struts2的Tree标签并没有提供Ajax接口,尽管Dojo已经提供了。不过没有关系,可以直接越过struts2标签使用Dojo。
         Dojo使用TreeRPCController来控制Ajax树。下面是一个使用Ajax树的代码,把Web应用的根目录作为根节点,遍历所有的子文件:
    [color=#990066,strength=3);]treeFileAjax.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ taglib uri="/struts-tags" prefix="struts" %>
    <HTML xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <title>Struts 2 Ajax - More Tree</title>
        <struts:head theme="ajax" debug="false"/>
      </head>
      <body>
      <h3>Ajax Tree Example</h3>
    <%
       request.setAttribute("file",new File(getServletContext().getRealPath("")));
    %>  

    <div dojoType="TreeRPCController" widgetId="treeController" DNDcontroller="create" RPCUrl="treeFileAjaxData.jsp">
    </div>
    <div dojoType="Tree" widgetId="appFiles" toggle="fade" controller="treeController">
       <div dojoType="TreeNode" title='<struts:property value="#request.file.name" />'
                   widgetId='<struts:property value="#request.file.absolutePath" />'
                   isFolder='<struts:property value="#request.file.directory" />'
                   objectId='<struts:property value="#request.file.absolutePath" />'></div>
    </div>
      </body>
    </html>
    treeFileAjaxData.jsp解析data参数,根据objectId属性获知展开的是哪个节点。然后找到相应的文件夹,把文件夹下的子文件与子文件夹返回给Dojo树。返回数据也是JSON格式的。
    [color=#990066,strength=3);]treeFileAjaxData.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ page import="java.util.HashMap,
                     java.util.List,
                     java.util.ArrayList,
                     java.util.Map,
                     com.Googlecode.jsonplugin.JSONUtil,
                     java.io.File" %>
    <%
       out.clear();  //清空所有输出
       request.setCharacterEncoding("UTF-8");
       response.setCharacterEncoding("UTF-8");
       
       @SuppressWarnings("all")
       Map<String,Object> map =
       (Map<String, Object>)JSONUtil.deserialize(request.getParameter("data")); //将提交的数据反序列化
       
       @SuppressWarnings("all")
       String objectId = (String)((Map<String, Object>)map.get("node")).get("objectId");
       
       File file = new File(objectId);  //要展开的文件
       File[] children = file.listFiles();  //所有的子文件
       
       List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(); //查询结果
       
       for(int i = 0; children != null && i < children.length; i++){  //先列出文件夹
         if(children.isFile()) continue;  //如果是文件,跳过
         Map<String,Object> entry = new HashMap<String, Object>();
         entry.put("title",children.getName()); //存储title属性
         entry.put("isFolder",children.isDirectory()); //存储isFolder属性
         
         entry.put("id",children.getName());  //存储id属性
         entry.put("objectId",children.getAbsolutePath());//存储objectId属性
         
         result.add(entry);  //放到查询结果中
       }
       
       for(int i = 0; children != null && i < children.length; i++){  //后列出文件
         if(children.isDirectory()) continue; //如果是文件夹,跳过
         
         Map<String,Object> entry = new HashMap<String,Object>();
         entry.put("title",children.getName()); //存储title属性
         entry.put("isFolder",children.isDirectory()); //存储isFolder属性
         
         entry.put("id",children.getName());   //存数id属性
         entry.put("objectId",children.getAbsolutePath()); //存储objectId属性
         
         result.add(entry); //放到查询结果中
       }
       out.print(JSONUtil.serialize(result));  //将结果序列化,输出到客户端浏览器
       System.out.println(JSONUtil.serialize(result));  //将结果序列化,输出到控制台
    %>
    运行效果如下:

       
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 08:05 , Processed in 0.398919 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表