好久沒有做過關于AJAX的東西了,平時做的也無非就是通過XHP要么用GET(請求部分是追加到URL中的并且瀏覽器對其長度有會有限制)方法要么通過POST(請求參數內容可以放到請求體中并且無量的限制)方法。傳遞的無非是些參數值(以名=值的方式出現as : name=jkallen)要么就是DOM對象了。再發到到服務端后做些處理再返回到客戶端顯示對應結果。
今天看到了一個好東東,就是通過JSON(JavaScript Object Notation)向服務器發送數據。它是一種輕量級的數據交換格式,使用了類似于C語言家族的習慣。
JSON具有以下這些形式:
a :??對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
b:?? 數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。
c:?? 值(value)可以是雙引號括起來的字符串(string)、數值(number)、 ture、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。
d:?? 字符串(string)是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符(character)即一個單獨的字符串(character string)。
不多說了,關于JSON其實在
www.json.org
上講得太好了!上面不但有每個JAVA的源文件,而且每個文件都有與之對應的JAVA DOC!還有不少實例!
我就選了json in java? and? json in javascript 二個鏈接?,從這二個地方可以下到JSON的javascript包和Java包。
Javascript 包的應用如下:
首先創建一個符合json的對象,并通過XHP發送到sever
<
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);
????
????
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
>
那個json.js就是我們下下來的包啦!
我們再看看在server端的處理
package
?ajaxbook.chap3;

import
?java.io.
*
;
import
?java.net.
*
;
import
?java.text.ParseException;
import
?javax.servlet.
*
;
import
?javax.servlet.http.
*
;
import
?org.json.JSONObject;


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?Java
????????JSONObject?jsonObject?
=
?
null
;

????????
try
?
{
????????????jsonObject?
=
?
new
?JSONObject(json);
????????}
????????
catch
(ParseException?pe)?
{
????????????System.out.println(
"
ParseException:?
"
?
+
?pe.toString());
????????}
????????
????????String?responseText?
=
?
"
You?have?a?
"
?
+
?jsonObject.getInt(
"
year
"
)?
+
?
"
?
"
????????????
+
?jsonObject.getString(
"
make
"
)?
+
?
"
?
"
?
+
?jsonObject.getString(
"
model
"
)
????????????
+
?
"
?
"
?
+
?
"
?that?is?
"
?
+
?jsonObject.getString(
"
color
"
)?
+
?
"
?in?color.
"
;
????????
????????response.setContentType(
"
text/xml
"
);
????????response.getWriter().print(responseText);
????}
????
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();
????}
}
那個不起眼的org.json.JSONObject就是我們從JSON.ORG上下下來的JAVA包!它上面也有JSONObject的JAVA DOC所以不用擔心不知道用啦!
OK到此全部搞定啦!
可以看到這樣比我們平時通過XHP傳遞一個DOM對象(通過連接串來創建XML串)要方便些!再說通過連接串來處理也不是生成XML數據結構的健壯技術!
參考資料:
foundations-of-ajax
????????????????????
www.json.org
相關鏈接:?
Ajax---與服務器通信(請求參數作為XML發送)