GoogleからJava開発者へのサプライズ!な贈り物、Google Web Toolkit[3]

JavaScript×HTMLとJavaのシームレスな開発環境を体験してみよう


リトルソフト株式会社 長尾寿宏
2006/8/26


 サーバ側 サービスメソッドの実装

 サーバ側プログラムは、GWTが提供するRemoteServiceServletクラスを拡張し、上記サービスインターフェイスを実装します。

package jp.littlesoft.gwttest1.server;

import jp.littlesoft.gwttest1.client.ImageSearchResultSet;
import jp.littlesoft.gwttest1.client.ImageSearchService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class ImageSearchServiceImpl extends 
RemoteServiceServlet implements(本来は1行)
    ImageSearchService {
  public ImageSearchResultSet execute(int start, 
int size, String keyword) (本来は1行)
throws Exception {
    /* 中略 */
  }
}

 次はいよいよ画像検索サービスの呼び出しです。

  Yahoo!検索WebサービスはREST(REpresentational State Transfer)と呼ばれ、HTTPリクエストに対してXMLをレスポンスとして返す大変シンプルなWebサービスです。

  public ImageSearchResultSet execute(int start, int 
size, String keyword)(本来は1行) 
throws Exception {    
    String requestParam = 
      "http://api.search.yahoo.co.jp/ImageSearchService
/V1/imageSearch" +(本来は1行)
      "?appid=[YOUR APP ID]" +
      "&query=" + java.net.URLEncoder.encode("\"" + 
keyword + "\"", "UTF-8") +(本来は1行)
      "&start=" + start + "&results=" + size;

      /* 中略 */
  }

 まずはHTTPリクエストパラメータを編集します。

 画像検索サービスのURLに引き続き、いくつかのパラメータが連結されています。上記コード中の[YOUR APP ID]には、実際にYahoo!デベロッパーネットワークで登録した値を設定してください。

 そのほかは、executeメソッドのパラメータから、検索キーワード(keyword)、検索結果の先頭位置(start)、返却結果件数(size)が、HTTPリクエストパラメータへ内容が引き継がれています。

 完成したHTTPリクエストパラメータ(requestParam)を使用して、実際にHTTPリクエストを行います。これにはjava.net.URL、java.net.HttpURLConnectionといった基本的なクラスを利用します。

 HTTPリクエストのレスポンスはXMLファイルですので、これを解析して、戻り値であるImageSearchResultSetオブジェクトへ内容をセットする必要があります。

 そこで、XMLを解析するクラスとしてYahooImageSearchResultHandlerを作成し、この中でImageSearchResultSetオブジェクトの内容を編集しています。

  public ImageSearchResultSet execute(int start, int 
size, String keyword) throws Exception {   (本来は1行)
    /* 中略 */
    ImageSearchResultSet resultSet = new ImageSearchResultSet();
    java.net.URL url = new java.net.URL(requestParam);
    java.net.HttpURLConnection urlCon = (java.net.HttpURLConnection)
url.openConnection();(本来は1行)
    try {
      org.xml.sax.InputSource ins = new org.xml.sax.InputSource
(urlCon.getInputStream());(本来は1行)
      javax.xml.parsers.SAXParserFactory fact = javax.xml.parsers.
SAXParserFactory.newInstance();(本来は1行)
      javax.xml.parsers.SAXParser parser = fact.newSAXParser();
      YahooImageSearchResultHandler handler = 
new YahooImageSearchResultHandler(resultSet);(本来は1行)
      parser.parse(ins, handler);
    } finally {
      urlCon.getInputStream().close();
      urlCon.disconnect();
    }
    return resultSet;
  }

 以上がサービスメソッドの完成した姿です。レスポンスのXMLを解析するため、YahooImageSearchResultHandlerクラスの内部では少々複雑な処理をしていますが、GWTの本質とは無関係な部分ですので、解説は割愛させていただきます。

 詳細はZIP形式でこちらからダウンロードできるYahooImageSearchResultHandler.javaファイルを参照してください。

 なお、ホステッドモードによるデバッグ実行時に、サーバ側モジュールが自動的にロードされるよう、モジュール.xmlファイル(ImageSearchClient.gwt.xml)に、<servlet>を追加します。

