java+ajax实现web目录树

这是我今天做的java+ajax实现的目录树 做了一天 终于弄出来了 死了好多脑细胞,不容易啊 ,开始在网上找了好多资料,本人愚拙没用一个弄清楚了,无奈之下,只有自己动手丰衣足食。

开始的时候我没用考虑到性能,所以用到了java递归的方式,架上项目数据库后测试才发现,速度慢的惊人(共几万条数据)。需要点击父目录后才查询显示父目录下面的子目录。所以不得不改变方针。

我用到js 递归生成div   下面是我实现的一个大概效果图的一部分。没用用到css有点丑哈 呵呵。用jquery也可以实现。不过我还是用js把他敲完了 (本人对jquery不熟悉,看来还得学习啊 要不真跟不上了,用jquery做起来就要简单多了)



代码和步骤如下:

1.加载第一层数据(无需用到ajax)。

2.根据第一层触发onclick事件去请求ajax显示以下各层。

声明以下 我使用的是SSH2 所以下面的代码或许不全,因为省略的大家都清楚。

Action代码:

package com.gyhq.view;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.gyhq.dao.pojo.GhRegionalismTree;
import com.gyhq.service.IGhregionalismTreeBiz;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class GhRegionalismAction extends ActionSupport {
	private IGhregionalismTreeBiz iGhregionalismTreeBiz;//业务逻辑层接口
	private List<GhRegionalismTree> GhRegionalismList = new Vector<GhRegionalismTree>();//用于存放行政区划数据的集合
	private GhRegionalismTree ghRegionalismTree = new GhRegionalismTree();//行政区划实体
	
	
	public GhRegionalismTree getGhRegionalismTree() {
		return ghRegionalismTree;
	}
	public void setGhRegionalismTree(GhRegionalismTree ghRegionalismTree) {
		this.ghRegionalismTree = ghRegionalismTree;
	}
	public List<GhRegionalismTree> getGhRegionalismList() {
		return GhRegionalismList;
	}
	public void setGhRegionalismList(List<GhRegionalismTree> ghRegionalismList) {
		GhRegionalismList = ghRegionalismList;
	}
	
	
	/**
	 * 添加setter器 给是pring配置文件注入
	 * 
	 * @author 冯旭
	 * @param iGhregionalismTreeBiz
	 *            IGhregionalismTreeBiz接口
	 */
	public void setiGhregionalismTreeBiz(
			IGhregionalismTreeBiz iGhregionalismTreeBiz) {
		this.iGhregionalismTreeBiz = iGhregionalismTreeBiz;
	}

	/**
	 * 跳转到目录树页面
	 * @return
	 *//*
	public String trunToListTreePage(){
		return SUCCESS;
	}*/
	
	
	/**
	 * 显示行政区划树形结构的第一层
	 * 
	 * @author 冯旭
	 * @return String :如果成功就返回SUCCESS 否则返回ERROR
	 */
	public String displayRegionalismTree() {
		GhRegionalismList = iGhregionalismTreeBiz.findByFatherRegionalismId("0");
		return SUCCESS;
	}
	
	/**采用ajax返回行政区划树的其他层
	 * @author 冯旭
	 * @return String :返回null
	 * @throws IOException 
	 */
	public String ajaxDisplayRegionalismTree() throws IOException{
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setContentType("text/plain");// 设置输出为文字流
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		List<GhRegionalismTree> grl = new ArrayList<GhRegionalismTree>();
		grl = iGhregionalismTreeBiz.findByFatherRegionalismId(ghRegionalismTree.getSonRegionalismId());
		for (GhRegionalismTree ggt : grl) {
			out.print(ggt.getRegionalismName() + "|" + ggt.getSonRegionalismId() + ",");
			System.out.println(ggt.getRegionalismName() + "|" + ggt.getSonRegionalismId() + ",");
		}
		return null;
	}
}

行政区划DAO(只用到了里面的两方法):

public List<GhRegionalismTree> findByProperty(String propertyName,
			Object value) {
		log.debug("finding GhRegionalismTree instance with property: "
				+ propertyName + ", value: " + value);
		try {
			String queryString = "from GhRegionalismTree as model where model."
					+ propertyName + "= ?";
			List<GhRegionalismTree> l= getHibernateTemplate().find(queryString, value);
			return l;
		} catch (RuntimeException re) {
			log.error("find by property name failed", re);
			throw re;
		}
	}

	/* (non-Javadoc)
	 * @see com.gyhq.dao.impl.IGhRegionalismTreeDAO#findByFatherRegionalismId(java.lang.String)
	 */
	@Override
	public List<GhRegionalismTree> findByFatherRegionalismId(
			String fatherRegionalismId) {
		return findByProperty(FATHER_REGIONALISM_ID, fatherRegionalismId);
	}

行政区划实体类就不给出了 值给出他的字段,因为都是些get  set的 。

        private String sonRegionalismId;// 行政区划编码
	private String regionalismName;// 行政区划名称
	private String fatherRegionalismId;// 行政区划父级编码


关键代码html部分:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>一事一议财政奖补管理系统-行政区划树</title>
		<script type="text/javascript">
