朝花夕拾 之 Java+JavaScript构建自己的超级树

SAP Workflow审批功能实例详细过程 阅读详情
  但凡开发过web应用系统的人大概都有过类似的经历吧?构建一颗树(比如显示组织机构等),总之有上下级关系的数据用树形来显示效果应该都很不错的。 但是,很多情况下效果不太理想,比如级数(层熟)限制、比如显示效果、比如要给节点动态添加属性……
  在试过很多组件后我发现,其实借助jsp和javascript,自己也可以写出类似的东西啊,而且效果也可以很不错的,呵呵 : )


  首先,VO对象(Tree中的节点对象)

package com.javer.test.tree;

/**
* VO对象(Tree中的节点对象)
* <p>Title: TreeVO</p>
* @author javer QQ:84831612
*/
public class TreeVO
implements java.io.Serializable
{
/** 编码 */
private java.lang.String code;

/** 名称 */
private java.lang.String name;

/** 上级编码 */
private java.lang.String superiorcode;

/** 是否末级(1:是;0:不是;默认:1) */
private int islast = 1;
public String getCode()
{
return code;
}

public void setCode(String code)
{
this.code = code;
}

public int getIslast()
{
return islast;
}

public void setIslast(int islast)
{
this.islast = islast;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public String getSuperiorcode()
{
return superiorcode;
}

public void setSuperiorcode(String superiorcode)
{
this.superiorcode = superiorcode;
}
}

  第二,业务处理类

在实际应用中自己写
/********************************************************
*********************************************************
*********************************************************
*********************************************************
*********************************************************
*********************************************************
*********************************************************/

  第三,最重要的JSP页面

<%--
Description:Tree页面
Author:Javer QQ:84831612
Date:2004-08-05
--%>
<%--
Javer于2004-11-02修改如下问题:
1. 点击文件关闭父节点后,树节点的排列顺序不对
--%>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="com.javer.test.tree.TreeVO" %>
<%@ page import="java.util.HashMap,java.util.Vector" %>

<%!
HashMap hp = null;
%>

<%
if(request.getAttribute("tree") != null)
hp = (HashMap) request.getAttribute("tree");
else //为了演示,在页面中增加Tree的内容,实际应用中应该把它放到后台去处理
{
/**
* 为了演示 指定固定的值
* 实际应用中应该来自数据库、配置文件……
* 而且应该在后台进行处理 request.setAttribute("tree",hp);
*/
hp = new java.util.HashMap();
java.util.Vector v = new java.util.Vector();
TreeVO vo1 = new TreeVO();
vo1.setCode("01");
vo1.setName("01的名称");
v.add(vo1);
TreeVO vo2 = new TreeVO();
vo2.setCode("02");
vo2.setName("02的名称");
vo2.setIslast(0);
v.add(vo2);
hp.put("TreeRoot",v);
v = new java.util.Vector();
TreeVO vo3 = new TreeVO();
vo3.setCode("0201");
vo3.setName("0201的名称");
vo3.setIslast(0);
vo3.setSuperiorcode("02");
v.add(vo3);
TreeVO vo4 = new TreeVO();
vo4.setCode("0202");
vo4.setName("0202的名称");
vo4.setSuperiorcode("02");
v.add(vo4);
hp.put("02",v);
v = new java.util.Vector();
TreeVO vo5 = new TreeVO();
vo5.setCode("020101");
vo5.setName("020101的名称");
vo5.setSuperiorcode("0201");
v.add(vo5);
hp.put("0201",v);

request.setAttribute("TreeName","Javer's Tree演示");
}
%>

<%!
private void showChild(javax.servlet.jsp.JspWriter out,int layerIndex,TreeVO vo)
throws java.io.IOException
{
if(hp.containsKey(vo.getCode()))
{
//有子节点
Vector v = (Vector) hp.get(vo.getCode());
if(v == null)
return;
TreeVO[] objs = (TreeVO[]) v.toArray(new TreeVO[0]);
boolean haveChild = false;
for(int i=0;i<objs.length;i++)
{
haveChild = objs[i].getIslast()==0 && hp.containsKey(objs[i].getCode());
for(int j=0;j<layerIndex;j++)
{
out.print("&nbsp;&nbsp;");
}
out.println(" <img name=/"img"+objs[i].getCode()+"/" src=/"/images/menu_folder_"+((haveChild)?"open1":"closed")+".gif/"");
if(haveChild)
{
out.print(" onclick=/"turnit(this,'"+objs[i].getCode()+"')/" style=/"cursor:hand/"");
}
out.println("/>");
out.println(" <span name=/"selstr"+objs[i].getCode()+"/" id=/"selstr"+objs[i].getCode()+"/" align=/"left/" class=/"TreeStyle/">");
if(!haveChild)
{
out.println("<input type=/"radio/" value=/""+objs[i].getCode()+"#"+objs[i].getName()+"/" name=/"myRadio/" ondblClick=/"confirmSel();/">");
}
out.println(objs[i].getName());
out.println(" </span>");
out.println("<div id=/"div"+objs[i].getCode()+"/" name=/"div"+objs[i].getCode()+"/" style=/"'DISPLAY:'/" width=/"100%/" valign=/"top/">");
if(objs[i].getIslast() == 0)
{
showChild(out,layerIndex+2,objs[i]);
}
out.println("</div>");
}
}
}
%>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Javer's Tree演示页面</title>
<link href="/index.css" rel="stylesheet" type="text/css">
<style type="text/css">
.unitTreeStyle {
font-size: 12px;
color: #000000;
text-decoration: none;
cursor:hand
}
</style>
<script>
//确定选择
function confirmSel()
{
var selStr = getSel();
if(!selStr)
{
return false;
}
else
{
alert("选中的节点编码#名称=" + selStr);
}
}
function getSel()
{
var radioObj = document.thisform.myRadio;
if(!radioObj)
return false;
var returnValue;
if(radioObj.length)
{
for(var i=0;i<radioObj.length;i++)
{
if(radioObj[i].checked)
{
returnValue = radioObj[i].value;
}
}
}
else
{
if(radioObj.checked)
{
returnValue = radioObj.value;
}
}
if(!returnValue)
{
alert("请先选择一个节点!");
return false;
}

return returnValue;
}
//打开、关闭节点
function turnit(imgObj,divID)
{
var divObj = document.all["div"+divID];
if(!divObj && !imgObj)
{
return false;
}
else
{
if(divObj.style.display == "")
{
divObj.style.display = "none";
}
else
{
divObj.style.display = "";
}
if(imgObj.src.indexOf("closed1")!=-1)
imgObj.src="/images/menu_folder_open1.gif";
else if(imgObj.src.indexOf("open1")!=-1)
imgObj.src="/images/menu_folder_closed1.gif";
}
}
</script>
</head>

<body class="bYellow">

<form method="post" name="thisform">

<table width="90%" border="0" align="center">
<tr>
<td>
<%
if(hp != null)
{
%>
<img name="imgTreeRoot" src="/images/menu_folder_<%=hp.containsKey("TreeRoot")?"open1":"closed"%>.gif" onclick="turnit(this,'TreeRoot')" style="cursor:hand"/>
<span name="selstrTreeRoot" id="selstrTreeRoot" align="left" class="TreeStyle">
<%= request.getAttribute("TreeName")==null?"树的名称":request.getAttribute("TreeName") %>
</span><br>
<div id="divTreeRoot" name="divTreeRoot" style="DISPLAY:" width="100%" valign="top">
<%
Vector v = (Vector) hp.get("TreeRoot");
if(v != null)
{
TreeVO[] objs = (TreeVO[]) v.toArray(new TreeVO[0]);
boolean haveChild = false;
for(int i=0;i<objs.length;i++)
{
haveChild = objs[i].getIslast()==0 && hp.containsKey(objs[i].getCode());
%>
&nbsp;&nbsp;<img name="img<%=objs[i].getCode()%>" src="/images/menu_folder_<%=(haveChild)?"open1":"closed"%>.gif" <% if(haveChild){out.print("onclick=/"turnit(this,'"+objs[i].getCode()+"')/" style=/"cursor:hand/"");}%>/>
<span name="selstr<%=objs[i].getCode()%>" id="selstr<%=objs[i].getCode()%>" align="left" class="TreeStyle">
<%
if(!haveChild)
{
%>
<input type="radio" value="<%=objs[i].getCode()%>#<%=objs[i].getName()%>" name="myRadio" ondblclick="confirmSel();">
<%
}
%>
<%= objs[i].getName() %>
</span><br>
<div id="div<%=objs[i].getCode()%>" name="div<%=objs[i].getCode()%>" style="DISPLAY:" width="100%" valign="top">
<%
if(haveChild)
{
//不是末级,显示子节点
showChild(out,2,objs[i]);
}
%>
</div>
<%
}
}
else
{
out.println("没有查询到任何记录,请重新查询!");
}
%>
<%
}
else
{
out.println("没有查询到任何记录,请重新查询!");
}
%>
</div>
</td>
</tr>
<tr>
<td class="fContent" align="right">
<input name="Button1" type="button" class="iButton" value="确 定-O" onClick="confirmSel();" accesskey="O">
<input name="Button3" type="button" class="iButton" value="取 消-C" onClick="window.close();" accesskey="C">
</td>
</tr>
</table>

</form>

</body>

</html>

  显示效果图(怎么样,是不是挺不错的?)

  当然,也可以把单选换成复选框;节点的图片也可以自己更换;总之,一切都可以自己定制,就算你想给节点加个右键菜单都没有问题,不信可以试试哦
手把手教你完成基于matlab的路面裂缝检测系统设计 裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。 阅读详情

相关推荐

ARM CMSIS DAP源码分析(二)

今天分析的是RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)和RDDI_DAP_SetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)这两个函数。 以RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)为例,代码如下:

pengxiao618的专栏 7977

朝花夕拾 - 2020 1024

2018 年 05 月应届生的我入职一家电信外包小公司,开始了前端工程师之旅。至于其中曲折,因为太久了我就不哆嗦了,磨啊磨在 2019 年 04 月 01 日,入职了人生第二家公司继续做...

weixin_41806099的博客 385

利用PLECS实现Boost变换器的闭环控制仿真与优化

本文详细介绍了如何利用PLECS仿真软件实现Boost变换器的闭环控制与优化。从基础原理到开环系统搭建,再到闭环控制设计与动态优化,提供了完整的仿真实践指南。通过PLECS的仿真功能,工程师可以有效诊断问题、优化参数,并实现高性能的DC-DC变换器设计。

weixin_42527401的博客 325

[朝花夕拾]一个菜鸟从高一到大二的作品整理

写在前面 虽然不是什么文艺青年,但对着过去的事物总会有一种说不清道不明的感觉,听着《三个人的时光》这首抒情的音乐,决定也跟着文艺一把。 曾经,我也是一个什么都不懂的菜鸟,第一次与网络亲密接触的时候,我就在想:“我们一直以来上的都是别人网站,我能不能自己制作一个呢?”于是稀里糊涂的就开始学起了网页…… 这么多年走过,也算是小有所成,捣鼓过不少作品,只是想即便放出来也只是贻笑于大方之

