跟我学AJAX技术——实现对用户信息查询返回结果的数据表格在线编辑的Web应用示例
- 格式:doc
- 大小:417.00 KB
- 文档页数:20
1.1跟我学AJAX技术——实现对用户信息查询返回结果的数据表格在线编辑的Web应用示例1.1.1构建出相关的Web项目1、在某个页面中添加一个搜索信息的表单<form action="<c:url value='/userInfoManageAction.action'/>" method="post"><input type="hidden" name="action" value="doSearchUserInfo" /><select name="search_Method"><option value="1" selected="selected">按用户类型搜索</option><option value="2" >按用户ID搜索</option><option value="3">按用户名称搜索</option><option value="4">按销售业绩搜索</option></select><input type="text" name="searchKeyWord" /><input title="点击我可以进行提交" name="submitImage" type="image"src="<c:url value='/images/search_btn.gif'/>" /></form>2、编程实现搜索功能的后台Servlet程序public void doSearchUserInfo_ByUserType(HttpServletRequest request,HttpServletResponse response,String searchKeyWord)throws ServletException, IOException{StringtargetPage=this.getServletContext().getInitParameter("forwardShowErrorInfoTargetPage");int userType;if(searchKeyWord.equals("普通用户")){userType=1;}else if(searchKeyWord.equals("后台管理")){userType=2;}else{ //其它类型的用户userType=0;}List<UserInfoVO> someUserInfosVOList=null;UserInfoInterface oneUserInfoBean=new UserInfoManageImple();try {someUserInfosVOList=oneUserInfoBean.doSearchUserInfo_ByUserType(userType);} catch (WebCRMException e) {request.setAttribute("errorText",e.getMessage());forwardTargetPage(targetPage,request,response);return;}if(someUserInfosVOList.size()==0){request.setAttribute("errorText","没有搜索到满足条件的结果信息!");forwardTargetPage(targetPage,request,response);}else{request.setAttribute("someUserInfosVOList", someUserInfosVOList);StringforawrdShowSearchResultTargetPage="/userManage/showSearchResultInfo.jsp";forwardTargetPage(forawrdShowSearchResultTargetPage,request,response);}return;}3、添加一个显示搜索结果信息的JSP页面(1)页面创建的过程局部截图(2)页面最终的代码示例<%@ page isELIgnored="false" pageEncoding="GB18030"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><title>蓝梦集团CRM系统在线用户信息搜索结果页面</title><meta http-equiv="keywords" content="蓝梦集团,CRM,账户" /><meta http-equiv="description" content="这是蓝梦集团CRM系统" /><link href="${pageContext.request.contextPath}/css/pageContentStyle.css"rel="stylesheet" type="text/css" /><script language="javascript"src="${pageContext.request.contextPath}/javascript/commonJavaScript.js"type="text/javascript"></script><script language="javascript" type="text/javascript">var webContextName="${pageContext.request.contextPath}";</script><script language="javascript"src="${pageContext.request.contextPath}/javascript/onLineEditTableRow.js"type="text/javascript"></script></head><body><jsp:include page="/commonPage/pageHead.jsp" ></jsp:include><jsp:include page="/commonPage/navMenuBar.jsp" ></jsp:include><br/><div id="someOnePageContent" ><div id="showState"></div><table border="1" width="80%" style="border:#63F" ><thead><tr><th>用户名</th><th>别名</th><th>密码回答问题</th><th>密码答案</th><th>电子邮件</th><th>性别</th><th><a onclick="addNewRow(7);" id="add" href="#">添加一行</a></th></tr></thead><tbody id="dataTableTBodyID"><c:forEach var="oneUserInfosVO" items="${someUserInfosVOList}"> <tr><td><span>${erName} </span></td><td><span>${oneUserInfosVO.aliaoName} </span></td><td><span>${oneUserInfosVO.passWordAsk} </span></td><td><span>${oneUserInfosVO.passWordAnswer} </span></td><td><span>${erMail} </span></td><td><span><c:choose><c:when test="${erSex==1}"><c:out value="男" /></c:when><c:when test="${erSex==0}"><c:out value="女" /></c:when></c:choose> </span></td><td><a onclick="editThisRow(this,1,7);" id="edit" href="#" >编辑该行</a> <a onclick="deleteThisRow(this,1);" id="edit" href="#" >删除该行</a></td></tr></c:forEach></tbody></table></div><br/><br/><br/><jsp:include page="/commonPage/authorInfo.jsp" ></jsp:include></body></html>(3)页面预览的局部视图1.1.2实现在线编辑功能1、添加onLineEditTableRow.js文件(1)创建onLineEditTableRow.js文件过程的局部截图(2)onLineEditTableRow.js文件最终的代码示例var uniqueRow = 0;var xmlHttpRequest;/**************** 下面为增加新行的代码****************************/ function addNewRow(cellCount){var tbodyObj = document.getElementById("dataTableTBodyID");var newTR = document.createElement('tr');var newTDs = new Array(cellCount);for(var index=0; index< cellCount; index++){//新增的数据行包含有cellCount个单元格newTDs[index]=document.createElement('td');}var newInputs = new Array(cellCount);for(var index=0; index< cellCount; index++){//新增的数据行包含有cellCount个输入框newInputs[index]=document.createElement('input');newInputs[index].type="text";newInputs[index].name="colName"+index;newInputs[index].value=""; //新增的行中单元格的初始值//取消输入框的四周外框线newInputs[index].style = "border:none;";}//设置"保存"按钮的类型newInputs[cellCount-1].type= "button";//设置"保存"按钮的id名称newInputs[cellCount-1].id = "saveButtonName"+(++uniqueRow);newInputs[cellCount-1].value = "保存该行";newInputs[cellCount-1].onclick = function(){var inputButtonValue=new Array(cellCount-1);for(var index=0; index< cellCount-1; index++){inputButtonValue[index]=newInputs[index].value;} //获得用户在文本框中所输入的各个新的值saveNewRowDataToWebServer(inputButtonValue);};for (var index=0; index < newTDs.length; index++){//将动态创建的各个文本框添加到对应的单元格中newTDs[index].appendChild(newInputs[index]);//再将各个单元格添加到新增加的表格行中newTR.appendChild(newTDs[index]);}//将新增加的表格行插入到当前的表格中tbodyObj.insertBefore(newTR, null);}function saveNewRowDataToWebServer(inputButtonValue){var newRowData="";for(var index=0; index < inputButtonValue.length;index++){newRowData=newRowData+"dataName"+index+"="+inputButtonValue[index]+"&";}//只需要将newRowData作为查询参树字符串向服务器发送newRowData = newRowData+"dataCount="+inputButtonValue.lengthvar requestURL=webContextName+"/onLineEditServlet.action?action=saveOneNewRow&"+newRowData; xmlHttpRequest=createXMLHTTPRequestObject();xmlHttpRequest.onreadystatechange = processHttpResponseForSaveNewRow;// Get 请求方式的代码xmlHttpRequest.open("GET", requestURL, true);xmlHttpRequest.send(null);}function processHttpResponseForSaveNewRow(){if (xmlHttpRequest.readyState == 4){if (xmlHttpRequest.status == 200){if(xmlHttpRequest.responseText!=""){window.alert("在将该行数据保存到数据库表中时出现了“"+httpRequest.responseText+"”错误!");}else{window.alert("已经将该行数据保存到数据库表中!");}}else if(xmlHttpRequest.status == 404){alert("没有找到与所请求的文件相匹配的资源!");}else{alert("你所请求的页面发生异常,错误代码为:"+httpRequest.status);}}else{document.getElementById(showState).innerHTML = "检测中,请稍等...";}}/********************下面为编辑某行的代码******************************/ function editThisRow(inputButtonObj,dataID,cellCount){//dataID 代表要编辑的数据行的主键ID值var inputButtonTempObj = inputButtonObj;while (!inputButtonTempObj.tagName || inputButtonTempObj.tagName.toLowerCase() != "tr"){inputButtonTempObj = inputButtonTempObj.parentNode;}//从当前的<a>标签往上搜索定位找到<tr>标签(页就是定位到当前编辑的表格行)var inps = inputButtonTempObj.getElementsByTagName("span");var myVals = [];for (var i=0,len=inps.length; i < len; i++){myVals[myVals.length] = inps[i].firstChild.nodeValue;}editThisRowData(document.getElementById('add'), inputButtonTempObj.nextSibling, myVals,dataID,cellCount);inputButtonTempObj.parentNode.removeChild(inputButtonTempObj);}function editThisRowData(inputButtonObj, sibBefore, vals,dataID,cellCount){var tbodyObj = document.getElementById("dataTableTBodyID");var newTR = document.createElement('tr'); //新增的数据行包含有三个单元格var newTDs = new Array(cellCount);var newInputs = new Array(cellCount);for(var index=0; index< cellCount; index++){newTDs[index]=document.createElement('td');newInputs[index]=document.createElement('input');newInputs[index].type="text";newInputs[index].name="colName"+index;newInputs[index].value=vals[index]; //获得原来表格单元格中的原来数据newInputs[index].style = "border:none;"; //取消输入框的四周外框线}newInputs[cellCount-1].type= "button"; //设置"保存"按钮的类型//设置"保存"按钮的id名称newInputs[cellCount-1].id = "saveButtonName"+(++uniqueRow);newInputs[cellCount-1].value = "保存该行";newInputs[cellCount-1].onclick = function(){var inputButtonValue=new Array(cellCount-1);for(var index=0; index< cellCount-1; index++){inputButtonValue[index]=newInputs[index].value;}saveThisEditedRowDataToServer(inputButtonValue,dataID);};for (var index=0; index < newTDs.length; index++){newTDs[index].appendChild(newInputs[index]);newTR.appendChild(newTDs[index]);}tbodyObj.insertBefore(newTR, sibBefore);}function saveThisEditedRowDataToServer(inputButtonValue,dataID){var newRowData="dataID="+dataID+"&";for(var index=0; index < inputButtonValue.length;index++){newRowData=newRowData+"dataName"+index+"="+inputButtonValue[index]+"&"; }//只需要将newRowData作为查询参树字符串向服务器发送newRowData = newRowData+"dataCount="+inputButtonValue.lengthvar requestURL=webContextName+"/onLineEditServlet.action?action=saveOneEditRow&"+newRowData;xmlHttpRequest=createXMLHTTPRequestObject();xmlHttpRequest.onreadystatechange = processHttpResponseForSaveOneEditRow; xmlHttpRequest.open("GET", requestURL, true); // Get 请求方式的代码xmlHttpRequest.send(null);}function processHttpResponseForSaveOneEditRow(){if (xmlHttpRequest.readyState == 4){if (xmlHttpRequest.status == 200){if(xmlHttpRequest.responseText!=""){window.alert("在将该行数据保存到数据库表中时出现了“"+httpRequest.responseText+"”错误!");}else{window.alert("已经将该行数据保存到数据库表中!");}}else if(xmlHttpRequest.status == 404){alert("没有找到与所请求的文件相匹配的资源!");}else{alert("你所请求的页面发生异常,错误代码为:"+httpRequest.status);}}else{document.getElementById(showState).innerHTML ="正在向服务器发送请求,请稍等...";}}/**********************下面为删除某行的代码**************************/ function deleteThisRow(inputButtonObj,dataID){//dataID 代表要删除的数据行的主键ID值var isDeleteSomeOneRow=window.confirm("您是否真的要将此数据行删除吗?");if(!isDeleteSomeOneRow){return; //如果选择了”否“则不进行删除}var inputButtonTempObj = inputButtonObj;while (!inputButtonTempObj.tagName || inputButtonTempObj.tagName.toLowerCase() != "tr"){inputButtonTempObj = inputButtonTempObj.parentNode;}//从当前的<a>标签往上搜索定位找到<tr>标签(页就是定位到当前删除的表格行)inputButtonTempObj.parentNode.removeChild(inputButtonTempObj);var requestURL=webContextName+"/onLineEditServlet.action?action=deleteOneRow&dataID="+dataID; xmlHttpRequest=createXMLHTTPRequestObject();xmlHttpRequest.onreadystatechange = processHttpResponseForDeleteOneRow; xmlHttpRequest.open("GET", requestURL, true); // Get 请求方式的代码xmlHttpRequest.send(null);}function processHttpResponseForDeleteOneRow(){if (xmlHttpRequest.readyState == 4){if (xmlHttpRequest.status == 200){if(xmlHttpRequest.responseText!=""){window.alert("在将该行数据保存到数据库表中时出现了“"+httpRequest.responseText+"”错误!");}else{window.alert("已经将该行数据保存到数据库表中!");}}else if(xmlHttpRequest.status == 404){window.alert("没有找到与所请求的文件相匹配的资源!");}else{window.alert("你所请求的页面发生异常,错误代码为:"+httpRequest.status);}}else{document.getElementById(showState).innerHTML ="正在向服务器发送请求,请稍等...";}}function createXMLHTTPRequestObject(){var httpRequestObject;if (window.XMLHttpRequest) { // Mozilla, Safari, ...httpRequestObject = new XMLHttpRequest();}else if (window.ActiveXObject) { // IEtry{httpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");}catch (e){try{httpRequestObject= new ActiveXObject("Msxml2.XMLHTTP");}catch (e2) {window.alert("您所使用的浏览器不支持AJAX技术!");}}}return httpRequestObject;}3、添加对表格数据编辑的结果进行响应的Servlet组件(1)程序类名称为OnLineEditServlet,程序包名称为com.px1987.webcrm.servlet(2)URL-Pattern为/onLineEditServlet.action(3)编程该Servlet程序的功能实现代码package com.px1987.webcrm.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class OnLineEditServlet extends HttpServlet {public OnLineEditServlet() {super();}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String action=request.getParameter("action");if(action.equals("saveOneNewRow")){doSaveOneNewRow(request,response);}else if(action.equals("saveOneEditRow")){doSaveOneEditRoww(request,response);}else if(action.equals("deleteOneRow")){doDeleteOneRow(request,response);}}public void doSaveOneNewRow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{String dataCount=request.getParameter("dataCount");String oneDataItemName=null;String oneDataItemValue=null;for(int index=0; index <Integer.parseInt(dataCount); index++){oneDataItemName="dataName"+index;oneDataItemValue=request.getParameter(oneDataItemName);oneDataItemValue=new String(oneDataItemValue.getBytes("ISO-8859-1"),"gb2312");System.out.println("数据行中的数据项目"+index+"的值为"+oneDataItemValue);}response.setContentType("text/html");PrintWriter out = response.getWriter();out.print(""); //向浏览器发送没有出现错误的状态out.flush();out.close();}public void doSaveOneEditRoww(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{String dataCount=request.getParameter("dataCount");String oneDataItemName=null;String oneDataItemValue=null;for(int index=0; index <Integer.parseInt(dataCount); index++){oneDataItemName="dataName"+index;oneDataItemValue=request.getParameter(oneDataItemName);oneDataItemValue=new String(oneDataItemValue.getBytes("ISO-8859-1"),"gb2312");System.out.println("数据行中的数据项目"+index+"的值为"+oneDataItemValue);}response.setContentType("text/html");PrintWriter out = response.getWriter();out.print(""); //向浏览器发送没有出现错误的状态out.flush();out.close();}public void doDeleteOneRow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{String dataID=request.getParameter("dataID");System.out.println("dataID="+dataID+"的数据行已经被删除掉了!");response.setContentType("text/html");PrintWriter out = response.getWriter();out.print(""); //向浏览器发送没有出现错误的状态out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}public void init() throws ServletException {}}1.1.3测试本项目的最终应用效果1、部署本项目的系统程序2、启动服务器3、输入http://127.0.0.1:8080/webcrm/index.jsp后(1)在搜索表单中输入搜索的条件,并点击提交(2)将出现下面的结果4、点击“添加一行”按钮后,将出现下面的状态,并输入该行的各个数据项目5、点击“保存该行”按钮后,将出现下面的状态6、同时在控制台中将出现下面的提示7、点击“编辑该行”按钮后,将出现下面的状态,并输入该行的各个数据项目8、点击“保存该行”按钮后,将出现下面的状态9、同时在控制台中将出现下面的提示10、点击“删除该行”按钮后,将出现下面的状态11、点击其中的“确定”按钮后12、同时在控制台中将出现下面的提示。