JavaにはAjaxを実現するためのフレームワークがすでに多数存在する。しかし、通常のWebアプリケーションAjaxを利用してちょっとした機能を付け加えたい、というような用途にはこれらのフレームワークを導入するには大げさすぎるという場合もあるだろう。JSONICにはWebServiceServletというサーブレットが付属しており、別途フレームワークを用意しなくてもJSONを利用したWebサービスを実現することができる。

WebServiceServletを使用するにはweb.xmlに以下の設定を行う。

<servlet>
  <servlet-name>json-ws</servlet-name>
  <servlet-class>net.arnx.jsonic.web.WebServiceServlet</servlet-class>
  <init-param>
    <param-name>config</param-name>
    <param-value>
    {
      "debug": true,
      "encoding": "UTF-8",
      "mappings": {
        "/[package]/[class].[ext]": "services.${package}.${class}Service",
     }
    }
    </param-value>
  </init-param>
</servlet>

<servlet-mapping>
  <servlet-name>json-ws</servlet-name>
  <url-pattern>*.json</url-pattern>
</servlet-mapping>

この設定によって*.jsonへのリクエストがWebServiceServletにディスパッチされる。また、WebServiceServletのinit-paramでURLと呼び出すクラスとのマッピングが行われている。たとえば後述するRESTスタイルの場合、上記の設定例では"/user/user.json"へのアクセスでservices.user.UserServiceが呼び出されることになる。

WebServiceServletはRESTスタイルとJSON-RPCという2種類のWebサービスをサポートしており、POJOで実装されたサービスクラスのメソッドを呼び出し、結果をJSONで受け取ることができる。

RESTスタイル

RESTスタイルの場合、"/user/user.json"のようにURLで呼び出すクラスを指定する。これがweb.xmlでのマッピングの設定によって実際に呼び出すクラス名(上記の設定であればservices.user.UserService)に展開される。呼び出されるメソッドはリクエストのメソッドに応じて決定される。

  • GET
    findメソッドが呼び出される。引数はURLのクエリ文字列で指定する。
  • POST
    createメソッドが呼び出される。メソッドの引数はリクエストボディにJSONとして指定する。
  • PUT
    updateメソッドが呼び出される。メソッドの引数はリクエストボディにJSONとして指定する。
  • DELETE
    deleteメソッドが呼び出される。メソッドの引数はリクエストボディにJSONとして指定する。

たとえば以下のようなサービスがあるとしよう。

/** ユーザ情報を表すPOJO */
public class User {
  public String userId;
  public String name;
}

/** ユーザの検索条件を表すPOJO */
public class UserSearchCondition {
  public String userId;
}

/** ユーザの検索と登録を行うサービスクラス */
public class UserService {

  /** ユーザを検索 */
  public User find(UserSearchCondition condition){
    User user = ... // conditionを使って検索
    return user;
  }

  /** ユーザを登録 */
  public void create(User user){
    // userを登録
  }
}

この場合、find()メソッドを呼び出すには"/user/user.json?userId=001"というURLにGETメソッドでアクセスすればよい。find()メソッドの戻り値のオブジェクトをJSONICでエンコードしたJSONが返却される。また、create()メソッドを呼び出すには"/user/user.json"にPOSTメソッドで以下のJSONを送信すればよい。

{
  "userId": "001", 
  "name": "Naoki Takezoe"
}

JSON-RPC

JSON-RPCはその名の通り、JSONを使用したRPC(Remote Procedure Call)を実現するものだ。JSON-RPCの場合、例えば"/user/rpc.json"などのようにrpc.jsonに対してPOSTメソッドでリクエストを送信し、呼び出すクラスやメソッドはリクエストボディで送信するJSONで指定する。たとえば上記のUserServiceのfind()メソッドを呼び出すには以下のJSONを送信すればよい。

{
  "method": "user.find",
  "params": [{
    "userId" : "001"
  }],
  "id": 1
}

レスポンスとして以下のようなJSONが返却される。

{
  "result": {
    "userId": "001", 
    "name": "Naoki Takezoe"
  },
  "error": null,
  "id": 1
}

なお、web.xmlでのがWebServiceServletの設定内容を変更することで、Seasar2などのDIコンテナで管理されているコンポーネントをWebサービスとして利用することも可能だ。詳細についてはJSONICのWebサイトを参照してほしい。