本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7598884
建立时间:2006年5月29日




[Java Open Source]运用ajax技术的树型菜单
软件技术

lhwork 发表于 2006/7/24 10:16:47

树型菜单可以说是项目中应用最为广泛的运用。以前无论使用微软控件的树型,还是比较优秀的阿赖树型,都是将数据全部读出,然后再分级显示。这样如果数据量大,那么第一次显示将需要客户等待很长一段时间,降低了客户的体验度。如今使用ajax,事情变得简单了。    此运用参考了《征服web2.0开发技术详解》的例子。    我使用的平台是struts+spring+hibernate,但与ajax打交道的也就是struts。我无法将整个代码贴出来,因此把重要的前台ajax代码贴出来,至于后台的代码就看你自己所使用的技术了。1、jsp页面 500)this.width=500'> <% @ page language = " java "  contentType = " text/html; charset=GB2312 "   import = " java.util.*,com.wehave.oa.cecontract.model.TbJyhtflb " %> 500)this.width=500'> < html > 500)this.width=500'> < head > 500)this.width=500'> < title > Insert title here </ title > 500)this.width=500'> < link rel = " stylesheet "  href  =   " ../css/tree.css " > 500)this.width=500'> < script type = " text/javascript "  src = " ../js/tree_ajax.js " ></ script > 500)this.width=500'> < script type = " text/javascript "  src = " ../js/tree_htfl.js " ></ script > 500)this.width=500'> < script languge = " javascript " > 500)this.width=500'> 500)this.width=500'>    function ShowDetail(ID,NAME,FLAG) 500)this.width=500'> {500)this.width=500'>        window.parent.right.location  = " getContract.go?method=doGetContract&folderID= "   + ID  +   " &&folderName= " + NAME + " &&flag= " + FLAG;500)this.width=500'>    } 500)this.width=500'> </ script > 500)this.width=500'> </ head > 500)this.width=500'> < body bgcolor = " #F6F9FF " > 500)this.width=500'> < tbody > 500)this.width=500'> < table cellpadding = " 0 "  cellspacing = " 0 "  width = " 300 "   > 500)this.width=500'>  < div id = " load "  style = " display:none " >   < img src = " ../images/tree_loading.gif " > Loading data.. </ div > 500)this.width=500'> < ul  class = " tree " > 500)this.width=500'> <%   List treeList  =  (List)request.getAttribute( " treefolder " );500)this.width=500'>    Iterator it = treeList.iterator();500)this.width=500'>500)this.width=500'>     while (it.hasNext()) 500)this.width=500'> {500)this.width=500'>        out.println(it.next().toString());500)this.width=500'>    } 500)this.width=500'> %> 500)this.width=500'> </ table > 500)this.width=500'> </ tbody > 500)this.width=500'> </ body > 500)this.width=500'> </ html > 2、js代码500)this.width=500'>function showHide( id )500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'>  var el= document.getElementById( id );500)this.width=500'>  var bExpand = true;500)this.width=500'>  var images = el.getElementsByTagName("IMG");500)this.width=500'>  if (images[0].src.indexOf("tree_minus.gif")!=-1)500)this.width=500'>500)this.width=500'>  500)this.width=500'>{500)this.width=500'>    bExpand = false;500)this.width=500'>    images[0].src="../images/tree_plus.gif";500)this.width=500'>500)this.width=500'>  }else500)this.width=500'>{500)this.width=500'>    images[0].src="../images/tree_minus.gif";500)this.width=500'>  }500)this.width=500'>  var subs=el.lastChild;500)this.width=500'>  if(bExpand)500)this.width=500'>    subs.style.display="block";500)this.width=500'>  else500)this.width=500'>    subs.style.display="none";500)this.width=500'>}500)this.width=500'>500)this.width=500'>function getSubTree( id ,submitURL)500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'>  var submitURL=submitURL500)this.width=500'>  postXmlHttp( submitURL, 'parseSubTree("'+id+'")' ,'load("'+id+'")');500)this.width=500'>}500)this.width=500'>function parseSubTree(id)500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'>  var el= document.getElementById( id );500)this.width=500'>  var ulElmt= document.createElement("UL");500)this.width=500'>  ulElmt.innerHTML=_xmlHttpRequestObj.responseText;500)this.width=500'>  el.appendChild(ulElmt);500)this.width=500'>  var images = el.getElementsByTagName("IMG");500)this.width=500'>  images[0].setAttribute("src", "../images/tree_minus.gif");500)this.width=500'>  images[0].setAttribute("onclick", new Function("showHide('"+id+"')"));500)this.width=500'>  var aTag = el.getElementsByTagName("A");500)this.width=500'>  aTag[0].setAttribute("onclick", new Function("showHide('"+id+"')"));500)this.width=500'>  var loadDiv= document.getElementById( "load" );500)this.width=500'>  loadDiv.style.display="none";500)this.width=500'>}500)this.width=500'>500)this.width=500'>function load(id)500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'> var loadDiv= document.getElementById( "load" );500)this.width=500'> loadDiv.style.display="block";500)this.width=500'>}500)this.width=500'>500)this.width=500'>var _postXmlHttpProcessPostChangeCallBack;500)this.width=500'>var _xmlHttpRequestObj;500)this.width=500'>var _loadingFunction;500)this.width=500'>500)this.width=500'>function postXmlHttp( submitUrl, callbackFunc ,loadFunc)500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'>  _postXmlHttpProcessPostChangeCallBack = callbackFunc;500)this.width=500'>  _loadingFunction = loadFunc;500)this.width=500'>  if(window.createRequest)500)this.width=500'>500)this.width=500'>  500)this.width=500'>{500)this.width=500'>500)this.width=500'>    try500)this.width=500'>{500)this.width=500'>      _xmlHttpRequestObj=window.createRequest();500)this.width=500'>      _xmlHttpRequestObj.open('POST',submitUrl,true);500)this.width=500'>      _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;500)this.width=500'>      _xmlHttpRequestObj.send();500)this.width=500'>    }500)this.width=500'>500)this.width=500'>    catch(ee)500)this.width=500'>{}500)this.width=500'>  }500)this.width=500'>  else if(window.XMLHttpRequest)500)this.width=500'>500)this.width=500'>  500)this.width=500'>{500)this.width=500'>    _xmlHttpRequestObj=new XMLHttpRequest();500)this.width=500'>    _xmlHttpRequestObj.overrideMimeType('text/xml');500)this.width=500'>    _xmlHttpRequestObj.open('POST',submitUrl,true);500)this.width=500'>    _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;500)this.width=500'>    _xmlHttpRequestObj.send("");500)this.width=500'>  }500)this.width=500'>  else if(window.ActiveXObject)500)this.width=500'>500)this.width=500'>  500)this.width=500'>{500)this.width=500'>    _xmlHttpRequestObj=new ActiveXObject("Microsoft.XMLHTTP");500)this.width=500'>    _xmlHttpRequestObj.open('POST',submitUrl,true);500)this.width=500'>    _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;500)this.width=500'>    _xmlHttpRequestObj.send();500)this.width=500'>  }500)this.width=500'>};500)this.width=500'>500)this.width=500'>function postXmlHttpProcessPostChange( )500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'>  if( _xmlHttpRequestObj.readyState==4)500)this.width=500'>500)this.width=500'>  500)this.width=500'>{500)this.width=500'>500)this.width=500'>      if(_xmlHttpRequestObj.status==200)500)this.width=500'>{500)this.width=500'>        setTimeout( _postXmlHttpProcessPostChangeCallBack, 2 );500)this.width=500'>500)this.width=500'>    }else500)this.width=500'>{500)this.width=500'>        alert(_xmlHttpRequestObj.status);500)this.width=500'>    }500)this.width=500'>  }500)this.width=500'>  if ( _xmlHttpRequestObj.readyState==1 )500)this.width=500'>500)this.width=500'>  500)this.width=500'>{500)this.width=500'>    setTimeout( _loadingFunction, 2 );500)this.width=500'>  }500)this.width=500'>}3、action代码500)this.width=500'>500)this.width=500'>/** *//**500)this.width=500'>     * 展开第一层目录500)this.width=500'>     */500)this.width=500'>    public ActionForward doGetFolderList(500)this.width=500'>            ActionMapping mapping,500)this.width=500'>            ActionForm form,500)this.width=500'>            HttpServletRequest req,500)this.width=500'>500)this.width=500'>            HttpServletResponse res)500)this.width=500'>{500)this.width=500'>        List list = treeCatalogService.getChildren("0");500)this.width=500'>        List TreeFolder=new ArrayList();500)this.width=500'>        Iterator it=list.iterator();500)this.width=500'>500)this.width=500'>        while(it.hasNext())500)this.width=500'>{500)this.width=500'>            TbJyhtflb htfl=(TbJyhtflb)it.next();500)this.width=500'>            String s=treeCatalogService.renderTreeViewAjax(htfl);500)this.width=500'>            TreeFolder.add(s);500)this.width=500'>        }500)this.width=500'>        req.setAttribute("treefolder",TreeFolder);500)this.width=500'>        return mapping.findForward("foldertree");500)this.width=500'>    }500)this.width=500'>    500)this.width=500'>500)this.width=500'>    /** *//**500)this.width=500'>     * 展开下级目录500)this.width=500'>     */500)this.width=500'>    public ActionForward doGetSubFolderList(500)this.width=500'>            ActionMapping mapping,500)this.width=500'>            ActionForm form,500)this.width=500'>            HttpServletRequest req,500)this.width=500'>500)this.width=500'>            HttpServletResponse res)500)this.width=500'>{500)this.width=500'>        String parentID = req.getParameter("parentID"); //获得id的值500)this.width=500'>500)this.width=500'>        if (parentID!=null&&!parentID.equals(""))500)this.width=500'>{ //如果不为null和空500)this.width=500'>            res.setContentType("text/html;charset=GB2312");500)this.width=500'>            List list = treeCatalogService.getChildren(parentID);500)this.width=500'>            Iterator it=list.iterator();500)this.width=500'>500)this.width=500'>            try 500)this.width=500'>{500)this.width=500'>                PrintWriter out= res.getWriter();500)this.width=500'>500)this.width=500'>                while(it.hasNext())500)this.width=500'>{500)this.width=500'>                    TbJyhtflb htfl=(TbJyhtflb)it.next();500)this.width=500'>                    out.println(treeCatalogService.renderTreeViewAjax(htfl));500)this.width=500'>                }500)this.width=500'>                out.close();500)this.width=500'>500)this.width=500'>            }catch(Exception e)500)this.width=500'>{500)this.width=500'>                e.printStackTrace();500)this.width=500'>            }500)this.width=500'>        }500)this.width=500'>        return null;500)this.width=500'>    }4、service层代码500)this.width=500'>500)this.width=500'>/** *//**500)this.width=500'>     * 函数说明:展开目录500)this.width=500'>     * 参数说明: 目录对象500)this.width=500'>     * 返回值:展开目录的HTML代码500)this.width=500'>     */500)this.width=500'>500)this.width=500'>    public String renderTreeViewAjax(TbJyhtflb htfl) 500)this.width=500'>{500)this.width=500'>        StringBuffer content = new StringBuffer();500)this.width=500'>        String ID=htfl.getTbJyhtflbZlId();500)this.width=500'>        String NAME=htfl.getTbJyhtflbMc();500)this.width=500'>        String FLAG=htfl.getTbJyhtflbLb();500)this.width=500'>        content.append("<li id='"+ID+"'>");500)this.width=500'>        if (treeCatalogDAO.canExpand(ID))500)this.width=500'>            content.append("<img src=../images/tree_plus.gif onClick=\"getSubTree('"+ID+"')\">");500)this.width=500'>        else500)this.width=500'>            content.append("<img src=../images/tree_blank.gif>");500)this.width=500'>        content.append("<img src=../images/tree_folder.gif><a href=\"javascript :ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')\"");500)this.width=500'>500)this.width=500'>        if (treeCatalogDAO.canExpand(ID))500)this.width=500'>{500)this.width=500'>            String submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;500)this.width=500'>            content.append(" onClick=\"getSubTree('"+ID+"',submitURL)\"");500)this.width=500'>        }500)this.width=500'>        content.append(">"+NAME+"</a>");500)this.width=500'>        500)this.width=500'>        content.append("</li>");500)this.width=500'>        return content.toString();500)this.width=500'>    }代码基本就是这样了,希望对大家有用。


阅读全文(5084) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.079 second(s), page refreshed 144786718 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号