马尔代夫
学会真心付出
posts - 0,comments - 0,trackbacks - 0

   树型菜单可以说是项目中应用最为广泛的运用。以前无论使用微软控件的树型,还是比较优秀的阿赖树型,都是将数据全部读出,然后再分级显示。这样如果数据量大,那么第一次显示将需要客户等待很长一段时间,降低了客户的体验度。如今使用ajax,事情变得简单了。

   此运用参考了《征服web2.0开发技术详解》的例子。

   我使用的平台是struts+spring+hibernate,但与ajax打交道的也就是struts。我无法将整个代码贴出来,因此把重要的前台ajax代码贴出来,至于后台的代码就看你自己所使用的技术了。

1、jsp页面

				
JavaZoo.com © 2006. Code Language:html4strict.
  1. <% @ page language = " java " contentType = " text/html; charset=GB2312 " import = " java.util.*,com.wehave.oa.cecontract.model.TbJyhtflb " %>
  2. < html >
  3. < head >
  4. < title > Insert title here </ title>
  5. < link rel = " stylesheet "href = " ../css/tree.css ">
  6. <script type="text/javascript"src="../js/tree_htfl.js"> </script>
  7. <script languge="javascript">
  8. function ShowDetail(ID,NAME,FLAG){
  9. window.parent.right.location ="getContract.go?method=doGetContract&folderID=" +ID + "&&folderName="+NAME+"&&flag="+FLAG;
  10. }
  11. </script>
  12. </head>
  13. <body bgcolor="#F6F9FF">
  14. <table cellpadding="0"cellspacing="0"width="300">
  15. <div id="load"style="display:none"> <img src="../images/tree_loading.gif">Loading data..</div>
  16. <ul class="tree">
  17. <% List treeList = (List)request.getAttribute("treefolder");
  18. Iterator it=treeList.iterator();
  19. while(it.hasNext()){
  20. out.println(it.next().toString());
  21. }
  22. %>
  23. </table>
  24. </tbody>
  25. </body>
  26. </html>
  27.  
Parsed in 0.270 seconds, using GeSHi 1.0.7.12

2、tree_htfl.js 代码

				
JavaZoo.com © 2006. Code Language:javascript.
  1. function showHide( id )
  2. {
  3. var el= document.getElementById( id );
  4. var bExpand = true;
  5. var images = el.getElementsByTagName("IMG");
  6. if (images[0].src.indexOf("tree_minus.gif")!=-1)
  7. {
  8. bExpand = false;
  9. images[0].src="../images/tree_plus.gif";
  10. } else {
  11. images[0].src="../images/tree_minus.gif";
  12. }
  13. var subs=el.lastChild;
  14. if (bExpand)
  15. subs.style.display="block";
  16. else
  17. subs.style.display="none";
  18. }
  19.  
  20.  
  21. function getSubTree( id ,submitURL)
  22. {
  23. var submitURL=submitURL
  24. postXmlHttp( submitURL, 'parseSubTree("'+id+'")' ,'load("'+id+'")');
  25. }
  26. function parseSubTree(id)
  27. {
  28. var el= document.getElementById( id );
  29. var ulElmt= document.createElement("UL");
  30. ulElmt.innerHTML=_xmlHttpRequestObj.responseText;
  31. el.appendChild(ulElmt);
  32. var images = el.getElementsByTagName("IMG");
  33. images[0].setAttribute("src", "../images/tree_minus.gif");
  34. images[0].setAttribute("onclick", newFunction("showHide('"+id+"')"));
  35. var aTag = el.getElementsByTagName("A");
  36. aTag[0].setAttribute("onclick", newFunction("showHide('"+id+"')"));
  37. var loadDiv= document.getElementById("load");
  38. loadDiv.style.display="none";
  39. }
  40.  
  41.  
  42. function load(id)
  43. {
  44. var loadDiv= document.getElementById("load");
  45. loadDiv.style.display="block";
  46. }
  47.  
  48.  
  49. var _postXmlHttpProcessPostChangeCallBack;
  50. var _xmlHttpRequestObj;
  51. var _loadingFunction;
  52.  
  53.  
  54. function postXmlHttp( submitUrl, callbackFunc ,loadFunc)
  55. {
  56. _postXmlHttpProcessPostChangeCallBack = callbackFunc;
  57. _loadingFunction = loadFunc;
  58. if (window.createRequest)
  59. {
  60. try {
  61. _xmlHttpRequestObj=window.createRequest();
  62. _xmlHttpRequestObj.open('POST',submitUrl,true);
  63. _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
  64. _xmlHttpRequestObj.send();
  65. }
  66. catch (ee){}
  67. }
  68. else if (window.XMLHttpRequest)
  69. {
  70. _xmlHttpRequestObj=new XMLHttpRequest();
  71. _xmlHttpRequestObj.overrideMimeType('text/xml');
  72. _xmlHttpRequestObj.open('POST',submitUrl,true);
  73. _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
  74. _xmlHttpRequestObj.send("");
  75. }
  76. else if (window.ActiveXObject)
  77. {
  78. _xmlHttpRequestObj=new ActiveXObject("Microsoft.XMLHTTP");
  79. _xmlHttpRequestObj.open('POST',submitUrl,true);
  80. _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
  81. _xmlHttpRequestObj.send();
  82. }
  83. };
  84.  
  85.  
  86. function postXmlHttpProcessPostChange()
  87. {
  88. if ( _xmlHttpRequestObj.readyState==4)
  89. {
  90. if (_xmlHttpRequestObj.status==200){
  91. setTimeout( _postXmlHttpProcessPostChangeCallBack, 2);
  92. } else {
  93. alert (_xmlHttpRequestObj.status);
  94. }
  95. }
  96. if ( _xmlHttpRequestObj.readyState==1)
  97. {
  98. setTimeout( _loadingFunction, 2);
  99. }
  100. }
  101.  