var xmlHttpRequest;
var level = 0; //控制树的层次
function createXmlHttpRequest() {
	if (window.ActiveXObject) {
		try {
			xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {
			xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		}
		return xmlHttpRequest;
	} else if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	}
}
function display(id) {
	eval("var div=div" + id);
	eval("var img=img" + id);
	eval("var im=im" + id);
	div.style.display = div.style.display == "block" ? "none" : "block";
	img.src = div.style.display == "block" ? "${pageContext.request.contextPath}/images/minus.gif"
			: "${pageContext.request.contextPath}/images/plus.gif";
	im.src = div.style.display == "block" ? "${pageContext.request.contextPath}/images/openfold.gif"
			: "${pageContext.request.contextPath}/images/closedfold.gif";
	img.alt = div.style.display == "block" ? "关闭" : "展开";
	
	xmlHttpRequest = createXmlHttpRequest();
	url = "ajaxDisplayRegionalismTree!ajaxDisplayRegionalismTree.action?ghRegionalismTree.sonRegionalismId=" + id;
	var dangqiandiv = document.getElementById("div"+id);//动态的当前div
	if(div.style.display == "block" && dangqiandiv.innerHTML == ""){
		xmlHttpRequest.open('post', url, true);
		xmlHttpRequest.onreadystatechange = function() {
			if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {
				var regionalismInfos = xmlHttpRequest.responseText;
				var regionalismInfo = regionalismInfos.split(",");
				for ( var i = 0; i < (regionalismInfo.length - 1); i++) {
					var regionalismInformance = regionalismInfo[i].split("|");
					//创建一个div
					var createDiv = document.createElement("div");	
					var fatherLength = regionalismInformance[1].length;
					//根据项目树形的结构具体可根据子ID的长度判断树的层次		
					switch(fatherLength){
						case 4:
							level = 2;
							break;
						case 6:
							level = 3;	
							break;
						case 9:
							level = 4;
							break;
						case 12:
							level = 5;
							break;
						case 14:
							level = 6;
							break;
					}
					for(var j = 0; j < level; j++){
						createDiv.innerHTML += "<img src='${pageContext.request.contextPath}/images/white.gif'>";
					}
					//如果不是最后一级  依然显示文件夹 否则显示最终文件图标
					if(regionalismInformance[1].length != 14){
						//动态给div添加内容
						createDiv.innerHTML += "<img alt='展开' style='cursor: hand;'" 
						+"onClick='display(\""+regionalismInformance[1]+"\")'; id='img"+regionalismInformance[1]+"'src='${pageContext.request.contextPath}/images/plus.gif'>"
						+"<img id='im"+regionalismInformance[1]+"' src='${pageContext.request.contextPath}/images/closedfold.gif'>"+
						regionalismInformance[1]+regionalismInformance[0]+"<div style='display:none;' id='div"+regionalismInformance[1]+"'> </div>";
						
						//将创建的div附加到父亲div
						dangqiandiv.appendChild(createDiv);
					}else {
						//动态给div添加内容
						createDiv.innerHTML += "<img id='im"+regionalismInformance[1]+"' src='${pageContext.request.contextPath}/images/file.gif'>"+
						regionalismInformance[1]+regionalismInformance[0]+"<div style='display:none;' id='div"+regionalismInformance[1]+"'> </div>";
						
						//将创建的div附加到父亲div
						dangqiandiv.appendChild(createDiv);
					}
				}
			}
		};
		xmlHttpRequest.setRequestHeader("if-Modified-Since", "0");
		xmlHttpRequest.send(null);
	}
}
</script>
		<style type="text/css">
img {
	border: 0
}
</style>
	</head>

	<body bgcolor="#E0FFFF">
		<CENTER>
			<table>
				<tr>
					<td valign="top" nowrap="nowrap">
						<div>
							<c:forEach items="${requestScope.GhRegionalismList}" var="ghRegionalisms">
								<div>
									<img src="${pageContext.request.contextPath}/images/white.gif">
									<img alt="展开" style="cursor: hand;" onClick="display('${ghRegionalisms.sonRegionalismId}');" id="img${ghRegionalisms.sonRegionalismId}" src="${pageContext.request.contextPath}/images/plus.gif">
									<img id="im${ghRegionalisms.sonRegionalismId}" src="${pageContext.request.contextPath}/images/closedfold.gif">
										0${ghRegionalisms.regionalismName}
									<div style="display:none;" id="div${ghRegionalisms.sonRegionalismId}">
										
									</div>
								</div>
							</c:forEach>
						</div>
					</td>
				</tr>
			</table>
		</CENTER>
	</body>
</html>


 

配置文件些我就不写出来了  每个配置文件也就几句话,大家都很清楚。


的确花了我很多的时间 在这里分享给大家,希望大家多多指正,我真的理解刚开始写这个的朋友们,就像昨天我到处问人,在网上找资料,可惜没一个人理我。

网上实现目录树的方法的确有很多,不过都很乱,大概是本人比较愚笨吧 ,呵呵。

还望朋友们分享更好的方法。在此谢过了!



  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值