jabsorbでJSON-RPCインターフェイスを作る手順
JSON-RPCライブラリのjabsorbを利用して、Google App Engine上で任意のJavaクラスのメソッドをJSON-RPCで公開する手順です。jabsorbはServletで提供されていて、Google App Engine上でもさくっと動作しましたよ。
概要
1.必要なモジュールをダウンロードして、「WEB-INF/lib」に配置。
jabsorbのDownloadから、jabsorbをダウンロードして「WEB-INF/lib」にコピーします。必要なモジュールは以下の3つ。
- jabsorb-1.3.1.jar
- slf4j-api-1.4.2.jar
- slf4j-jdk14-1.4.2.jar
jabsorb-1.3.1.jarは「jabsorb-1.3.1-minimal.zip」に、他の2つは「jabsorb-1.3.1-src.zip」に含まれています。
2.公開するJavaクラスを書く。
JSON-RPCで公開するクラスを作成します。今回は、以下のクラス/インターフェイスを作成して確認しました。
package test.jabsorb; /** * テスト用サービス */ public interface TestService { String hello( String args ); }
package test.jabsorb; /** * テスト用サービスの実装 */ public class TestServiceImpl implements TestService { @Override public String hello(String str) { return "hello. " + str; } }
2.JSON-RPCインターフェイスを提供するServletを作成。
次に、JSON-RPCインターフェイスを提供するServletを作成します。
- Servletはjabsorb付属の「org.jabsorb.JSONRPCServlet」を継承して作成します。
- init()をオーバーライドして、2で作成したクラスのインスタンスを公開APIとして登録します。
package test.jabsorb; import javax.servlet.ServletException; import org.jabsorb.JSONRPCBridge; import org.jabsorb.JSONRPCServlet; /** * JSON-RPCを提供するサーブレット * org.jabsorb.JSONRPCServletを継承し、init()でサービスインスタンスを登録する。 */ @SuppressWarnings("serial") public class JsonRPCTestServlet extends JSONRPCServlet { @Override public void init() throws ServletException { super.init(); JSONRPCBridge.getGlobalBridge().registerObject("testService", new TestServiceImpl()); } }
3.web.xmlにServletを追加する。
... <servlet> <servlet-name>JsonRPCTestServlet</servlet-name> <servlet-class>test.jabsorb.JsonRPCTestServlet</servlet-class> </servlet> ... <servlet-mapping> <servlet-name>JsonRPCTestServlet</servlet-name> <url-pattern>/jsonrpc</url-pattern> </servlet-mapping> ...
これでサーバーサイドは完成。
4.JavaScriptでクライアントを書く。
最後にJavaScriptでクライアントを書いて、サービスにアクセスしてみます。
なお、インポートしている「../js/jabsorb/jsonrpc.js」は「jabsorb」で提供されているライブラリです。「jabsorb-1.3.1-minimal.zip」に含まれています。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="../js/jabsorb/jsonrpc.js"></script> <script type="text/javascript"> function main() { try { // クライアントを作成。引数でServletのパスを指定する。 jsonrpc = new JSONRpcClient("/jsonrpc"); // <クライアント>.<サービスの登録名>.<メソッド名> でサービスのAPIを呼び出して結果を取得。 var result = jsonrpc.testService.hello("hello"); document.getElementById( "stdout" ).innerHTML += result; } catch(e) { document.getElementById( "stdout" ).innerHTML += e; } } </script> </head> <body onload="javascript:main();"> <div id="stdout" /> </body> </html>