Parsed in 0.192 seconds, using GeSHi 1.0.7.12

3、action代码

				
JavaZoo.com © 2006. Code Language:java.
  1. /**
  2. * 展开第一层目录
  3. */
  4. public ActionForward doGetFolderList(
  5. ActionMapping mapping,
  6. ActionForm form,
  7. HttpServletRequest req,
  8. HttpServletResponse res){
  9. List list = treeCatalogService.getChildren("0");
  10. List TreeFolder=newArrayList();
  11. Iterator it=list.iterator();
  12. while (it.hasNext()){
  13. TbJyhtflb htfl=(TbJyhtflb)it.next();
  14. String s=treeCatalogService.renderTreeViewAjax(htfl);
  15. TreeFolder.add(s);
  16. }
  17. req.setAttribute("treefolder",TreeFolder);
  18. return mapping.findForward("foldertree");
  19. }
  20. /** */ /**
  21. * 展开下级目录
  22. */
  23. public ActionForward doGetSubFolderList(
  24. ActionMapping mapping,
  25. ActionForm form,
  26. HttpServletRequest req,
  27. HttpServletResponse res){
  28. String parentID = req.getParameter("parentID"); //获得id的值
  29. if (parentID!=null&&!parentID.equals("")){//如果不为null和空
  30. res.setContentType("text/html;charset=GB2312");
  31. List list = treeCatalogService.getChildren(parentID);
  32. Iterator it=list.iterator();
  33. try {
  34. PrintWriter out= res.getWriter();
  35. while (it.hasNext()){
  36. TbJyhtflb htfl=(TbJyhtflb)it.next();
  37. out.println(treeCatalogService.renderTreeViewAjax(htfl));
  38. }
  39. out.close();
  40. } catch ( Exception e){
  41. e.printStackTrace();
  42. }
  43. }
  44. return null;
  45. }
  46.  
Parsed in 0.462 seconds, using GeSHi 1.0.7.12

4、service层代码

				
JavaZoo.com © 2006. Code Language:java.
  1. /**
  2. * 函数说明:展开目录
  3. * 参数说明: 目录对象
  4. * 返回值:展开目录的HTML代码
  5. */
  6. public String renderTreeViewAjax(TbJyhtflb htfl){
  7. String ID=htfl.getTbJyhtflbZlId();
  8. String NAME=htfl.getTbJyhtflbMc();
  9. String FLAG=htfl.getTbJyhtflbLb();
  10. content.append("<li id='"+ID+"'>");
  11. if (treeCatalogDAO.canExpand(ID))
  12. content.append("<img src=../images/tree_plus.gif onClick=\"getSubTree('"+ID+"')\">");
  13. else
  14. content.append("<img src=../images/tree_blank.gif>");
  15. content.append("<img src=../images/tree_folder.gif><a href=\"javascript:ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')\"");
  16. if (treeCatalogDAO.canExpand(ID)){
  17. String submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
  18. content.append(" onClick=\"getSubTree('"+ID+"',submitURL)\"");
  19. }
  20. content.append(">"+NAME+"</a>");
  21. content.append("</li>");
  22. return content.toString();
  23. }
  24.  
Parsed in 0.326 seconds, using GeSHi 1.0.7.12

5、tree.css代码:

				
JavaZoo.com © 2006. Code Language:css.
  1. p{
  2. font-family:arial;
  3. }
  4. a{
  5. color:#000;
  6. font-family:arial;
  7. font-size:0.8em;
  8. }
  9. .tree{
  10. margin:0px;
  11. padding:0px;
  12. }
  13. .tree ul{/**//*子结点*/
  14. margin-left:20px; /**//* Left spacing */
  15. padding-left:0px;
  16. }
  17. .tree li{/**//* 结点 */
  18. list-style-type:none;
  19. vertical-align:middle;
  20. }
  21. .tree li a{/**//* 结点连接 */
  22. color:#000;
  23. text-decoration:none;
  24. font-family:arial;
  25. font-size:0.8em;
  26. padding-left:2px;
  27. }
  28.  
Parsed in 0.043 seconds, using GeSHi 1.0.7.12
posted on 2006-10-03 21:08 马尔代夫 阅读(109) 评论(0)  编辑  收藏 所属分类: AJAX