3请求参数作为XML发送

请求参数作为XML发送
如果只是一个包含名/值对的简单查询串,这可能不足以向服务器传递大量复杂的模型变化。更好的解决方案是将模型的变化作为XML发送到服务器。那么如何向服务器发送XML呢?可以把XML作为请求体的一部分发送到服务器,这与POST请求中用send()方法将查询串作为请求体的一部分发送异曲同工。服务器可以从请求体读到XML,并加以处理。
下面的postingXML.jsp将请求参数作为xml进行发送
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>Sending an XML Request</title>
<script type="text/javascript>
var xmlHttp;
function createXMLHttpRequest(){
//这里省略创建XMLHttpRequest对象的步骤
}


function createXML(){
var xml="<pets>";
var options=document.getElementById("petTypes").childNodes;
var option=null;
for(var i=0;i<options.length;i++){
option=options[i];
if(option.selected){
xml=xml+"<type>"+option.value+"<\/type>";
}
}
xml=xml+"<\/pets>";
return xml;
}


function sendPetTypes(){
createXMLHttpRequest();
var xml=createXML();
var url="PostingXMLExample.do?timeStamp="+new Date().getTime();


xmlHttp.open("POST",url,true);
xmlHttp.onreadystatechange=handleStateChange;
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
//将请求参数作为XML发送
xmlHttp.send(xml);
}
function handleStateChange(){
if(xmlHttp.readyState==4){
if(xmlHttp.status==200){
parseResults();
}
}
}


function parseResults(){
var responseDiv=document.getElementById("serverResponse");
if(responseDiv.hasChildNodes()){
responseDiv.removeChild(responseDiv.childNodes[0]);
}


var responseText=document.createTextNode(xmlHttp.responseText);
responseDiv.appendChild(responseText);
}
</script>
</head>
<body>
<h1>Select the types of pets in your home:</h1>
<form>
<select id="petTypes" size="6" multiple="true">
<option value="cats">Cats</option>
<option value="dogs">Dogs</option>
<option value="fish">Fish</option>
<option value="birds">Birds</option>
<option value="Hamsters">Hamsters</option>
<option value="rabbits">Rabbits</option>
</select>
<br/><br/>
<input type="button" value="Submit Pets" onClick="sendPetTypes();"/>
</form>
<h2>Server Response:</h2>
<div id="serverResponse"></div>
</body>
</html>


函数createXML使用document.getElementById方法获得select元素的引用,然后循环处理option子元素,对于选中的每个option元素逐个追加到xml中。一旦达到xml串,sentPetTypes函数通过XMLHttpRequest对象把xml串指定为send()方法的参数,从而将xml发送到服务器。
createXML方法中,为什么结束标记中斜线前面有一个反斜线?使用反斜线可以避免把串解析为标记,即使没有反斜线,大多数浏览器也能安全处理,但是严格的应该使用反斜线。


在PostingXMLExample.do对应的Action:PostingXMLAction.java对传递而来的xml格式的参数进行处理。
所用到的java.io.*和ort.w3c.dom.*包都在servlet-api.jar中
package mypack;


import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import javax.xml.parsers.*;
import java.io.*;
import org.w3c.dom.*;


public class PostingXMLAction extends Action{
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{


String xml=readXMLFromRequestBody(request);
String type=null;
String responseText="Selected Pets:";
 try{
//使用Dom解析器来解析xml串
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=factory.newDocumentBuilder();
    Document document=builder.parse(new ByteArrayInputStream(xml.getBytes()));
    Element root=document.getDocumentElement();
//返回一个NodeList对象,它包含xml串中所有节点名称为type的节点。
    NodeList elementNodes=root.getElementsByTagName("type");
    int size=elementNodes.getLength();
    for(int k=0;k<size;k++){
        Node node=elementNodes.item(k);
        if(node.getNodeType()==Node.ELEMENT_NODE){//判断节点的类型
//得到xml串中节点名称为type的节点的内容。
            type=((Element)node).getTextContent();
            responseText=responseText+" "+type;
    }
    }
}catch(Exception e){System.out.println(e.toString());}


   PrintWriter out=response.getWriter();
   out.println(responseText);
   out.close();
   return null;
}


private String readXMLFromRequestBody(HttpServletRequest request){
StringBuffer xml=new StringBuffer();
String line=null;
try{
//request.getReader()方法会一个BufferedReader对象。
BufferedReader reader=request.getReader();
while((line=reader.readLine())!=null){
xml.append(line);
}
}catch(Exception e){
System.out.println("Error reading XML:"+e.toString());
}
return xml.toString();
}
}
辅助方法 readXMLFromRequestBody从请求体中抽取XML,然后返回抽取出来的xml串。然后将这个xml串使用Dom解析器来解析,解析出其中的每个节点的内容。最后服务端输出这些内容,客户端的XMLHttpRequest对象的responseText接收到这些内容并显示出来。

































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值