树型菜单可以说是项目中应用最为广泛的运用。以前无论使用微软控件的树型,还是比较优秀的阿赖树型,都是将数据全部读出,然后再分级显示。这样如果数据量大,那么第一次显示将需要客户等待很长一段时间,降低了客户的体验度。如今使用ajax,事情变得简单了。
		   此运用参考了《征服web2.0开发技术详解》的例子。
		   我使用的平台是struts+spring+hibernate,但与ajax打交道的也就是struts。我无法将整个代码贴出来,因此把重要的前台ajax代码贴出来,至于后台的代码就看你自己所使用的技术了。
1、jsp页面
		
				 <%
				@ page language
				=
				"
				java
				"
				 contentType
				=
				"
				text/html; charset=GB2312
				"
				 
				import
				=
				"
				java.util.*,com.wehave.oa.cecontract.model.TbJyhtflb
				"
				%>
				<%
				@ page language
				=
				"
				java
				"
				 contentType
				=
				"
				text/html; charset=GB2312
				"
				 
				import
				=
				"
				java.util.*,com.wehave.oa.cecontract.model.TbJyhtflb
				"
				%>
				
						
						 <
				html
				>
				
				<
				html
				>
				
						
						 <
				head
				>
				
				<
				head
				>
				
						
						 <
				title
				>
				Insert title here
				</
				title
				>
				
				<
				title
				>
				Insert title here
				</
				title
				>
				
						
						 <
				link rel
				=
				"
				stylesheet
				"
				 href 
				=
				 
				"
				../css/tree.css
				"
				>
				
				<
				link rel
				=
				"
				stylesheet
				"
				 href 
				=
				 
				"
				../css/tree.css
				"
				>
				
						
						 <
				script type
				=
				"
				text/javascript
				"
				 src
				=
				"
				../js/tree_ajax.js
				"
				></
				script
				>
				
				<
				script type
				=
				"
				text/javascript
				"
				 src
				=
				"
				../js/tree_ajax.js
				"
				></
				script
				>
				
						
						 <
				script type
				=
				"
				text/javascript
				"
				 src
				=
				"
				../js/tree_htfl.js
				"
				></
				script
				>
				
				<
				script type
				=
				"
				text/javascript
				"
				 src
				=
				"
				../js/tree_htfl.js
				"
				></
				script
				>
				
						
						 <
				script languge
				=
				"
				javascript
				"
				>
				
				<
				script languge
				=
				"
				javascript
				"
				>
				
						
						 
						 function ShowDetail(ID,NAME,FLAG)
    function ShowDetail(ID,NAME,FLAG)
				
						 {
				
				
						{
 window.parent.right.location 
						=
						"
						getContract.go?method=doGetContract&folderID=
						"
						 
						+
						ID 
						+
						 
						"
						&&folderName=
						"
						+
						NAME
						+
						"
						&&flag=
						"
						+
						FLAG;
        window.parent.right.location 
						=
						"
						getContract.go?method=doGetContract&folderID=
						"
						 
						+
						ID 
						+
						 
						"
						&&folderName=
						"
						+
						NAME
						+
						"
						&&flag=
						"
						+
						FLAG;
 }
    }
				
				
						
						 </
				script
				>
				
				</
				script
				>
				
						
						 </
				head
				>
				
				</
				head
				>
				
						
						 <
				body bgcolor
				=
				"
				#F6F9FF
				"
				>
				
				<
				body bgcolor
				=
				"
				#F6F9FF
				"
				>
				
						
						 <
				tbody
				>
				
				<
				tbody
				>
				
						
						 <
				table cellpadding
				=
				"
				0
				"
				 cellspacing
				=
				"
				0
				"
				 width
				=
				"
				300
				"
				 
				>
				
				<
				table cellpadding
				=
				"
				0
				"
				 cellspacing
				=
				"
				0
				"
				 width
				=
				"
				300
				"
				 
				>
				
						
						 <
				div id
				=
				"
				load
				"
				 style
				=
				"
				display:none
				"
				>
				 
				<
				img src
				=
				"
				../images/tree_loading.gif
				"
				>
				Loading data..
				</
				div
				>
 
				<
				div id
				=
				"
				load
				"
				 style
				=
				"
				display:none
				"
				>
				 
				<
				img src
				=
				"
				../images/tree_loading.gif
				"
				>
				Loading data..
				</
				div
				>
				
						
						 <
				ul 
				class
				=
				"
				tree
				"
				>
				
				<
				ul 
				class
				=
				"
				tree
				"
				>
				
						
						 <%
				  List treeList 
				=
				 (List)request.getAttribute(
				"
				treefolder
				"
				);
				
				<%
				  List treeList 
				=
				 (List)request.getAttribute(
				"
				treefolder
				"
				);
 Iterator it
				=
				treeList.iterator();
    Iterator it
				=
				treeList.iterator();

 while
				(it.hasNext())
    
				while
				(it.hasNext())
				
						 {
				
				
						{
 out.println(it.next().toString());
        out.println(it.next().toString());
 }
    }
				
				
						
						 %>
				
				%>
				
						
						 </
				table
				>
				
				</
				table
				>
				
						
						 </
				tbody
				>
				
				</
				tbody
				>
				
						
						 </
				body
				>
				
				</
				body
				>
				
						
						 </
				html
				>
				
				</
				html
				>
		 
		2、js代码
 function showHide( id )
