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;
          }
      }