1.首先要在前端把要发送的东西(这里是一个实例化的car对象)都准备好,利用Ajax发送到服务器端,代码如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JSON Example</title>
<script type="text/javascript" src="json.js"></script>
<script type="text/javascript">
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function doJSON() {
var car = getCarObject();//得到实例化的对象
//Use the JSON JavaScript library to stringify the Car object
var carAsJSON = JSON.stringify(car);
alert("Car object as JSON:\n " + carAsJSON);
//发送到服务器端的时候会去找lib/web,xml下的映射,通过映射来调用对应的servlet
var url = "hello";
createXMLHttpRequest();
xmlHttp.open("POST", url, true);
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded;");
xmlHttp.send(carAsJSON);
}
//回调函数
function handleStateChange() {
alert("xmlHttp.readyState"+xmlHttp.readyState);
if(xmlHttp.readyState == 4) {
alert("xmlHttp.status"+xmlHttp.status);
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);
}
//实例化car
function getCarObject() {
return new Car("Dodge", "Coronet R/T", 1968, "yellow");
}
//先要定义一个car类,才能实例化
function Car(make, model, year, color) {
this.make = make;
this.model = model;
this.year = year;
this.color = color;
}
</script>
</head>
<body> <form action="#">
<input type="button" value="Click here to send JSON data to the server" onclick="doJSON();"/>
</form>
<h2>Server Response:</h2>
<div id="serverResponse"></div>
</body>
</html>
2.以上的代码是把数据发送到服务器了,下面服务器要接收,处理发送过来的数据了,通过lib/web.xml来找到处理的对应的servlet,服务器端嘛,肯定要用servlet来处理的
web.xml的映射如下:即通过映射调用JSONExample这个servlet来处理
<servlet>
<servlet-name>JSONExample</servlet-name>
<servlet-class>JSONExample</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JSONExample</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.要使JSONExample能工作还需要导入如下包:
4. 请求到来后先调用doPost方法,用readJSONStringFromRequestBody获得发送过来的字符串,再把字符串变为json对象jsonObject = new JSONObject(json),
然后调用writeXMLFile("C:\\hello.xml")来建立xml文档并写到C盘上一个叫做hello.xml的xml的格式的文件(自动生成的,不用自己创建,如果C盘本来就有这个相同的文件名在,则会删掉里面原来的内容并更新新的内容)
import java.io.*;
import java.net.*;
import java.text.ParseException;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Vector;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.crimson.tree.XmlDocument;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.json.JSONException;
import org.json.JSONObject; public class JSONExample extends HttpServlet {
private static final long serialVersionUID = 1L;
JSONObject jsonObject = null; public JSONExample() {
super();
// TODO Auto-generated constructor stub
} public void writeXMLFile(String outFile) throws Exception
{
//为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException pce) {
System.err.println(pce);
System.exit(1);
} Document doc = null;
doc = db.newDocument();
//下面是建立XML文档内容的过程,建立根节点car
Element root = doc.createElement("car");
//把car这个根节点放到doc里面去
doc.appendChild(root);
//建立一个节点叫make,其中element1 表示这是root下面的第一个节
Element element1 = doc.createElement("make");
//把节点名为make的这个节点插入到root这个根节点后面
root.appendChild(element1 );
//获得make这个节点的具体内容
Text tName = doc.createTextNode(jsonObject.getString("make"));
//把make这个节点的具体内容插入到节点名为make的下面
element1 .appendChild(tName);
//创建第二个节点
Element element2= doc.createElement("model");
//把第二个节点插入到root后面和第一个节点是兄弟关系
root.appendChild(element2);
Text tAge = doc.createTextNode(jsonObject.getString("model"));
element2.appendChild(tAge);
//把第三个节点插入到root后面和第一个节点是兄弟关系
Element element3= doc.createElement("year");
root.appendChild(element3);
Text tPhone = doc.createTextNode(jsonObject.getString("year"));
element3.appendChild(tPhone);
//把第四个节点插入到root后面和第一个节点是兄弟关系
Element element4= doc.createElement("color");
root.appendChild(element4);
Text tColor = doc.createTextNode(jsonObject.getString("color"));
element4.appendChild(tColor);
System.out.println(2);
//把XML文档输出到指定的文件
FileOutputStream outStream = new FileOutputStream(outFile);
OutputStreamWriter outWriter = new OutputStreamWriter(outStream);
((XmlDocument) doc).write(outWriter, "GB2312");
outWriter.close();
outStream.close();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
private String readJSONStringFromRequestBody(HttpServletRequest request){
StringBuffer json = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while((line = reader.readLine()) != null) {
json.append(line);
}
}
catch(Exception e) {
System.out.println("Error reading JSON string: " + e.toString());
}
return json.toString();
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String json = readJSONStringFromRequestBody(request);
//Use the JSON-Java binding library to create a JSON object in Java try {
jsonObject = new JSONObject(json); } catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//----------------------------------
System.out.println(3);
try {
System.out.println(4);
writeXMLFile("C:\\hello.xml");
System.out.println(5);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }