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