function showHide( id )


 {
{
 var el= document.getElementById( id );
  var el= document.getElementById( id );
 var bExpand = true;
  var bExpand = true;
 var images = el.getElementsByTagName("IMG");
  var images = el.getElementsByTagName("IMG");
 if (images[0].src.indexOf("tree_minus.gif")!=-1)
  if (images[0].src.indexOf("tree_minus.gif")!=-1)

 
   {
{
 bExpand = false;
    bExpand = false;
 images[0].src="../images/tree_plus.gif";
    images[0].src="../images/tree_plus.gif";

 }else
  }else {
{
 images[0].src="../images/tree_minus.gif";
    images[0].src="../images/tree_minus.gif";
 }
  }
 var subs=el.lastChild;
  var subs=el.lastChild;
 if(bExpand)
  if(bExpand)
 subs.style.display="block";
    subs.style.display="block";
 else
  else
 subs.style.display="none";
    subs.style.display="none";
 }
}

 function getSubTree( id ,submitURL)
function getSubTree( id ,submitURL)


 {
{
 var submitURL=submitURL
  var submitURL=submitURL
 postXmlHttp( submitURL, 'parseSubTree("'+id+'")' ,'load("'+id+'")');
  postXmlHttp( submitURL, 'parseSubTree("'+id+'")' ,'load("'+id+'")');
 }
}
 function parseSubTree(id)
function parseSubTree(id)


 {
{
 var el= document.getElementById( id );
  var el= document.getElementById( id );
 var ulElmt= document.createElement("UL");
  var ulElmt= document.createElement("UL");
 ulElmt.innerHTML=_xmlHttpRequestObj.responseText;
  ulElmt.innerHTML=_xmlHttpRequestObj.responseText;
 el.appendChild(ulElmt);
  el.appendChild(ulElmt);
 var images = el.getElementsByTagName("IMG");
  var images = el.getElementsByTagName("IMG");
 images[0].setAttribute("src", "../images/tree_minus.gif");
  images[0].setAttribute("src", "../images/tree_minus.gif");
 images[0].setAttribute("onclick", new Function("showHide('"+id+"')"));
  images[0].setAttribute("onclick", new Function("showHide('"+id+"')"));
 var aTag = el.getElementsByTagName("A");
  var aTag = el.getElementsByTagName("A");
 aTag[0].setAttribute("onclick", new Function("showHide('"+id+"')"));
  aTag[0].setAttribute("onclick", new Function("showHide('"+id+"')"));
 var loadDiv= document.getElementById( "load" );
  var loadDiv= document.getElementById( "load" );
 loadDiv.style.display="none";
  loadDiv.style.display="none";
 }
}

 function load(id)
function load(id)


 {
{
 var loadDiv= document.getElementById( "load" );
 var loadDiv= document.getElementById( "load" );
 loadDiv.style.display="block";
 loadDiv.style.display="block";
 }
}

 var _postXmlHttpProcessPostChangeCallBack;
var _postXmlHttpProcessPostChangeCallBack;
 var _xmlHttpRequestObj;
