2.2 发送请求 2.2.4 发送XML请求
对于请求参数为大量key-value
对的情形,使用简单的POST
请求比较合适。但对于某些极端的情形,如请求参数特别多,而且请求参数的结构关系复杂的情况,则可以考虑发送XML
请求。**XML
请求的实质还是POST
请求,只是在发送请求的客户端页面将请求参数封装成XML
字符串的形式**,服务器端则负责解析该XML
字符串。当然,服务器获取XML
字符串后,可借助于dom4j
或JDOM
等工具来解析。
发送的XML
请求实际上依然是POST
请求,只是请求参数不再以param=value
的形式被发送,而是直接采用XML
字符串作为参数。这意味着服务器端不能直接获取请求参数,而是必须以流的形式获取请求参数.
实例
下面对前述的级联菜单应用进行简单修改,修改后的级联菜单允许一次选取多个国家。如果一次选取了多个国家,则服务器返回多个国家对应的城市—请求参数采用XML
文档发送。
first.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| <!DOCTYPE html> <html> <head> <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>发送XML请求</title> <style type="text/css"> select { width: 120px; font-size: 11pt; } </style> </head> <body> <select name="first" id="first" size="5" multiple="multiple"> <option value="1" selected="selected">中国</option> <option value="2">美国</option> <option value="3">日本</option> </select> <input type="button" value="发送" onClick="send();" /> <select name="second" id="second" size="5"> </select> <script type="text/javascript"> String.prototype.trim = function() { return this.replace(/^\s+/, "").replace(/\s+$/, ""); } function createXML() { var xml = "<countrys>"; var options = document.getElementById("first").childNodes; var option = null; for (var i = 0; i < options.length; i++) { option = options[i]; if (option.selected) { xml = xml + "<country>" + option.value + "<\/country>"; } } xml = xml + "<\/countrys>"; return xml; } var xhr = new XMLHttpRequest(); function send() { var uri = "second.jsp"; xhr.open("POST", uri, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onload = processResponse; xhr.send(createXML()); } function processResponse() { if (xhr.status == 200) { var cityList = xhr.responseText.split("$"); var displaySelect = document .getElementById("second"); displaySelect.innerHTML = ""; for (var i = 0; i < cityList.length; i++) { if (cityList[i].trim().length > 0) { option = document.createElement("option"); option.innerHTML = cityList[i]; displaySelect.appendChild(option); } } } } </script> </body> </html>
|
second.jsp
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| <%@ page contentType="text/html; charset=utf-8" language="java"%> <%@ page import="java.io.*,org.dom4j.*,org.dom4j.io.XPPReader,java.util.*"%> <% StringBuffer xmlBuffer = new StringBuffer(); String line = null; BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) { xmlBuffer.append(line); } String xml = xmlBuffer.toString(); Document xmlDoc = new XPPReader() .read(new ByteArrayInputStream(xml.getBytes())); List countryList = xmlDoc.getRootElement().elements(); String result = ""; for (Iterator it = countryList.iterator(); it.hasNext();) { Element country = (Element) it.next(); if (country.getText().equals("1")) { result += "上海$广州$北京"; } else if (country.getText().equals("2")) { result += "$华盛顿$纽约$加洲"; } else if (country.getText().equals("3")) { result += "$东京$大板$福冈"; } } out.println(result); %>
|