对于请求参数为大师key-value对的情形,笔者更加倾向于使用简单的POST请求。但对于某些极端的表形,如请求参数特别多,而且请求参数的结构关系复杂,则可以考虑发送XML请求。XML请求的实质还是POST请求,只是在发送请求的客户产端页面将请求参数封装成XML字符串的形式,服务器则负责解析XML字符串。当然,服务器获取到XML字符串后,可借助dom4j或JDOM等工具来解析。
这个例子还是跟前面所讲的一样,通过左边的点击国家,然后点击“发送“,右边 就可以看到国家的城市。不过这一次,我偿们以送有是XML的文件形式。(源码)
1) 在first.html的页面中创建XML文档的函数,发送时以<countrys><country>XXX</country></countrys>的形式来以送。
// 定义创建XML文档的函数 function createXML() { // 开始创建XML文档,countrys是根元素 var xml = "<countrys>" ; // 获取first元素的,并获取起所有的子节点(选项) var options = document.getElementById("first").childNodes; var option = null ; // 遍历国家下拉列表的所有选项 for (var i = 0 ; i < options.length; i ++) { option = options[i]; // 如果某个选项被选中 if (option.selected) { // 在countrys的根节点下增加一个country的子节点 xml = xml + "<country>" + option.value + "<\/country>"; } } // 结束XML文档的根节点 xml = xml + "<\/countrys>" ; // 返回XML文档 return xml; }
2) 定义发送的函数
// 定义发送XML请求的函数 function send() { // 初始化XMLHttpRequest对象 createXMLHttpRequest(); // 定义请求发送的URL var uri = "second.jsp"; // 打开与服务器连接 xmlrequest.open("POST", uri, true); // 设置请求头 xmlrequest.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded"); // 指定当XMLHttpRequest对象状态发生改变时触发processResponse函数 xmlrequest.onreadystatechange = processResponse; // 发送XML请求 xmlrequest.send(createXML()); }
3) 定义回调函数
// 处理服务器响应 function processResponse() { if(xmlrequest.readyState == 4) { if(xmlrequest.status == 200) { // 获取服务器响应字符串,并以$作为分隔符分割成多个字符串 //alert(xmlrequest.responseText); var cityList = xmlrequest.responseText.split("$"); var displaySelect = document.getElementById("second"); // 清空second下拉列表的选项 displaySelect.innerHTML = null; for (var i = 0 ; i < cityList.length ; i++) { if(cityList[i].trim().length > 0) { // 依次创建多个option元素 option = document.createElement("option"); option.innerHTML = cityList[i]; // 将创建的option元素添加到下拉列表最后 displaySelect.appendChild(option); } } } } }
4) 在sencod.jsp的页面中,使用Dom4j来解析XML的格式。
// 定义一个StringBuffer对象,用于接收请求参数 StringBuffer xmlBuffer = new StringBuffer(); String line = null; // 通过request对象获取输入流 BufferedReader reader = request.getReader(); // 依次读取请求输入流的数据 while((line = reader.readLine()) != null ) { System.out.println("==="+line); xmlBuffer.append(line); } // 将从输入流中读取到的内容转换为字符串 String xml = xmlBuffer.toString(); // 以Dom4J开始解析XML字串串 Document xmlDoc = new XPPReader().read( new ByteArrayInputStream(xml.getBytes())); // 获得countrys节点的所有子节点 List countryList = xmlDoc.getRootElement().elements();
5) 运行结果