如果请求参数较多,而且请求参数的结构关系复杂,则可以考虑发送XML请求。XML请求的实质还是POST请求,只是在发送请求的客户端页面将请求参数封装成XML字符串的形式,服务器端则负责解析该XML字符串。当然,服务器获取到XML字符串后,可借助于dom4j或JDOM等工具来解析。
程序清单:Ajax02request/xml/second.jsp
1 <%@ page contentType="text/html; charset=UTF-8" language="java" %> 2 <%@ page import="java.io.*,java.util.*,org.dom4j.io.XPPReader,org.dom4j.*"%> 3 <% 4 // 定义一个StringBuffer对象,用于接收请求参数 5 StringBuffer xmlBuffer = new StringBuffer(); 6 String line = null; 7 // 通过request对象获取输入流 8 BufferedReader reader = request.getReader(); 9 // 依次读取请求输入流的数据 10 while((line = reader.readLine()) != null ) 11 { 12 xmlBuffer.append(line); 13 } 14 // 将从输入流中读取到的内容转换为字符串 15 String xml = xmlBuffer.toString(); 16 // 以Dom4J开始解析XML字串串 17 Document xmlDoc = new XPPReader().read(new ByteArrayInputStream(xml.getBytes())); 18 // 获得countrys节点的所有子节点 19 List countryList = xmlDoc.getRootElement().elements(); 20 // 定义服务器响应的结果 21 String result = ""; 22 // 遍历countrys节点的所有子节点 23 for(Iterator it = countryList.iterator(); it.hasNext();) 24 { 25 Element country = (Element)it.next(); 26 // 如果发送的该节点的值为1,表明选中了中国 27 if (country.getText().equals("1")) 28 { 29 result += "上海$广州$北京"; 30 } 31 // 如果发送的该节点的值为1,表明选中了美国 32 else if(country.getText().equals("2")) 33 { 34 result += "$华盛顿$纽约$加洲"; 35 } 36 // 如果发送的该节点的值为1,表明选中了日本 37 else if(country.getText().equals("3")) 38 { 39 result += "$东京$大板$福冈"; 40 } 41 } 42 // 向客户端发送响应 43 out.println(result); 44 %>
程序清单:Ajax02request/xml/first.html下面是处理XML请求的JSP页面代码。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" content="silvan" /> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title> 发送XML请求 </title> 7 <style type="text/css"> 8 select { 9 width: 120px; 10 font-size:11pt; 11 } 12 </style> 13 </head> 14 <body> 15 <!-- 支持多选的列表框 --> 16 <select name="first" id="first" size="5" multiple="multiple"> 17 <option value="1" selected="selected">中国</option> 18 <option value="2">美国</option> 19 <option value="3">日本</option> 20 </select> 21 <!-- 用于发送Ajax请求的按钮 --> 22 <input type="button" value="发送" onClick="send();" /> 23 <!-- 被级联改变的列表框 --> 24 <select name="second" id="second" size="5" ></select> 25 <script type="text/javascript"> 26 String.prototype.trim = function() 27 { 28 return this.replace(/^\s+/ , "") 29 .replace(/\s+$/ , ""); 30 } 31 // 保存XMLHttpRequest对象的变量 32 var xmlrequest; 33 function createXMLHttpRequest() 34 { 35 if(window.XMLHttpRequest) 36 { 37 // DOM 2浏览器 38 xmlrequest = new XMLHttpRequest(); 39 } 40 // IE浏览器 41 else if (window.ActiveXObject) 42 { 43 try 44 { 45 xmlrequest = new ActiveXObject("Msxml2.XMLHTTP"); 46 } 47 catch (e) 48 { 49 try 50 { 51 xmlrequest = new ActiveXObject("Microsoft.XMLHTTP"); 52 } 53 catch (e){} 54 } 55 } 56 } 57 // 定义创建XML文档的函数 58 function createXML() 59 { 60 // 开始创建XML文档,countrys是根元素 61 var xml = "<countrys>" ; 62 // 获取first元素的,并获取起所有的子节点(选项) 63 var options = document.getElementById("first").childNodes; 64 var option = null ; 65 // 遍历国家下拉列表的所有选项 66 for (var i = 0 ; i < options.length; i ++) 67 { 68 option = options[i]; 69 // 如果某个选项被选中 70 if (option.selected) 71 { 72 // 在countrys的根节点下增加一个country的子节点 73 xml = xml + "<country>" + option.value + "<\/country>"; 74 } 75 } 76 // 结束XML文档的根节点 77 xml = xml + "<\/countrys>" ; 78 // 返回XML文档 79 return xml; 80 } 81 // 定义发送XML请求的函数 82 function send() 83 { 84 // 初始化XMLHttpRequest对象 85 createXMLHttpRequest(); 86 // 定义请求发送的URL 87 var uri = "second.jsp"; 88 // 打开与服务器连接 89 xmlrequest.open("POST", uri, true); 90 // 设置请求头 91 xmlrequest.setRequestHeader("Content-Type" 92 , "application/x-www-form-urlencoded"); 93 // 指定当XMLHttpRequest对象状态发生改变时触发processResponse函数 94 xmlrequest.onreadystatechange = processResponse; 95 // 发送XML请求 96 xmlrequest.send(createXML()); 97 } 98 // 处理服务器响应 99 function processResponse() 100 { 101 if(xmlrequest.readyState == 4) 102 { 103 if(xmlrequest.status == 200) 104 { 105 // 获取服务器响应字符串,并以$作为分隔符分割成多个字符串 106 var cityList = xmlrequest.responseText.split("$"); 107 var displaySelect = document.getElementById("second"); 108 // 清空second下拉列表的选项 109 displaySelect.innerHTML = null; 110 for (var i = 0 ; i < cityList.length ; i++) 111 { 112 if(cityList[i].trim().length > 0) 113 { 114 // 依次创建多个option元素 115 option = document.createElement("option"); 116 option.innerHTML = cityList[i]; 117 // 将创建的option元素添加到下拉列表最后 118 displaySelect.appendChild(option); 119 } 120 } 121 } 122 } 123 } 124 // 指定页面加载完成后指定send函数 125 document.body.onload = send; 126 </script> 127 </body> 128 </html>
时间: 2024-10-15 06:10:11