<module>

 <!-- Inherit the core Web Toolkit stuff.                  -->
 <inherits name='com.google.gwt.user.User'/>

 <!-- Specify the app entry point class.                   -->
 <entry-point class='jp.littlesoft.gwttest1.client.
ImageSearchClient'/>(本来は1行)
  <servlet path='/test/search' class='jp.littlesoft.server.
ImageSearchServiceImpl'/>(本来は1行)
  
</module>

 非同期インターフェイスの定義

  次に、もう1つ別のインターフェイスを作成します。

 クライアント側では、サービスインターフェイス名に基づいて、リモートメソッド呼び出しで使用する代理オブジェクトを生成し、これに対しリモートメソッド呼び出しを指示します。

 この代理オブジェクトには、非同期コールバックインターフェイス(AsyncCallback)を実装したオブジェクトをパラメータで引き渡す必要があり、また戻り値を返さないため、サービスメソッドとは異なる非同期処理用のインターフェイスを定義する必要があります。

 この非同期処理用インターフェイスと本来のサービスインターフェイスは、同じパッケージの中で、同じ名前としますが、非同期処理用インターフェイスには“Async”という接尾詞を付けるという名前付けルールによって、お互いが関連付けられています。

 ImageSearchServiceの非同期処理用インターフェイスは以下のようになります。

package jp.littlesoft.gwttest1.client;

import com.google.gwt.user.client.rpc.AsyncCallback;

public interface ImageSearchServiceAsync {
  public void execute(int start, int size, String keyword,
 AsyncCallback callback);(本来は1行)
}

 サービスメソッドでの戻り値はvoidに変更され、パラメータにはAsyncCallbackオブジェクトが追加されている点に注意してください。

 リモートメソッド呼び出し代理オブジェクトは以下のようなコードで作成します。

ImageSearchServiceAsync searchService;
searchService = (ImageSearchServiceAsync) GWT.create
(ImageSearchService.class);(本来は1行)

 GWT.createはホステッドモード、Webモードに応じて適切なオブジェクトを生成してくれるメソッドです。

 本来のサービスインターフェイスを指定し、createメソッドを実行すると、それに対する適切な代理オブジェクトが返されます。このオブジェクトを非同期処理用インターフェイスへキャストします。

 次に、サービスが実行されているURLを以下のコードで指定します。ターゲットとなるURLは、ホストページと同じドメイン、同じポートである必要があります。

ServiceDefTarget target = (ServiceDefTarget) searchService;
target.setServiceEntryPoint("/test/search");

 以上で、RPCインターフェイスの定義とサービスメソッドの実装は完了です。

2/5

 INDEX

JavaScript×HTMLとJavaのシームレスな開発環境を体験してみよう
  Page1<Webサービスから結果セットを読み出して表示させるまで/RPCインターフェイスの定義とサービスメソッドの実装/検索結果セットのクラスを作成する/サービスインターフェイスの定義>
Page2<サーバ側 サービスメソッドの実装/非同期インターフェイスの定義>
  Page3<クライアント側 検索機能の実装/ウィジェットへの値設定>
  Page4<グリッドの利用/グリッドのバグ回避/スクロールに伴う自動読み込み>
  Page5<背景色変更と内部フレーム表示/今後のバージョンアップも期待>


 Ajax関連記事


Ajaxフレームワーク「Spry」で作る「リンク集2.0」
特集:AdobeのAjaxフレームワーク「Spry」を使ってみよう アドビのAjaxフレームワーク「Spry」。さっそく簡単なリンク集のサンプルを作成しながら、その機能を探ってみよう
リッチクライアント & 帳票」フォーラム 2006/6/21

古くて新しいAjaxの真実を見極める
「Webインターフェイスの新しい手法」「画期的なWebアプリケーションの仕組み」であるとして開発者たちの人気を集めるAjaxとは何なのか、その真実を見極めてみよう
最終更新 2005/8/2


HTML5 + UX フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日 月間