当前位置:文档之家› Ajax - 使用JSON向服务器发送数据

Ajax - 使用JSON向服务器发送数据

Ajax - 使用JSON向服务器发送数据使用JSON向服务器发送数据做了这么多,你已经能更顺手地使用JavaScript了,也许在考虑把更多的模型信息放在浏览器上。

不过,看过前面的例子后(使用XML向服务器发送复杂的数据结构),你可能会改变主意。

通过串连接来创建XML串并不好,这也不是用来生成或修改XML数据结构的健壮技术。

JSON概述XML的一个替代方法是JSON,可以在找到。

JSON是一种文本格式,它独立于具体语言,但是使用了与C系列语言(如C、C#、JavaScript等)类似的约定。

JSON 建立在以下两种数据结构基础上,当前几乎所有编程语言都支持这两种数据结构:l名/值对集合。

在当前编程语言中,这实现为一个对象、记录或字典。

l值的有序表,这通常实现为一个数组。

因为这些结构得到了如此众多编程语言的支持,所以JSON是一个理想的选择,可以作为异构系统之间的一种数据互换格式。

另外,由于JSON是基于标准JavaScript的子集,所以在所有当前Web浏览器上都应该是兼容的。

JSON对象是名/值对的无序集合。

对象以 { 开始,以 } 结束,名/值对用冒号分隔。

J SON数组是一个有序的值集合,以[ 开始,以 ] 结束,数组中的值用逗号分隔。

值可以是串(用双引号引起)、数值、true或false、对象,或者是数组,因此结构可以嵌套。

图3 -6以图形方式很好地描述了JSON对象的标记。

图3-6JSON对象结构的图形化表示(摘自)请考虑employee对象的简单例子。

employee对象可能包含名、姓、员工号和职位等数据。

使用JSON,可以如下表示employee对象实例:var employee = {"firstName" : John, "lastName" : Doe, "employeeNumber" : 123, "title" : "Accountant"}然后可以使用标准点记法使用对象的属性,如下所示:var lastName = stName; //Access the last namevar title = employee.title; //Access the titleemployee.employeeNumber = 456; //Change the employee numberJSON有一点很引以为豪,这就是它是一个轻量级的数据互换格式。

如果用XML来描述同样的employee对象,可能如下所示:<employee><firstName>John</firstName><lastName>Doe</lastName><employeeNumber>123</employeeNumber><title>Accountant</title></employee>显然,JSON编码比XML编码简短。

JSON编码比较小,所以如果在网络上发送大量数据,可能会带来显著的性能差异。

网站列出了至少与其他编程语言的14种绑定,这说明,不论在服务器端使用何种技术,都能通过JSON与浏览器通信。

使用JSON的示例(此例子需要json.js,/js.html最下面的链接点击下载,此例子使用的是比较老版本的json.js,如果你下载的是新的,使用的方法就不同了;JSONObject.java,JSONArray.java,/java/index.html下载,注意不是java JSON-lib虽然里面也有这两个类,可能是版本原因不同了如果你要用json-lib,那你就必须下载json-lib-2.0-jdk15.jar,还必需下面5个ja rjakarta commons-lang, jakarta commons-beanutils, jakarta commons-collecti onsjakarta commons-logging ,ezmorph缺少任何一个都是不行的,试过了--!!前面4个在下载,最后一个在/下载下面红色字体都是分歧部分,就看你是用什么了,经本人测试没问题。

)下面是一个简单的例子,展示了如何使用JSON将JavaScript对象转换为串格式,并使用Ajax技术将这个串发送到服务器,然后服务器根据这个串创建一个对象。

这个例子中没有业务逻辑,也几乎没有用户交互,它强调的是客户端和服务器端的JSON技术。

图3-7显示了一个“字符串化的”Car对象。

图3-7“字符串化的”Car对象因为这个例子几乎与前面的POST例子完全相同,所以我们只关注JSON特定的技术。

点击表单上的按钮将调用doJSON函数。

这个函数首先调用getCarObject函数来返回一个新的Car对象实例,然后使用JSON JavaScript库(可以从免费得到)将Car对象转换为JSON串,再在警告框中显示这个串。

接下来使用XMLHttpRequest对象将JSON编码的Car对象发送到服务器。

因为有可以免费得到的JSON-Java绑定库,所以编写Java servlet来为JSON请求提供服务相当简单。

更妙的是,由于对每种服务器端技术都有相应的JSON绑定,所以可以使用任何服务器端技术实现这个例子。

JSONExample servlet的doPost方法为JSON请求提供服务。

它首先调用readJSONStr- ingFromRequestBody方法从请求体获得JSON串,然后创建JSONObject的一个实例,向JSON Object构造函数提供JSON串。

JSONObject在对象创建时自动解析JSON串。

一旦创建了JSON Object,就可以使用各个get方法来获得你感兴趣的对象属性。

这里使用getString和getInt方法来获取year、make、model和color属性。

这些属性连接起来构成一个串返回给浏览器,并在页面上显示。

图3-8显示了读取JSON对象之后的服务器响应。

代码清单3-11显示了jsonExample.html,代码清单3-12显示了JSONExample.java。

代码清单3-11jsonExample.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="/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);老版本的json.js的用法 var carAsJSON = car.toJSONString();alert("Car object as JSON:\n " + carAsJSON);var url = "JSONExample?timeStamp=" + new Date().getTime();createXMLHttpRequest();xmlHttp.open("POST", url, true);xmlHttp.onreadystatechange = handleStateChange;xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");xmlHttp.send(carAsJSON);}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);}function getCarObject() {return new Car("Dodge", "Coronet R/T", 1968, "yellow");}function Car(make, model, year, color) {this.make = make;this.model = model;this.year = year;this.color = color;}</script></head><body><br/><br/><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>代码清单3-12JSONExample.javapackage ajaxbook.chap3;import java.io.*;import .*;import java.text.ParseException;import javax.servlet.*;import javax.servlet.http.*;import org.json.JSONObject;//import net.sf.json.*;public class JSONExample extends HttpServlet {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 JavaJSONObject jsonObject = null;try {//如果是用json-lib的话,前面引进的包改为//import net.sf.json.*; //这里改为//jsonObject = JSONObject.fromObject(json);//fromObject(object)是static的。

相关主题