2万+

STM32F103xx / STM32F429VET6最小系统原理图

心血来潮想试一下STM32F4系列和F1系列在编程上有什么差别,手头没有开发板,本着能勤俭节约的原则自己先做一块看看能不能成,看了一下STM32F429VET6的芯片在F429xx中最便宜,对照着数据手册绘制了原理图画了PCB,目前打板中,焊接完如果跑不通回来修改文章。这里我们可以看到,VDD是标准工作电压,VDDA是模拟工作电压,且VDDA必须与VDD等电位,VBAT是备份工作电压,一般接纽扣电池电源,如果存在VREF+引脚,则要求VDDA-VREF+ < 1.2V。截图下来比较糊,不知道为什么。

m0_51294753的博客 1万+

【深度解析TI InstaSPIN】无传感器FOC控制的核心方案

TI InstaSPIN通过“自动识别+通用观测器+开源工具链”的组合,解决了无传感器FOC控制开发难度大、周期长的核心痛点。其核心优势在于快速统一软件观测器的通用性与高精度,以及Fly Start闭环零速启动策略的高可靠性,可适配空调压缩机等家电电机的复杂运行需求。在空调外机双电机控制场景中,InstaSPIN与TI C2000系列MCU(F280013x/F28E12x)完美契合,借助MCU的高性能DSP内核与丰富外设,可实现双电机的精准同步控制,同时降低硬件成本与开发周期。

