﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Kaixinhutu-随笔分类-【AJAX】 </title><link>http://www.blogjava.net/Kaixinhutu/category/10275.html</link><description>糊涂</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:31:06 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:31:06 GMT</pubDate><ttl>60</ttl><item><title>AJAX+J2EE开发组织机构管理系统（摘自天极网）</title><link>http://www.blogjava.net/Kaixinhutu/archive/2006/04/20/42079.html</link><dc:creator>糊涂</dc:creator><author>糊涂</author><pubDate>Thu, 20 Apr 2006 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/Kaixinhutu/archive/2006/04/20/42079.html</guid><wfw:comment>http://www.blogjava.net/Kaixinhutu/comments/42079.html</wfw:comment><comments>http://www.blogjava.net/Kaixinhutu/archive/2006/04/20/42079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Kaixinhutu/comments/commentRss/42079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Kaixinhutu/services/trackbacks/42079.html</trackback:ping><description><![CDATA[
		<p>
				<strong>一、 概述<br /><br /></strong>AJAX是今年初才问世的新技术，是Asynchronous JavaScript and XML的缩写。它是一组开发Web应用程序的技术，它使浏览器可以为用户提供更为自然的浏览体验。每当需要更新时，客户端Web页面的修改是异步的和逐步增加的。这样，AJAX在提交Web页面内容时大大提高了用户界面的速度。在基于AJAX的应用程序中没有必要长时间等待整个页面的刷新。页面中需要更新的那部分才进行更改，如果可能的话，更新是在本地完成的，并且是异步的。<br /><br />J2ee是一种用来开发分布式系统的体系结构。它主要是用Java类开发业务实体。通过JSP来连接应用服务器。<br /><br />本文开发一个组织机构管理小系统，通过这个实例来介绍如何用Ajax开发WEB应用程序。本系统具有增加、修改、删除组织机构的功能。同时给机构分配人员，能增加、修改、删除人员。<br /><br /><b>二、 界面设计</b><br /><br />树结构是大多软件系统中常采用的结构形式。由于树型结构层次分明、上下级关系清楚、且展开收缩表达信息方便、界面也较美观，所以是大家热衷于用此结构。组织机构管理是一般软件基本具有的。组织机构是指公司的组织结构。集团公司可包括分公子公司，公司下面又有科室。员工归属于所在的公司。系统运行后的界面如下：<br /><br /></p>
		<p align="center">
				<img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://java.ccidnet.com/col/attachment/2006/4/663251.jpg" />
		</p>orgManager.htm是组织机构管理的主页面。WEB应用程序界面设计是非常重要的。如何布局、么样组织可直接体现一个人的设计水平。<br /><br />组织机构主要包括树结构、组织机构编辑、人员编辑等三大块，如何分成三块呢，然而一般树型结构的窗体常先二块，树型结构独占一块，另一块又分成上下二部分，上面是机构编码，下面是人员编码。固可以把页面划分成如下图形式：<br /><br /><table cellspacing="0" cellpadding="0" width="51%" align="center" border="1"><tbody><tr><td width="25%" rowspan="2"><div align="center">树结构区1 </div></td><td width="75%"><div align="center">组织编码区2</div></td></tr><tr><td width="75%"><div align="center">人员管理区3 </div></td></tr></tbody></table><br /><br />显然我们是通过表来实现。这是一个二行二列的表，且第一、二行的左边列合并单元格。代码如下：<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜ TABLE border="1" width="100%" height="100%"＞<br /><br />＜TR＞<br /><br />＜TD rowspan="2"＞＜FONT face="宋体"＞＜/FONT＞＜/TD＞<br /><br />＜TD＞＜/TD＞<br /><br />＜/TR＞<br /><br />＜TR＞<br /><br />＜TD＞＜/TD＞<br /><br />＜/TR＞<br /><br />＜/TABLE＞</td></tr></tbody></table><br /><br />我们在1区（单元格）上加上一个DIV，因为DIV可以动态地滚动，并且可以插入其它控件。DIV的id为"divTree"，且风格设置为溢出时自动滚动，宽与高都为100%，及满区域。代码如下：<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜div id="divTree" style="width:100%; height:100%;background-color:#f5f5f5;border :1px solid Silver;overflow:auto;"＞<br /><br />＜/div＞</td></tr></tbody></table><br /><br />我们在2区（单元格）上也加上一个DIV，在DIV里再插入一个表格。表格上放下控件，这很简单，就不详细说了。<br /><br />我们在3区（单元格）上加上一个DIV。此DIV的id为" divContent "，且风格设置为竖直溢出时自动滚动，宽与高都为100%，及满区域，此DIV用来装载人员信息;在DIV里再插入一个表格, 此table的id为" tbList "，是用来输入、显示人员作息，同时在此表中插入一些如checkbox 、text、select等控件。说明，表的第二列是用来放人员唯一编号的，不显示。代码如下：<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜div id="divContent" style="height:100%; overflow-y:auto;" width="100%"＞<br /><br />＜table id="tbList" border="1" width="100%"＞<br /><br />＜tr seqNo="1"＞＜td＞<br /><br />＜table border="1" width="100%"＞<br /><br />＜tr＞<br /><br />＜td width="5%"＞＜input type="checkbox" value="on"＞＜/input＞ ＜/td＞<br /><br />＜td width="0%" style="display:none"＞ ＜input type="text" size="20"＞＜/input＞＜/td＞<br /><br />＜td width="40%"＞＜input type="text" size="20"＞＜/input＞＜/td＞<br /><br />＜td width="25%"＞<br /><br />＜select size="1" name="D1"＞<br /><br />＜option value="0"＞男＜/option＞<br /><br />＜option selected="true" value="1"＞女＜/option＞<br /><br />＜/select＞<br /><br />＜/td＞<br /><br />＜/tr＞<br /><br />＜/table＞ <br /><br />＜/td＞＜/tr＞<br /><br />＜/table＞<br /><br />＜/div＞ </td></tr></tbody></table><p><strong>三、 前端页面的主要编码<br /><br /></strong>1. 树的实现<br /><br />在WEB上实现树结构，同样我们是通过Ajax来实现的。树上可以显示自定义的图标，可以插入、删除、结点。并且结点可任意移动。这里我们不重点讲树的实现技术，我们已经封装好了，你只要按要求去改动就是了。 <br /><br />1) 键接树型文件<br /><br />在＜head＞与＜/head＞之间键接我们的与树有关的文件, 代码如下：<br /><br /></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜link rel="STYLESHEET" type="text/css" href="css/dhtmlXTree.css"＞<br /><br />＜script src="js/dhtmlXCommon.js"＞＜/script＞<br /><br />＜script src="js/dhtmlXTree.js"＞＜/script＞ </td></tr></tbody></table><br /><br />2) 装载方法<br /><br />在页面的文档打开时装载自定义方法, preLoadImages方法实现树控件的图标定义，doOnLoad实现树控件的图标定义代码如下：<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜body onload="preLoadImages();doOnLoad();"＞</td></tr></tbody></table><br /><br />3) 编写方法<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>//doOnLoad实现装载并显示树。设置树属性等。<br /><br />function doOnLoad(){<br /><br />　OrgTree=new dhtmlXTreeObject(document.getElementById('divTree'),"100%","100%",0); <br /><br />　//dhtmlXTreeObject是树对象，通过新建对象，指定树显示的DIV可定义树。<br /><br />　OrgTree.setImagePath("imgs/");//设置树的图片所在位置<br /><br />　OrgTree.setDragHandler();//设置树结点拖动<br /><br />　OrgTree.enableDragAndDrop(true) //设置树结点是否可拖动<br /><br />　OrgTree.setDragHandler(myDragHandler); //设置树结点拖动时所执行的方法<br /><br />　OrgTree.setOnClickHandler(mySelectHandler); //设置树单击时所执行的方法<br /><br />　//OrgTree.setXMLAutoLoading("Org.jsp");//装载树结点数据。数据来源如Org.jsp所返回的XML格式的字符串，数据是动态装载，且当展开时才装载。<br /><br />　OrgTree.loadXML("root.xml?0");//装载树结点数据。数据来源root.xml文件，并且从xml文件的ID号为0处读取数据。<br /><br />　//OrgTree.loadXML("Org.jsp");//装载树结点数据。数据来源如Org.jsp所返回的XML格式的字符串,并且是一次性全部装载数据。 <br /><br />}<br /><br />//preLoadImages方法实现树控件的图标定义<br /><br />function preLoadImages(){<br /><br />　var imSrcAr = new Array("line1.gif","line2.gif","line3.gif","line4.gif","minus2.gif","minus3.gif",<br /><br />"minus4.gif","plus2.gif","plus3.gif","plus4.gif","book.gif","books_open.gif","books_close.gif",<br /><br />"magazine_open.gif","magazine_close.gif","tombs.gif","tombs_mag.gif","book_titel.gif")<br /><br />　var imAr = new Array(0);<br /><br />　for(var i=0;i＜imSrcAr.length;i++){<br /><br />imAr[imAr.length] = new Image();<br /><br />imAr[imAr.length-1].src = "imgs/"+imSrcAr[i]<br /><br />　}<br /><br />}</td></tr></tbody></table><p><br /> 组织管理的实现<br /><br />组织可以增加、删除、编辑。同时当选择树结点时应该把组织显示出来供编辑，查看。为了实现这些功能，你只要按要求去改动就是了。<br /><br />1) 全局变量的定义<br /><br />许多地方我们要用到一些公共变量，我们在＜script＞与＜/script＞之间定义全局变量, 代码如下：<br /><br /></p><p></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>var OrgTree = null; //组织树Dom<br /><br />var nextSeq = 0;//人员管理的顺序号（流水号）<br /><br />var personDom;//人员Dom<br /><br />var CurrNodeId;//当前结点Id </td></tr></tbody></table><p><br /><br />2) 初始化<br /><br />当页面打开时我们要控件好那部分该显示，那部分要隐藏。且对全局变量的赋值等,组织类型装载。在页面的文档打开时装载自定义方法init（）, init方法实现初始化。<br /><br /></p><p></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜body onload="init();"＞</td></tr></tbody></table><p><br /><br />init方法实现如下：<br /><br /></p><p></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>function init(){ <br /><br />　//定义personDom为一个XMLDOM'对象<br /><br />　personDom= new ActiveXObject('Microsoft.XMLDOM');<br /><br />　personDom.async = false; <br /><br />　//定义stylesheet为一个XMLDOM'对象，且stylesheet为personDom确定显示风格 <br /><br />　stylesheet = new ActiveXObject('Microsoft.XMLDOM');<br /><br />　stylesheet.async = false;<br /><br />　stylesheet.load("addOrgPerson.xsl"); //装载stylesheet的风格定义文件<br /><br />　//装载组织类型数据<br /><br />　var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />　xmlhttp.open("POST","Org.jsp?mode=GetOrgType", false);<br /><br />　xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />　xmlhttp.send(); <br /><br />　retXml=xmlhttp.responseText;<br /><br />　// alert(retXml); <br /><br />　//把组织类型插入下拉列表控件中 <br /><br />　var OrgDoc = new ActiveXObject('Microsoft.XMLDOM');<br /><br />　OrgDoc.async = false;<br /><br />　OrgDoc.loadXML(retXml);<br /><br />　var root = OrgDoc.documentElement;<br /><br />　oNodeList = root.childNodes;<br /><br />　txtType.options.length =oNodeList.length;<br /><br />　for (var i=0; i＜oNodeList.length; i++) <br /><br />　{ <br /><br />Item = oNodeList.item(i); <br /><br />var OrgTypeId=Item.childNodes(0).text;<br /><br />var OrgTypeName=Item.childNodes(1).text;<br /><br />txtType.options[i].value=OrgTypeId;<br /><br />txtType.options[i].text=OrgTypeName;<br /><br />// txtType.options[0]. <br /><br />　}<br /><br />}</td></tr></tbody></table><p><br /><br />3) 编写树拖动及选择结点的方法<br /><br /></p><p></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>// myDragHandler实现树结点拖动时重新指定父子关系。<br /><br />function myDragHandler(idFrom,idTo){<br /><br />　var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />　xmlhttp.open("POST","Org.jsp?mode=moveOrg&amp;orgId=" + idFrom + "&amp;newparentOrgId=" + idTo, false);<br /><br />　xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />　xmlhttp.send();<br /><br />　retXml=xmlhttp.OrgponseText;<br /><br />　return true;<br /><br />}<br /><br />// mySelectHandler实现选择树结点对系统的控制，同时显示组织信息及该组织下的人员。<br /><br />function mySelectHandler(id){ <br /><br />　tbOrg.style.display="block";<br /><br />　divOrgMemo.style.display="none";<br /><br />　divOrgInfo.style.display="none"; <br /><br />　if(id==1)<br /><br />　{<br /><br />divOrgMemo.style.display="block";<br /><br />div1.style.display="none";<br /><br />div2.style.display="none";<br /><br />div3.style.display="none";<br /><br />divContent.style.display="none";<br /><br />div5.style.display="none";<br /><br />　} <br /><br />　else<br /><br />　{<br /><br />divOrgInfo.style.display="block"; <br /><br />div1.style.display="block";<br /><br />div2.style.display="block";<br /><br />div3.style.display="block";<br /><br />divContent.style.display="block";<br /><br />div5.style.display="block";<br /><br />　} <br /><br />　CurrNodeId=id;<br /><br />　//装载组织信息并显示在编码和名称的文本控件上。 <br /><br />　loadOrg(id);<br /><br />　//装载某组织下人员信息 <br /><br />　var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />　xmlhttp.open("POST","Org.jsp?mode=GetPerson&amp;orgId=" + id, false);<br /><br />　xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />　xmlhttp.send();<br /><br />　retXml=xmlhttp.responseText; <br /><br />　personDom.loadXML (retXml);<br /><br />　//给人员信息的每行加上序号 <br /><br />　for(var i=0; i＜personDom.documentElement.childNodes.length; i++){<br /><br />personDom.documentElement.childNodes[i].setAttribute("seqNo", nextSeq);<br /><br />nextSeq++;<br /><br />　} <br /><br />　//人员信息显示在divContent上面<br /><br />　divContent.innerHTML = personDom.transformNode(stylesheet); <br /><br />};<br /><br />//装载组织信息并显示在编码和名称的文本控件上。<br /><br />function loadOrg(OrgId){ <br /><br />　if(OrgId == null){<br /><br />OrgId = OrgTree.getSelectedItemId();<br /><br />　}<br /><br />　if(OrgId == ""){<br /><br />tbOrg.style.display = "none";<br /><br />return;<br /><br />　}<br /><br />　var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />　xmlhttp.open("POST","Org.jsp?mode=loadOrg&amp;OrgId=" + OrgId, false);<br /><br />　xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />　xmlhttp.send();<br /><br />　retXml=xmlhttp.responseText;<br /><br />　var OrgDoc = new ActiveXObject('Microsoft.XMLDOM');<br /><br />　OrgDoc.async = false;<br /><br />　OrgDoc.loadXML(retXml);<br /><br />　if(OrgId != 1){<br /><br />txtCode.value = OrgDoc.selectSingleNode("//OrgCode").text;<br /><br />txtName.value = OrgDoc.selectSingleNode("//OrgName").text;<br /><br />　}<br /><br />　tbOrg.style.display = "block"; <br /><br />}</td></tr></tbody></table><p><br /><br />4) 建立组织<br /><br />组织建立主要是通过调用XMLHTTP对象来实现。我们主要学会如何调用XMLHTTP。组织建立应该在后台实现，把组织信息插入数据库中。这里我们通过JSP来实现。我们的Org.jsp 文件中有个createOrg方法，该方法传递一个父ID。<br /><br /></p><p></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>function createOrg(parentOrgId){<br /><br />　var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />　xmlhttp.open("POST","Org.jsp?mode=createOrg&amp;parentOrgId=" + parentOrgId, false);<br /><br />　xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />　xmlhttp.send();<br /><br />　retXml=xmlhttp.responseText;<br /><br />　var orgId = (new Number(retXml)).toString();<br /><br />　return orgId;<br /><br />}</td></tr></tbody></table><p><br /></p><p><span class="top11">5) 删除组织<br /><br />组织删除同样是调用Org.jsp 文件中的deleteOrg方法来实现，该方法传递所删除的结点ID。<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>function deleteOrg(){<br /><br />　var OrgId = OrgTree.getSelectedItemId();<br /><br />　var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />　xmlhttp.open("POST","Org.jsp?mode=deleteOrg&amp;OrgId=" + OrgId, false);<br /><br />　xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />　xmlhttp.send(); <br /><br />}</td></tr></tbody></table><br /><br />6) 编辑组织<br /><br />组织修改是调用Org.jsp 文件中的modifyOrg方法来实现，该方法传递所修改的结点ID。同时修改的数据通过自定义的XML格式的字符串传送,这时通过send字符串来实现。修改前数据一律要验证其合法性，并提示错误信息。<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>function modifyOrg(){<br /><br />　if(OrgTree.getSelectedItemId() == ""){<br /><br />return "N";<br /><br />　}<br /><br />　if(txtCode.value == ""){<br /><br />alert("请输入编码！");<br /><br />return "N";<br /><br />　}<br /><br />　if(txtName.value == ""){<br /><br />alert("请输入名称！");<br /><br />return"N";<br /><br />　} <br /><br />　var OrgId = OrgTree.getSelectedItemId();<br /><br />　var OrgKind; <br /><br />　//alert(txtType.options[txtType.selectedIndex].value)<br /><br />　var strModify = "＜?xml version='1.0' encoding='gb2312'?＞" +<br /><br />　"＜data＞" + <br /><br />　"＜OrgCode＞＜![CDATA[" + txtCode.value + "]]＞＜/OrgCode＞" +<br /><br />　"＜OrgName＞＜![CDATA[" + txtName.value + "]]＞＜/OrgName＞" +<br /><br />　"＜OrgKind＞＜![CDATA[" + txtType.options[txtType.selectedIndex].value+ "]]＞＜/OrgKind＞" +<br /><br />　"＜/data＞";<br /><br />　var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />　xmlhttp.open("POST","Org.jsp?mode=modifyOrg&amp;OrgId=" + OrgId, false);<br /><br />　xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />　xmlhttp.send(strModify);<br /><br />　OrgTree.setItemText(OrgTree.getSelectedItemId(),txtName.value);<br /><br />}</td></tr></tbody></table>3. 人员管理的实现<br /><br />人员可以增加、删除、编辑。同时当选择树结点时应该把人员显示出来供编辑、查看......<br /><br />1) 增加人员<br /><br />人员增加实现的原理是在personDom中加入结点peorsone，该结点相当于表的一行，设置属性。同时在peorsone中不继地加入其它结点，代表数据库的字段，且必须与XLT文件的标号同名。这些结点相当该行的列。最后在表中插入一行，行上插入一列，并显示之。<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>function addPerson(){ <br /><br />　var seqNo = nextSeq;<br /><br />　nextSeq++; <br /><br />　var peorsonNode = personDom.createNode("1", "peorsone","");<br /><br />　peorsonNode.setAttribute("isNew", "Y");<br /><br />　peorsonNode.setAttribute("isDelete", "N");<br /><br />　peorsonNode.setAttribute("seqNo", seqNo);<br /><br />　personDom.documentElement.appendChild(peorsonNode);<br /><br />　var PersonId= personDom.createNode("1", "personId", "");<br /><br />　peorsonNode.appendChild(PersonId);<br /><br />　var personCode= personDom.createNode("1", "personCode", "");<br /><br />　peorsonNode.appendChild(personCode);<br /><br />　var PersonName= personDom.createNode("1", "personName", "");<br /><br />　peorsonNode.appendChild(PersonName);<br /><br />　var Sex= personDom.createNode("1", "sex", "");<br /><br />　peorsonNode.appendChild(Sex); <br /><br />　var tr = tbList.insertRow(tbList.rows.length);<br /><br />　tr.setAttribute("seqNo", seqNo);<br /><br />　var td = tr.insertCell(0);<br /><br />　td.innerHTML = peorsonNode.transformNode(stylesheet); <br /><br />}</td></tr></tbody></table><br /><br />2) 删除人员<br /><br />人员删除同样是调用Org.jsp 文件中的deletePerson方法来实现，该方法传递所删除的人员ID。如何确定人员ID是通过读取隐藏的ID，并扫描整个表，看那些被选中。这里我们要注意是提供多项选择的。<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>function deletePerson(){ <br /><br />　for(var i=0; i＜tbList.rows.length; i++){<br /><br />var row=tbList.rows[i].cells[0].children[0].rows[0];<br /><br />if(row.cells[0].children[0].checked)<br /><br />{<br /><br />　var personId=row.cells[1].children[0].value; <br /><br />　if(personId＞0)<br /><br />　{ <br /><br />var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />xmlhttp.open("POST","Org.jsp?mode=deletePerson&amp;personId=" + personId, false);<br /><br />xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />xmlhttp.send(); <br /><br />　}<br /><br />　tbList.deleteRow(i);<br /><br />　i--;<br /><br />}<br /><br />　} <br /><br />}</td></tr></tbody></table><br /><br />3) 编辑人员<br /><br />人员修改我们要判定哪些行被修改了。刚增加但没保存的行应该是新增而不是修改的。<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>function save(){ <br /><br />　if( modifyOrg()=="N")<br /><br />　{<br /><br />return;<br /><br />　}<br /><br />　for(var i=0; i＜tbList.rows.length; i++)<br /><br />　{ <br /><br />var row=tbList.rows[i].cells[0].children[0].rows[0];<br /><br />var personId=row.cells[1].children[0].value;<br /><br />var seqNo = tbList.rows[i].getAttribute("seqNo");<br /><br />var staffNode = personDom.selectSingleNode("//peorsone[@seqNo='" + seqNo + "']");<br /><br />var personCode=row.cells[2].children[0].value; <br /><br />var personName=row.cells[3].children[0].value; <br /><br />var sex=row.cells[4].children[0].value; //alert(staffN;ode ); <br /><br />if(staffNode.getAttribute("isNew") == "Y")<br /><br />{ <br /><br />　createPerson(CurrNodeId,personCode,personName,sex); <br /><br />}<br /><br />else<br /><br />{ <br /><br />　var strXML = "＜?xml version='1.0' encoding='gb2312'?＞" +<br /><br />"＜data＞" + <br /><br />"＜personCode＞＜![CDATA[" + personCode+ "]]＞＜/personCode＞" +<br /><br />"＜personName＞＜![CDATA[" + personName + "]]＞＜/personName＞" +<br /><br />"＜sex＞＜![CDATA[" + sex+ "]]＞＜/sex＞" +<br /><br />"＜personId＞＜![CDATA[" + personId+ "]]＞＜/personId＞" +<br /><br />"＜/data＞"; <br /><br />　//alert(strXML ); <br /><br />　var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />　xmlhttp.open("POST","Org.jsp?mode=modifyPerson", false);<br /><br />　xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br /><br />　xmlhttp.send(strXML );<br /><br />}<br /><br />　} <br /><br />}</td></tr></tbody></table></span></p><p><br /></p><p><span class="top11"><strong>四、 XML与XSL文件设计<br /><br /></strong>XML是种可扩展的标记语言，它具有开放的、可扩展的、可自描述的语言结构，它已经成为网上数据和文档传输的标准。XSLT的目的是将信息内容与 Web 显示分离，HTML 通过按抽象概念（如段落、重点和编号列表）定义显示来实现设备独立性。XSLT用来具体显示控件，设置控件风格。<br /><br />Ajax主要使用XML和XSLT进行数据交换与处理。<br /><br />1. 树信息的XML文件(见root.xml文件) <br /><br />XML是标记语言，元素必须成对出现。树结构中以tree为根结点，以item为结点体，属性text指出结点所显示的文本，id指出唯一的所标识号。<br /><br /></span></p><p></p><p></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜?xml version='1.0' encoding='gb2312'?＞<br /><br />＜tree id="0"＞<br /><br />＜item child="1" text="组织" id="1" ＞<br /><br />＜/item＞ <br /><br />＜/tree＞</td></tr></tbody></table><br /><br />这文件并不是必要的，只是为了系统能独立运行才加的。事实如果连接了后台数据是不需要的。只要吧OrgTree.loadXML("root.xml?0")改为OrgTree.loadXML("Org.jsp")就可以了。<br /><br />2. 人员信息XML文件(见peorson.xml文件)<br /><br />说明![CDATA[]]可在任何显示任何格式的文本，文本中可插入其它任何字符。这文件也不是必要的。<br /><br />3. 人员信息展现的xsl文件（见addOrgPerson.xsl文件）<br /><br />xsl文件同样是XML格式文件。所以一律遵守XML标准。下面对主要的行讲解：<br /><br /><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜?xml version="1.0" encoding="gb2312"?＞<br /><br />//这是定义xml文件的首行。用来指明版本及字符集<br /><br />＜xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" language="JavaScript"＞<br /><br />//这里定义了stylesheet 元素。并指出其国际命名的组织及语言。 <br /><br />＜xsl:template match="/"＞<br /><br />＜xsl:apply-templates select="peorsones"/＞<br /><br />＜/xsl:template＞<br /><br />//上面是匹配的规则。"/"表示从根结开始去匹配。匹配到下面的peorsones标记。这是正则表达式有关的学问。我们只要理解就可以。<br /><br />＜xsl:template match="peorsones"＞<br /><br />//当匹配上peorsones时所要做的事情。<br /><br />＜table id="tbList" border="1" width="100%"＞<br /><br />//定义一个id为"tbList的表格。此表格是显示在WEB上的<br /><br />＜xsl:for-each select="peorsone"＞<br /><br />//循环匹配peorsone<br /><br />＜tr＞<br /><br />//定义tbList表格的一行，并在行上增加一个叫seqNo的属性名，值为匹配到的seqNo（序号）<br /><br />＜xsl:attribute name="seqNo"＞＜xsl:value-of select="@seqNo"/＞＜/xsl:attribute＞<br /><br />＜td＞<br /><br />//定义行上的一列，列又去匹配<br /><br />＜xsl:apply-templates select="."/＞<br /><br />＜/td＞<br /><br />＜/tr＞<br /><br />＜/xsl:for-each＞ <br /><br />＜/table＞<br /><br />＜/xsl:template＞<br /><br />＜xsl:template match="peorsone"＞<br /><br />＜table border="1" width="100%"＞<br /><br />＜tr＞<br /><br />//定义宽为5%的一列，在该列上插入一个checkbox控件<br /><br />＜td width="5%"＞<br /><br />＜input type="checkbox" value="on" size="10"＞＜/input＞<br /><br />＜/td＞<br /><br />//定义一个不显示的列，在该列上插入一个text控件，text的值为匹配到的personId（人员Id）<br /><br />＜td style="display:none"＞<br /><br />＜input type="text" size="25"＞<br /><br />＜xsl:attribute name="value"＞＜xsl:value-of select="personId"/＞＜/xsl:attribute＞<br /><br />＜/input＞ <br /><br />＜/td＞<br /><br />＜td width="30%"＞ <br /><br />＜input type="text" size="20"＞ <br /><br />＜xsl:attribute name="value"＞＜xsl:value-of select="personCode"/＞＜/xsl:attribute＞ <br /><br />＜/input＞ <br /><br />＜/td＞ <br /><br />＜td width="40%"＞ <br /><br />＜input type="text" size="40"＞<br /><br />＜xsl:attributename="value"＞＜xsl:value-of select="personName"/＞＜/xsl:attribute＞ <br /><br />＜/input＞<br /><br />＜/td＞<br /><br />//定义一个width为28%的列，在该列上插入一个下拉列表select 控件，select的值如果匹配到为0时则为"男"，1时则为"女"<br /><br />＜td width="28%"＞<br /><br />＜select size="1"＞<br /><br />＜option value="0"＞<br /><br />＜xsl:if test=".[sex=0]"＞<br /><br />＜xsl:attribute name="selected"＞true＜/xsl:attribute＞<br /><br />＜/xsl:if＞<br /><br />男<br /><br />＜/option＞<br /><br />＜option value="1"＞<br /><br />＜xsl:if test=".[sex=1]"＞<br /><br />＜xsl:attribute name="selected"＞true＜/xsl:attribute＞<br /><br />＜/xsl:if＞ <br /><br />女＜/option＞<br /><br />＜/select＞<br /><br />＜/td＞<br /><br />//定义一列，在该列上插入一个button控件，onclick 事件为自定义的方法，该方法传递当前单击的按纽<br /><br />＜td width="*"＞ <br /><br />＜button onclick="openPersonRolePage(this)" style="width: 36; height: 21"＞角色＜/button＞<br /><br />＜/td＞<br /><br />＜/tr＞<br /><br />＜/table＞<br /><br />＜/xsl:template＞<br /><br />＜/xsl:stylesheet＞</td></tr></tbody></table><p><br /></p><p><span class="top11"><strong>五、 数据接口的实现</strong>（见Org.jpg文件）<br /><br />Org.JSP文件用来在服务器上运行Java的类与前台web页之间架起一座桥。取到中间件的接口作用。<br /><br />这里分析部分代码：<br /><br /></span></p><p></p><p></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>＜%@ page contentType="text/html; charset=GBK" %＞<br /><br />＜%@ page import="java.sql.*" %＞<br /><br />＜%@ page import="javax.naming.*" %＞<br /><br />＜%@ page import="javax.sql.*" %＞<br /><br />＜%@ page import="tool.*" %＞<br /><br />＜%@ page import="orgNew.*" %＞<br /><br />＜%@ page import="org.w3c.dom.*" %＞<br /><br />//上面主要是引用一些java类<br /><br />＜%<br /><br />try{<br /><br />　//request.setCharacterEncoding("GBK");<br /><br />　Document doc = XmlTool.createDocumentFromRequest(request);<br /><br />　//建立web面文档请求的文档对象<br /><br />　Connection conn = ConnTool.getConnectionFromPool();<br /><br />　//获取请求的方法名<br /><br />　String mode=request.getParameter("mode");<br /><br />　//out.println("ccc");<br /><br />　//如果方法中没有其它参数则读取组织树数据<br /><br />　if(mode == null){ <br /><br />/* int OrgId = Integer.parseInt(request.getParameter("id"));<br /><br />String str = orgManager.getChildOrg(OrgId, conn);<br /><br />out.println(str); <br /><br />*/<br /><br />　String str = orgManager.getTree(conn);<br /><br />　//out.println(str);<br /><br />　out.println(str); <br /><br />}else if(mode.equals("createOrg")){<br /><br />　//如果是createOrg方法则建立一个组织<br /><br />　int parentOrgId = Integer.parseInt(request.getParameter("parentOrgId"));<br /><br />　//取出传递来的第一个参数parentOrgId<br /><br />　int OrgId = orgManager.createOrg(parentOrgId, conn);<br /><br />　//调用orgManager 类的createOrg方法来建立一个组织<br /><br />　out.println(OrgId);<br /><br />　//返回结果<br /><br />} <br /><br />conn.close();<br /><br />} <br /><br />catch(Exception e){<br /><br />　e.printStackTrace();<br /><br />}<br /><br />%＞</td></tr></tbody></table><p><br /><br /><b>六、 后台数据的实现</b><br /><br />1. 数据结构的定义<br /><br />这里，我们主要有三个表。一个是组织结构表，一个是人员表person，一个组织人员关联表orgPerson。组织结构表有OrgCode（组织代码）、OrgName（组织名称）、orgId（组织Id）, parentOrgId（父Id）。人员表有personCode（人员代码）、personName（人员名称）, sex（性别）、personId（人员Id）。orgPerson表有orgId, personId。<br /><br />2. 数据库的连接<br /><br />WEB应用程序常用MySQL作后台数据库，这是因为MySQL简单、高效。这里我们也用MySQL作为数据库。Java中用jdbc连接数据库。下面是连接数据库的CODE：<br /><br /></p><p></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>public static Connection getConnectionFromPool() throws Exception {<br /><br />　Context ctx = new InitialContext();<br /><br />　DataSource ds = (DataSource) ctx.lookup("java:/erpds");<br /><br />　return ds.getConnection();<br /><br />}<br /><br />/**<br /><br />* 取数据库链接对象<br /><br />* @return Connection 数据库链接对象<br /><br />* @throws Exception<br /><br />*/<br /><br />/*<br /><br />public static Connection getDirectConnection() throws Exception {<br /><br />　Class.forName("com.sybase.jdbc2.jdbc.SybDriver");<br /><br />　String url = "jdbc:sybase:Tds:19.64.13.16:4100/wydb?charset=iso_1";<br /><br />　String user = "sa";<br /><br />　String password = "2860008";<br /><br />　Connection conn = DriverManager.getConnection(url, user, password);<br /><br />　return conn;<br /><br />}<br /><br />*/</td></tr></tbody></table><p><br /></p><p>. 业务逻辑层的实现<br /><br />后台开发我们用Java类来实现。这里我们开发了一个orgNew包，类名为orgManager。此类封装了与数据库操作有关的方法。通过main可调试程序的正确性。<br /><br />这里给出了新增加一个组织的全部代码和通过XML取得树结构信息的代码，树结构通过递归实现。<br /><br /></p><table bordercolor="#000000" width="480" align="center" bgcolor="#e6e6e6" border="1"><tbody><tr><td>package orgNew;// Java类所打的包<br /><br />import tool.*;<br /><br />import java.sql.*;<br /><br />import java.util.*; // 引用Java类的<br /><br />public class orgManager {<br /><br />　public orgManager() { }<br /><br />　public static void main(String[] args) throws Exception {<br /><br />Connection conn = tool.ConnTool.getDirectConnection();// 引用数据访问类<br /><br />conn.setAutoCommit(false);<br /><br />orgManager orgManager1 = new orgManager();<br /><br />orgManager1.createOrg(0, conn); //测试建立组织是否正确<br /><br />　}<br /><br />　//建立一个组织<br /><br />　public static int createOrg(int parentOrgId, Connection conn) throws<br /><br />　Exception {<br /><br />String sql = "insert into Org (OrgName, parentOrgId) values('新组织', ?)";<br /><br />PreparedStatement pstat = conn.prepareStatement(sql);<br /><br />pstat.setInt(1, parentOrgId);<br /><br />pstat.executeUpdate();<br /><br />pstat.close();<br /><br />Statement stat = conn.createStatement();<br /><br />String sql2 = "select max(OrgId) from Org";<br /><br />ResultSet rs = stat.executeQuery(sql2);<br /><br />rs.next();<br /><br />int OrgId = rs.getInt(1);<br /><br />rs.close();<br /><br />stat.close();<br /><br />System.out.println(OrgId);<br /><br />return OrgId;<br /><br />　}<br /><br />}<br /><br />//通过递归得到组织信息的XML格式的数据<br /><br />public static String getTree(Connection conn) throws<br /><br />Exception {<br /><br />　StringBuffer ret = new StringBuffer();//定义可缓冲的字符流<br /><br />　ret.append("＜?xml version='1.0' encoding='gb2312'?＞＜tree id='0'＞");//定义XML格式的头信息<br /><br />　ret.append(" ＜item child='1' text='组织' id='1' ＞");//插入结点体。注树结点以item为标记 <br /><br />　ret.append(getChildTree(1, conn));<br /><br />　ret.append("＜/item＞");//结点体结束标记<br /><br />　ret.append("＜/tree＞");//树结束标记<br /><br />　return ret.toString();//返回字符流<br /><br />}<br /><br />public static String getChildTree(int OrgId, Connection conn) throws<br /><br />Exception {<br /><br />　StringBuffer ret = new StringBuffer();<br /><br />　String sql = "select a.OrgId, a.OrgName, a.OrgCode,count(b.parentOrgId) from Org a " +<br /><br />"left join Org b on a.OrgId = b.parentOrgId " +<br /><br />"where a.parentOrgId = ? " +<br /><br />"group by a.OrgId, a.OrgName";<br /><br />　PreparedStatement pstat = conn.prepareStatement(sql);<br /><br />　pstat.setInt(1, OrgId);<br /><br />　ResultSet rs = pstat.executeQuery();<br /><br />　while (rs.next()) {<br /><br />int childOrgId = rs.getInt(1);<br /><br />String childOrgName = rs.getString(2);<br /><br />String childOrgCode = rs.getString(3);<br /><br />if (childOrgCode == null) {<br /><br />　childOrgCode = " ";<br /><br />}<br /><br />if (childOrgName == null) {<br /><br />　childOrgName = "新组织";<br /><br />}<br /><br />int childCount = rs.getInt(3);<br /><br />if (childCount ＞ 0) {<br /><br />　childCount = 1;<br /><br />}<br /><br />ret.append("＜item child='" + childCount + "' text='" + childOrgName +<br /><br />"' id='" +childOrgId + "' code='"+childOrgCode+"'＞");<br /><br />ret.append(getChildTree(childOrgId, conn));<br /><br />ret.append("＜/item＞");<br /><br />　}<br /><br />　rs.close();<br /><br />　pstat.close();<br /><br />　return ret.toString();<br /><br />}</td></tr></tbody></table><p>其它代码见orgManager.java文件。<br /><br /><b>七、 总结</b><br /><br />本文件通过一个实例全面介绍了Ajax开发的各个细节。通过与J2ee的结合来实现三层分布式开发的层次划分，后台与前端的调用。数据的读取、访问及展现。 <br /><br />通过这个实例，我们可见，Ajax使WEB中的界面与应用分离。数据与呈现分离的分离，有利于分工合作、减少非技术人员对页面的修改造成的WEB应用程序错误、提高效率、也更加适用于现在的发布系统。也可以把以前的一些服务器负担的工作转嫁到客户端，利于客户端闲置的处理能力来处理。<br /><br />Ajax是传统WEB应用程序的一个转变。以前是服务器每次生成HTML页面并返回给客户端（浏览器）。Ajax理念的出现，揭开了无刷新更新页面时代的序幕，并有代替传统web开发中采用form(表单)递交方式更新web页面的趋势，可以算是一个里程碑。<br /><br />总之，Ajax适用于交互较多，频繁读数据，数据分类良好的WEB应用。</p><img src ="http://www.blogjava.net/Kaixinhutu/aggbug/42079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Kaixinhutu/" target="_blank">糊涂</a> 2006-04-20 09:21 <a href="http://www.blogjava.net/Kaixinhutu/archive/2006/04/20/42079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>