DHTML Tree 使用实例

本文介绍了一个基于Java的动态菜单实现方案,包括jsp页面显示菜单、Action处理菜单数据、使用dom4j格式化数据等关键步骤,并提供了checkbox使用的额外功能。
Java 动态菜单实例


一.jsp页面显示菜单(最简单的树型菜单)

<%@ page language="java" contentType="text/html;charset=UTF-8"%>

<%@ include file="../includes/includeTags.jspf"%>

<HTML><HTML>

<HEAD>

<TITLE>PAS菜单</TITLE>

<LINK href="../resources/css/site.css" rel="stylesheet" type="text/css" />

<link rel="STYLESHEET" type="text/css" href="../resources/css/dhtmlXTree.css">

<script src="../resources/js/dhtml/dhtmlXCommon.js"></script>

<script src="../resources/js/dhtml/dhtmlXTree.js"></script>

<script src="../resources/js/dhtml/dhtmlXTree_start.js"></script>

<%

String id = request.getParameter("id");

request.setAttribute("id", id);

%>

</HEAD>

<BODY>

<div id="menuTree"></div>

<script>

tree=new dhtmlXTreeObject(document.getElementById('menuTree'),"100%","100%",0);

tree.setImagePath("../images/imgs/csh_winstyle/");//设置菜单图片风格路径。

//link tree to asp script

tree.setXMLAutoLoading("../menuTree.do?method=showMenu");


//load first level of tree

tree.loadXML("../menuTree.do?method=showMenu&type=root&id=<c:out value='${id}'/>");


//设置点击事件,打开对应连接页面。

tree.setOnClickHandler(doOnClick);

//tree.setOnOpenHandler(tonopen);


//设置菜单图片类型,目前有3中风格可选,也可自定义风格。

//tree.setImageArrays("plus","","","","plus_ar.gif");

//tree.setImageArrays("minus","","","","minus_ar.gif");

//tree.setStdImages("book.gif","books_open.gif","books_close.gif");


function doOnClick(nodeId){

var myUrl = tree.getUserData(nodeId,"file")

if(null != myUrl && myUrl !='#'){

parent.mainMenu.location=myUrl;

}

}

</script>

</BODY>

</HTML>

二.Action取得菜单数据,并处理菜单格式。

使用dom4j格式化数据。