昔时扬尘处 323

朝花夕拾-致我的2016

之所以选在今天来写下这篇文章,因为明天就是2017年了,回首我的2016完整的一年,也真的是感慨颇多。一年都在不断的学习技术,这次就先从生活中说起吧。 生活 一想到生活,就会浮现起大大的书房,一杯下午茶,三两点星光……是啊,本来生活就是这样的美好。 首先,最欣慰的就是这一年来与女朋友的感情一直很好,一点小小的争吵都可以忽略不计。 二月份怀着对家乡的不舍和对行的一年的希冀一起赶来福州上大

qq_37586590的博客 471

【用unity实现100个游戏之34】使用环状(车轮)碰撞器(Wheel Collider)从零实现一个汽车车辆物理控制系统,实现一个赛车游戏

本文介绍了在Unity中使用Wheel Collider组件实现3D车辆物理控制系统的详细步骤。主要内容包括: Wheel Collider参数详解:包括基础参数(质量、半径等)、悬挂弹簧系统(弹力、减震等)和摩擦力设置(前向/侧向摩擦曲线)。 准备工作流程: 导入赛车模型、赛道和树木素材 为车身添加Rigidbody和MeshCollider 创建四个Wheel Collider并调整参数(半径、悬挂距离等) 优化摩擦系数设置防止侧滑 实现车辆控制: 通过代码控制车轮前后移动和转向 提供底盘系统设置(四轮

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2658

html获取问号后的参数,js取url问号后的参数方法封装

java获取request中的参数.java解析URL问号后的参数.有时候我们需要从request中获取参数,或者获取拼接在Url后面的参数,有时候一个一个去拿有点麻烦,一起拿出来放在一个map里面需 …var url=require(‘url’);URL的合法字符 URL的合法字符表示再浏览器的地址栏中不会被转义的字符,有两种: URL元字符:分号(😉,逗号(’,’),斜杠(/),问号(?),冒号(😃,at(@),&,等号(=),加 …java获取request中的参数、java解析URL问号后的参数。

2401_84092809的博客 925

FC7300 SPI MCAL配置引导

Example - QMI8A01z外设:Example - QMI8A01z外设:

舊梦的博客 258

GRCNN抓取网络学习2【自制Jacquard数据集训练】

请先完成【机械臂视觉抓取从理论到实战】,这样有利于下面操作的理解!然后第二步是GRCNN抓取网络1【Jacquard数据集等效抓取集制作】,有了自己的数据集输入到GRCNN中是三种文件,接下来就是准备训练GRCNN网络啦!grasps.txtRGB.png本文帮大家根据自制Jacquard数据集训练GRCNN抓取网络,其中包含数据格式的对齐,列举了常见的几种训练方法,相信能坚持到这里的都应该试试顺利了吧!接下来会针对GRCNN调优,期待一下下吧,那就别宁色你的三连。

vor234的博客 2797

html获取问号后的参数,js取url问号后的参数方法封装,如何快速学习前端开发

技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。有需要面试题资料的朋友点击这里可以免费领取。

2401_84091663的博客 627

【JCR一区级】鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测【含Matlab源码 5711期】

鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测 完整代码和数据,方可运行;数据可直接替换,适合小白!可提供运行操作视频!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 3601

Javascript入门阶段——if语句

Javascript入门阶段——if语句 朝花夕拾明月夜 2020-11-11 20:11:36 90 收藏 2 分类专栏: JS Level1(入门课程) 文章标签: java javascript 算法 css 版权 1.课程大纲 if语句的基本用法 判断真假 ==表示是否相等 2.1 if语句 if语句:用来做条件判断。 if语句的语法结构,如下所示: if(①){ ② } 1 2 3 if关键字后面有一对小括号,小括号后面是一对大括号,①处放置判断条件,②处放置的是条件成立后执行的代码。 执行流

weixin_52416367的博客 762

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ssm/php/node/python朝花夕拾二手交易平台

探讨朝花夕拾二手交易平台x691c的选题不仅具有理论研究的价值,也有着实践应用的重要性。从实践角度来讲,了解和掌握二手交易平台的运作机制及其对用户行为的影响,有助于平台运营者优化服务流程,提升用户体验,增强平台的竞争力。同时,对于用户而言,深入研究可以帮助他们更好地识别交易风险,提高交易安全意识,从而在享受二手交易带来的便利的同时,保障自身的合法权益。随着互联网技术的发展和移动支付的普及,线上二手交易平台如朝花夕拾二手交易平台x691c等应运而生,为人们提供了一个方便快捷的在线买卖渠道。

乐乐 程序设计 968

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java中对象与JSON格式数据的转换分析

什么是JSON JSON是JavaScript Object Notation的缩写,可以翻译为JS对象图谱。JSON是一种轻量级的数据交换格式,它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。JSON 易于人阅读和编写,同时也易于机器解析和生成,可以有效地提升网络传输效率。——百度百科 在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本格式,所以它适合在网络上

liuweiteng的博客 720

ssm朝花夕拾二手交易平台(开题+源码)

此外,由于传统二手交易市场的信息不对称和交易不透明,消费者往往难以获得可靠的商品信息和保障交易的安全。在这样的背景下,朝花夕拾二手交易平台的出现,旨在解决这些问题,推动二手交易市场的健康发展。[2]刘震林, 喻春梅. 基于MVC模式的JAVA Web开发与实践应用研究[J]. 网络安全技术与应用, 2021, (01): 57-58.2022年9月至10月:需求分析和规划,进行用户需求调研和分析,确定系统功能和目标。2023年4月至5月:文档编写和培训,编写用户手册和系统文档,并进行相关人员的培训。

杰简程序毕设 915

Vue(一)基本概念、基本语法、事件绑定

基于:【狂神说Java】Vue最新快速上手教程通俗易懂 目录1 简介 1 简介 Vue是一套用于构建用户界面的渐进式JavaScript框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,方便与第三方库或既有项目整合。作者尤雨溪。respect! 网络通信:axios; 页面跳转:vue-router 状态管理:vuex CSS预处理器:用一门专门的编程语言,进行Web页面样式设计,再通过编译器转化为正常的CSS,例如SASS、LESS。 ...

你佳哥 182

学习资料

1.朝花夕拾——Groovy &amp; Grails: http://www.blogjava.net/BlueSUN/archive/2007/04/23/112978.html Groovy入门教程 http://blog.youkuaiyun.com/kmyhy/article/details/4200563     2.数据一致性-分区可用性-性能——多副本强同步数据库系统实现之我见...

0与1的世界 134

自学一对一直播脚本开发可行吗?

忙着开发一对一直播脚本累得半死,一个做UI设计的朋友近期跟我聊天,说自己目前的工作总是加班,累到吐血,开始萌生了转行的想法。大学毕业便去了加拿大,在一家互联网公司做UI界面设计,疫情开始一个月回了国,转做国内的JAVA开发。 我这个朋友之前也是学编程的,现在想“朝花夕拾”,重操旧业。但是由于长时间没有接触编程之类的东西,觉得自己跟小白水平差不多,所以跟我聊聊一对一直播行业,当然这里只说正规的。那我们就着“一对一直播脚本编程自学可行吗”简单聊几句。 我对这个感触颇深: 我的观点是,作为一个过来人,自学编

kefu77776666的博客 310

SSM框架实现登陆注册功能-从零学习SSM框架(4)

前言 很久没有做过后台开发了,最近朝花夕拾,重新回忆回忆SSM框架的基本知识。记记笔记。 正文 本文将从零开始实现网络中常用的登陆注册功能。所有操作均基于前几篇关于SSM框架文章操作。 准备 依然是mysql数据库,数据库与表名和之前的一致,我这几篇文章是一个项目中的,哦哈哈哈哈。新增一个字段password吧。 原理再现 注册 所谓注册即是向系统中新增数据, 代码实现 ...

明明哥的博客 4771
上一篇: 页面动态排序
下一篇: 朝花夕拾 之 J2EE中的事务处理
java008
博客等级 码龄23年 6粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值