var _xmlHttpRequestObj;
 var _loadingFunction;
var _loadingFunction;

 function postXmlHttp( submitUrl, callbackFunc ,loadFunc)
function postXmlHttp( submitUrl, callbackFunc ,loadFunc)


 {
{
 _postXmlHttpProcessPostChangeCallBack = callbackFunc;
  _postXmlHttpProcessPostChangeCallBack = callbackFunc;
 _loadingFunction = loadFunc;
  _loadingFunction = loadFunc;
 if(window.createRequest)
  if(window.createRequest)

 
   {
{

 try
    try {
{
 _xmlHttpRequestObj=window.createRequest();
      _xmlHttpRequestObj=window.createRequest();
 _xmlHttpRequestObj.open('POST',submitUrl,true);
      _xmlHttpRequestObj.open('POST',submitUrl,true);
 _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
      _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
 _xmlHttpRequestObj.send();
      _xmlHttpRequestObj.send();
 }
    }

 catch(ee)
    catch(ee) {}
{}
 }
  }
 else if(window.XMLHttpRequest)
  else if(window.XMLHttpRequest)

 
   {
{
 _xmlHttpRequestObj=new XMLHttpRequest();
    _xmlHttpRequestObj=new XMLHttpRequest();
 _xmlHttpRequestObj.overrideMimeType('text/xml');
    _xmlHttpRequestObj.overrideMimeType('text/xml');
 _xmlHttpRequestObj.open('POST',submitUrl,true);
    _xmlHttpRequestObj.open('POST',submitUrl,true);
 _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
    _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
 _xmlHttpRequestObj.send("");
    _xmlHttpRequestObj.send("");
 }
  }
 else if(window.ActiveXObject)
  else if(window.ActiveXObject)

 
   {
{
 _xmlHttpRequestObj=new ActiveXObject("Microsoft.XMLHTTP");
    _xmlHttpRequestObj=new ActiveXObject("Microsoft.XMLHTTP");
 _xmlHttpRequestObj.open('POST',submitUrl,true);
    _xmlHttpRequestObj.open('POST',submitUrl,true);
 _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
    _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
 _xmlHttpRequestObj.send();
    _xmlHttpRequestObj.send();
 }
  }
 };
};

 function postXmlHttpProcessPostChange( )
