最近一直都是陰天,都說陽春三月,不想卻寒潮襲來。一年之計在于春,我不能睡懶覺!
前幾天朋友介紹了一個好東東給我,JSON-RPC-Java。我研究了兩天,覺得如獲至寶,不敢獨享,覺得很有必要寫些東西,以饗讀者。
JSON-RPC-Java 簡單說就是一個web 應用中間件,它允許DHTML直接訪問遠程的java應用,并無刷新的返回結果。表面上類似于Xml-RPC,或者遠程調用EJB。不過JSON-RPC-Java的實現要簡單得多,而且最重要的一點,它在客戶端是且僅是使用Javascript 。
做web程序的人一定不會陌生 XMLHttp。所以你也許已經猜到 JSON-RPC-Java 框架最底層的實現技術。沒錯,JSON-RPC-Java 正是使用 XMLHttp 與服務端交換數據并表現出頁面無刷新的效果。XMLHttp 我不多說,Apple的網站上有一個比較大概的介紹,參見這里,Mozilla的文檔就更詳盡了,參見這里(很意外,我竟然沒有在微軟的MSDN上找到一個比較系統的文檔)。
從我對現在的所謂新技術的理解,通常是有一個很磅礴的名號,然后便是各巨頭一番你捧我喝,實際上卻無非是新瓶裝老酒。現有的技術套上標準或者規(guī)范的外衣,再加上商業(yè)吵作,業(yè)界就血雨腥風一把。各巨頭為了自己的商業(yè)利益,訂立的繁雜的標準常常讓我等望而反胃。
明確了最底層的實現,再看JSON-RPC-Java 就有了一個本質的認識,這有助于我們一件件撥開它神秘的外衣。有時候對待技術就好像對待女人,我們通常在已經了解或者相信她有著誘人的身體的時候,才會樂于或者有耐心對待脫衣的前戲。
外套 JSON
JSON (JavaScript Object Notation) 很顯然是 JSON-RPC-Java 的基礎,它是基于javascript的一種簡單易讀的輕量級數據交換格式。它的主頁在這里。
如果不熟悉Javascript,那么理解JSON則有一些困難。在這里我要先引入“直接量(Literals)”這個javascript概念。很不幸,我很難找到一篇中文的文章介紹它,好不容易在Lycos的中文網站上發(fā)現一份,但是只能通過 google 的網頁快照來訪問了,參見 《JavaScript 的直接量》。
簡單說,如果我們要 javascript 創(chuàng)建一個對象,通常情況下可能會這樣寫:
function Person(name, sex) { this.name = name; this.sex = sex; } var p = new Person(‘zhaozexin‘, 1); alert(p.name); |
從Javascript 1.2開始,創(chuàng)建一個對象有了一種相當快捷的語法,如下:
var p = {"name": ‘zhaozexin‘, "sex" : 1}; |
這一句就是對象的“直接量”。這樣的語法很象java中的Map里toString()方法的輸出。name 就是 key, ‘zhaozexin‘ 就是 value。和Map一樣,value除了可以是字符串或者數字以外,還可以是數組,函數或者其他對象。 再說說數組,常見的數組聲明如下:
var a = new Array(); a[0] = ‘zhaozexin‘; a[1] = 1; 或者 var a = new Array(‘zhaozexin‘, 1); |
數組的直接量 如下:
var a = [‘zhaozexin‘, 1]; |
是否覺得也很象 ArrayList 的toString() 方法輸出呢。javascript 何以叫 Javascript,那不是沒有道理的。
除了代碼的簡化以外,直接量還有什么好處呢。我們就要關注 eval (codeString) 這個javascript內置函數了,它接受一個字符串參數,當作javascript的代碼去解析并執(zhí)行。所以eval 函數允許 javascript 源代碼的動態(tài)執(zhí)行。例如,下面的代碼創(chuàng)建了一個包含 Date 對象的新變量 mydate :eval("var mydate = new Date();")。那么如果我們把“直接量” 作為參數傳遞給 eval函數,那么就可以動態(tài)的創(chuàng)建各式各樣的對象了。
更詳細的直接量的介紹,可以閱讀 《Javascript 權威指南》,我強烈推薦這本書給所有從事web編程的同行。 現在 JSON 應該容易理解了,它的語法實際就是 javascript 的“直接量”。所以 JSON 的介紹上這樣寫: JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, TCL, and many others. These properties make JSON an ideal data-interchange language.
這諸多的語言實現 JSON 的工作就相當簡單了,就仿佛做一個字符串處理程序一樣。那么JSON-RPC-Java 我們就可以猜出了大概了:
由java實現一個JSON的服務端與web程序中的 javascript(實現JSON的客戶端)通過XMLHttp 交換數據,而數據的格式便是javascript“直接量” 的格式,java服務端分析請求,執(zhí)行然后依據同樣的格式返回結果。
很明顯,這就是 Xml-RPC 的 javascript 版本。javascript 語法的靈活省卻了解析xml的繁雜。javascript 讓我如何能不愛你!
外套已經脫完。下次我們深入剖析 JSON-RPC。
|