public class ShowMenuAction extends PasBaseAction{


@Override

protected Class setClass() {

return this.getClass();

}

//dom4j 对象

private Document document = null;

private Element rootElement = null;

private Element prevElement = null;


public ActionForward showMenu(

ActionMapping mapping,

ActionForm form,

HttpServletRequest request,

HttpServletResponse response)throws Exception {

// a) 获取参数grpId

String xmdh = request.getParameter("id");//上级菜单编号

String type = request.getParameter("type");//根菜单类型。

//取用户

LoginUser user = getLoginUser(request);

MenuService menuSrv = (MenuService)SpringAppContext.getBean(MenuService.KEY);


//根菜单

if (null != type && type.equals("root")) {

document = DocumentHelper.createDocument();

rootElement = document.addElement("tree");

rootElement.addAttribute("id", "0");


XtbXtcd key = new XtbXtcd();//菜单对象。(下附菜单对象类)

key.setXmdh(Integer.parseInt(xmdh));

XtbXtcd rootCd = menuSrv.selectByPrimaryKey(key);//根菜单对象

addElement(rootElement,rootCd);

} else {

document = DocumentHelper.createDocument();

rootElement = document.addElement("item");

rootElement.addAttribute("id", xmdh);


//下级菜单数据集合(附带用户权限)

List menu = menuSrv.LoadUserMenuChildrens(user.getKhdxdh().toString(),xmdh);

for (Iterator it=menu.iterator() ; it.hasNext(); ){

XtbXtcd firstCd = (XtbXtcd)it.next();


//找到父菜单的element

String pareId = firstCd.getSjxm()+"";

prevElement = null;

Iterator itr = rootElement.elementIterator();

getElement(itr, pareId);


addElement(rootElement,firstCd);

}

}

//输出格式化后的数据

Writer writer = response.getWriter();

response.setContentType("text/xml; charset=GB2312");

document.write(writer);

writer.close();

return null;

}


/**

* 找到父id

* @param nodelist

* @param id

*/

private void getElement(Iterator nodelist, String id) {

if (nodelist.hasNext() == false)

return;

while (nodelist.hasNext()) {

if (prevElement != null)

break;

Element cnode = (Element) nodelist.next();

if (cnode.getNodeType() == Document.ELEMENT_NODE) {

if (id.equals(((Element) cnode).attributeValue("id"))) {

prevElement = (Element) cnode;

} else

getElement(cnode.elementIterator(), id);

}

}

return;

}


/**

* 添加item

* @param element

* @param menu

*/

void addElement(Element element,XtbXtcd menu){


Element newElement = element.addElement("item");

newElement.addAttribute("text", menu.getXmmc());

newElement.addAttribute("id", menu.getXmdh()+"");


if(!menu.isURL()){

newElement.addAttribute("child", "1");

}

addUrl(newElement,menu);

}


/**

* 添加连接

* @param element

* @param childCd

*/

void addUrl(Element element,XtbXtcd childCd){

if(childCd.isURL()){

Element urlElement=element.addElement("userdata");

urlElement.addAttribute("name", "file");

urlElement.setText(childCd.getXmdz());

}

}


public Document getDocument() {

return document;

}


public void setDocument(Document document) {

this.document = document;

}


public Element getPrevElement() {

return prevElement;

}


public void setPrevElement(Element prevElement) {

this.prevElement = prevElement;

}


public Element getRootElement() {

return rootElement;

}


public void setRootElement(Element rootElement) {

this.rootElement = rootElement;

}

}

三、菜单对象类

public class XtbXtcd {


//菜单级别分类

public final static int NODE_UNKNOW = 0;

public final static int NODE_CATALOG = 1;

public final static int NODE_URL = 2;

public final static int NODE_FUNCTION = 4;

public final static int NODE_MENU = 8;

public final static int NODE_SYSTEM = 16;


private Integer xmdh; //菜单编号 主键

private String xmmc; //菜单名称

private String xmdz; //菜单地址

private Integer sjxm; //上级菜单编号

private String cdjb; //菜单级别


//user only this to instead type of string

public boolean isMenuItem() {

return (Integer.parseInt(cdjb) & NODE_MENU) == NODE_MENU;

}


public boolean isURL() {

return (Integer.parseInt(cdjb) & NODE_URL) == NODE_URL;

}


public boolean isCatalog() {

return (Integer.parseInt(cdjb) & NODE_CATALOG) == NODE_CATALOG;

}


public boolean isFunction() {

return (Integer.parseInt(cdjb) & NODE_FUNCTION) == NODE_FUNCTION;

}


public boolean isSystem() {

return (Integer.parseInt(cdjb) & NODE_SYSTEM) == NODE_SYSTEM;

}


public Integer getXmdh() {

return xmdh;

}

。。。。下略

}


四、其他实用功能粗解

1. checkbox使用

1.1 Jsp页面设置

tree.enableCheckBoxes(1);

tree.enableThreeStateCheckboxes(true);//级联选中下级节点


//check item

tree.setCheck(id,true);

//uncheck item

tree.setCheck(id,false);

//check branch

tree.setSubChecked(id,true);

//uncheck branch

tree.setSubChecked(id,false);

//check item

tree.setCheck(id,true);

//return ids of checked items

var list=tree.getAllChecked();//取得所有选中的,不包括父

var list=tree.getAllCheckedBranches() //取得所有选中的父。父的父。。。。

var list= tree.getAllPartiallyChecked() //取得所有选中的,包括父,父的父
内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值