function postXmlHttpProcessPostChange( )


 {
{
 if( _xmlHttpRequestObj.readyState==4)
  if( _xmlHttpRequestObj.readyState==4)

 
   {
{

 if(_xmlHttpRequestObj.status==200)
      if(_xmlHttpRequestObj.status==200) {
{
 setTimeout( _postXmlHttpProcessPostChangeCallBack, 2 );
        setTimeout( _postXmlHttpProcessPostChangeCallBack, 2 );

 }else
    }else {
{
 alert(_xmlHttpRequestObj.status);
        alert(_xmlHttpRequestObj.status);
 }
    }
 }
  }
 if ( _xmlHttpRequestObj.readyState==1 )
  if ( _xmlHttpRequestObj.readyState==1 )

 
   {
{
 setTimeout( _loadingFunction, 2 );
    setTimeout( _loadingFunction, 2 );
 }
  }
 }
}3、action代码

 /** *//**
/** *//**
 * 展开第一层目录
     * 展开第一层目录
 */
     */
 public ActionForward doGetFolderList(
    public ActionForward doGetFolderList(
 ActionMapping mapping,
            ActionMapping mapping,
 ActionForm form,
            ActionForm form,
 HttpServletRequest req,
            HttpServletRequest req,

 HttpServletResponse res)
            HttpServletResponse res) {
{
 List list = treeCatalogService.getChildren("0");
        List list = treeCatalogService.getChildren("0");
 List TreeFolder=new ArrayList();
        List TreeFolder=new ArrayList();
 Iterator it=list.iterator();
        Iterator it=list.iterator();

 while(it.hasNext())
        while(it.hasNext()) {
{
 TbJyhtflb htfl=(TbJyhtflb)it.next();
            TbJyhtflb htfl=(TbJyhtflb)it.next();
 String s=treeCatalogService.renderTreeViewAjax(htfl);
            String s=treeCatalogService.renderTreeViewAjax(htfl);
 TreeFolder.add(s);
            TreeFolder.add(s);
 }
        }
 req.setAttribute("treefolder",TreeFolder);
        req.setAttribute("treefolder",TreeFolder);
 return mapping.findForward("foldertree");
        return mapping.findForward("foldertree");
 }
    }
 
    

 /** *//**
    /** *//**
 * 展开下级目录
     * 展开下级目录
 */
     */
 public ActionForward doGetSubFolderList(
    public ActionForward doGetSubFolderList(
 ActionMapping mapping,
            ActionMapping mapping,
 ActionForm form,
            ActionForm form,
 HttpServletRequest req,
            HttpServletRequest req,

 HttpServletResponse res)
            HttpServletResponse res) {
{
 String parentID = req.getParameter("parentID"); //获得id的值
        String parentID = req.getParameter("parentID"); //获得id的值

 if (parentID!=null&&!parentID.equals(""))
        if (parentID!=null&&!parentID.equals("")) { //如果不为null和空
{ //如果不为null和空
 res.setContentType("text/html;charset=GB2312");
            res.setContentType("text/html;charset=GB2312");
 List list = treeCatalogService.getChildren(parentID);
            List list = treeCatalogService.getChildren(parentID);
 Iterator it=list.iterator();
            Iterator it=list.iterator();

 try
            try  {
{
 PrintWriter out= res.getWriter();
                PrintWriter out= res.getWriter();

 while(it.hasNext())
                while(it.hasNext()) {
{
 TbJyhtflb htfl=(TbJyhtflb)it.next();
                    TbJyhtflb htfl=(TbJyhtflb)it.next();
 out.println(treeCatalogService.renderTreeViewAjax(htfl));
                    out.println(treeCatalogService.renderTreeViewAjax(htfl));
 }
                }
 out.close();
                out.close();

 }catch(Exception e)
            }catch(Exception e) {
{
 e.printStackTrace();
                e.printStackTrace();
 }
            }
 }
        }
 return null;
        return null;
 }
    }4、service层代码

 /** *//**
/** *//**
 * 函数说明:展开目录
     * 函数说明:展开目录
 * 参数说明: 目录对象
     * 参数说明: 目录对象
 * 返回值:展开目录的HTML代码
     * 返回值:展开目录的HTML代码
 */
     */

 public String renderTreeViewAjax(TbJyhtflb htfl)
    public String renderTreeViewAjax(TbJyhtflb htfl)  {
{
 StringBuffer content = new StringBuffer();
        StringBuffer content = new StringBuffer();
 String ID=htfl.getTbJyhtflbZlId();
        String ID=htfl.getTbJyhtflbZlId();
 String NAME=htfl.getTbJyhtflbMc();
        String NAME=htfl.getTbJyhtflbMc();
 String FLAG=htfl.getTbJyhtflbLb();
        String FLAG=htfl.getTbJyhtflbLb();
 content.append("<li id='"+ID+"'>");
        content.append("<li id='"+ID+"'>");
 if (treeCatalogDAO.canExpand(ID))
        if (treeCatalogDAO.canExpand(ID))
 content.append("<img src=../images/tree_plus.gif onClick=\"getSubTree('"+ID+"')\">");
            content.append("<img src=../images/tree_plus.gif onClick=\"getSubTree('"+ID+"')\">");
 else
        else
 content.append("<img src=../images/tree_blank.gif>");
            content.append("<img src=../images/tree_blank.gif>");
 content.append("<img src=../images/tree_folder.gif><a href=\"javascript:ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')\"");
        content.append("<img src=../images/tree_folder.gif><a href=\"javascript:ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')\"");

 if (treeCatalogDAO.canExpand(ID))
        if (treeCatalogDAO.canExpand(ID)) {
{
 String submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
            String submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
 content.append(" onClick=\"getSubTree('"+ID+"',submitURL)\"");
            content.append(" onClick=\"getSubTree('"+ID+"',submitURL)\"");
 }
        }
 content.append(">"+NAME+"</a>");
        content.append(">"+NAME+"</a>");
 
        
 content.append("</li>");
        content.append("</li>");
 return content.toString();
        return content.toString();
 }
    }代码基本就是这样了,希望对大家有用。