AJAX, JSON and JSON-RPC
- JSON (JavaScript Object Notation) 是一種簡單的文字格式可用於交換資料又方便 javascript programmer 處理, 請參考 www.json.org. 處理 XML 實在是很痛苦, 換這個好多了!
- JSON 範例
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}} - 讀取 JSON 後轉成透過 eval 後及可轉成 object 方便使用, "json_data" 是 json 文字資料也就是上面的範例.
myObject = eval('(' + json_data + ')'); - AJAX 處理
- 就是在 server 處理 XMLHttpRequest 時送出 html 要在 <body> 內傳回 json-data 文字字串.
- 那麼如何產生 json data?
- Ruby: ruby-json
- Java: javarpc.jar 內有 org.jason.JSONObject... 可以用
- client 端時, 將收到的 responseText 利用 eval 就可以得回 object 直接使用. Happy!
- JSON-RPC, 大家都知道有 xml-rpc, 以 xml 做為 rpc 的交換資料, 若把 xml 換成 json 就是 json-rpc.
- JSON-RPC-Java 是一個蠻不錯的 json-rpc for Java 程式庫. 利用 json 及 XMLHttpRequest 的功能, 就能在用 client 端用 javascript 做 rpc 的事情.
- 把 jsonrpc.jar 放到你 war 的 lib 下(含 JSONRPCServlet)
- 更改你的 web.xml 加上一些 servlet, 記得要保護 "/JSON-RPC", 若你的 api 是開放的 api 那就不用了.
<!--JSON-RPC-->
<servlet-mapping>
<servlet-name>com.metaparadigm.jsonrpc.JSONRPCServlet</servlet-name>
<url-pattern>/JSON-RPC</url-pattern>
</servlet-mapping>
<!--JSON-RPC-->
<servlet>
<servlet-name>com.metaparadigm.jsonrpc.JSONRPCServlet</servlet-name>
<servlet-class>com.metaparadigm.jsonrpc.JSONRPCServlet</servlet-class>
</servlet> - jsonrpc.js 是你會用到的 javascript library
- jsp 上, 利用 "JSONRPCBridge" 和你的 server 端的 rpc 做相關連結
...
<script type="text/javascript" src="jsonrpc.js">
<jsp:useBean id="JSONRPCBridge" scope="session"
class="com.metaparadigm.jsonrpc.JSONRPCBridge"/>
<jsp:useBean id="hello" scope="session"
class="com.potix.acc.sat.report.Hello"/>
<% JSONRPCBridge.registerObject("hello", hello); %>
jsonrpc = new JSONRpcClient("/<your webapp name here>/JSON-RPC"); /
var result = jsonrpc.hello.sayHello("Mary");
alert(result); - server 端
//Hello.java
package com.metaparadigm.jsonrpc.test;
import java.io.Serializable;
public class Hello implements Serializable
{
private final static long serialVersionUID = 1;
public String sayHello(String who)
{
return "Hello " + who;
}
}