SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Google Web Toolkit:現実的な開発に即したAJAX

JavaをJavaScriptとHTMLに変換する開発フレームワークの利用

GWTのRPCに注目する

 図3は、AJAX With EaseアプリケーションがGWTのRPCをどのように利用しているかを示しています。

図3 GWTのRPCを利用した「AJAX With Ease」アプリケーション
図3 GWTのRPCを利用した「AJAX With Ease」アプリケーション

 では、それぞれのRPCについて説明しましょう。

  • Remote Serviceインターフェイス
  • クライアントフォルダにある「HelloService.java」はGWTのRemoteServiceを拡張しており、GWTのRPC基盤によって有効にする必要があるインターフェイスを表しています。
  • Remote Service実装クラス
  • 「server」フォルダにある「HelloServiceImpl.java」はHelloServiceに定義されているリモートインターフェイスを実装し、GWTのRemoteServiceServletを拡張しています。さらにRemoteServiceServletHttpServletを拡張したものです。つまり、HelloServiceImplはクライアントの要求(ブラウザ+HTML/JavaScript)に応答するサーブレットです。またHelloServiceImplはモジュール設定ファイルhello.gwt.xmlでも参照されており、その中でサーブレットパス「/hello」にマッピングされています。
  • 非同期コールバックインターフェイス
  • 「client」フォルダにあるHelloServiceAsyncは非同期のコールバックインターフェイスです。このクラスの名前は「Async」で始まるサービスインターフェイスのクラス名でなければなりません。ただし、このインターフェイスを実装する必要はありません。GWT側で実装されるためです。
    GWTのRPC通信における特異な点の1つは、それが非同期で行われることです。つまり、クライアントはサーバーを呼び出してもサーバーからすぐに応答が返ってくるのを待つ必要はありません。サーバーはデータが準備できた時点でクライアントに再接続し、その応答データをクライアントに提供します。
  • シリアライズ可能な型オブジェクト
  • 「Person.java」はGWTでシリアライズ可能な値オブジェクトです。このオブジェクトはhello()関数によってパラメータとして渡されます。クライアントとサーバーとの間でやりとりされるこの値オブジェクトを使うために、何か特別なことを行う必要はありません。GWTはこのパラメータのシリアライズ化およびデシリアライズ化の処理を行い、基本データ型の値および所与のカスタムJavaオブジェクトの値を返します。これらのカスタムオブジェクトはGWTのIsSerialiazableインターフェイスを実装しているので、これらのオブジェクトを定義するときにはGoogleのGWTドキュメントに記されたいくつかのルールに従います。このPersonオブジェクトが変わっているのは、クライアント側のJavaScriptとサーバー側のJavaバイトコードで使われている点です。
  • HelloConstants
  • このクラスはGWTが必要とするものではなく、EclipseのGWT Hosted Modeでアプリケーションのデバッグを行うときや、Apache TomcatのようなWebサービスにアプリケーションをデプロイするときのための必要悪です。このクラスはサーブレットパスを指す定数HELLO_SERVICE_URLを定義します。アプリケーションのデバッグ時には、GWT対応環境が想定しているようにHELLO_SERVICE_URLを/helloに設定する行を使う(非コメント化する)必要があります。ただし、WebサーバーにデプロイするWARファイルをビルドする準備ができたときは、実行時にHELLO_SERVICE_URLの設定行を、Webサーバーにデプロイしたときのhttp://localhost:8080/ajaxwithease-0.1/helloと等しい値に設定する(非コメント化する)必要があります。
    WARファイルのWebサーバーへのデプロイに加えて、次のように「web.xml」へのサーブレットのマッピングの追加も必要です。
    ...
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>
          com.techyatra.awe.server.HelloServiceImpl
        </servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
    ...
    
  • HelloRPC
  • サービスHelloServiceを利用するコンポジットウィジェットです。このウィジェットはまずHelloServiceのサービスエンドポイントを取得し、続いてエンドポイントのエントリポイントがHelloServiceImplのサーブレットパスURLに設定されます。AsyncCallbackのインスタンスが作成され、helloService.hello()関数の呼び出し時にパラメータとして渡されます。AsyncCallbackonSuccessおよびonFailureはAJAX With Easeアプリケーション特有の処理を行うため、次のようにオーバライドされています。
    package com.techyatra.awe.client;
    ...
    public class HelloRPC extends Composite
    {
        ...
        HelloServiceAsync helloService = (HelloServiceAsync)
                          GWT.create(HelloService.class);
    
        ServiceDefTarget endpoint = (ServiceDefTarget)
                          helloService;
    
        public HelloRPC()
        {
            endpoint.setServiceEntryPoint
                (HelloConstants.HELLO_SERVICE_URL);
    
            ...
            AsyncCallback callback =  new AsyncCallback()
            {
                public void onSuccess(Object result)
                {
                    labelRPC.setText((String) result);
                }
    
                public void onFailure(Throwable caught)
                {
                    errorMessage.setHTML(caught.getMessage());
                }
            };
            helloService.hello(
                new Person(textTitle.getText(),
                textName.getText()), callback);
            }
            ...
        }
    }
    
    サーバーは処理を終えてデータを返す準備が整うと、AsyncCallbackに頼ってクライアントへのコールバックとonSuccess()メソッドの呼び出しを行います。サーバーによって投げられた例外はonFailure()メソッドが受けます。

 これでアプリケーションには立派なインターフェイスと高速なデータ検索機能が備わりましたが、履歴機能についてはどうでしょうか? GWTを使えば、履歴に対応させることができます。

あるべき履歴機能

 AJAXベースのアプリケーションを利用したときに出る大きな不満の1つは、ブラウザの戻るボタンが持っている機能が失われがちなことです。GWTの場合、履歴の機能が失われることはありません。GWTにはアプリケーションがブラウザの「戻る」および「進む」イベントに応答するためのフックが用意されています。

 次の「HelloHistory.java」のコードは、GWTのHistoryListenerインターフェイスを実装しているHelloHistoryというコンポジットウィジェットを示しています。

package com.techyatra.awe.client;

...

public class HelloHistory extends Composite
    implements HistoryListener
{
    public HelloHistory()
    {
        ...
        History.newItem(textHistory.getText());
        ...
        History.addHistoryListener(this);
    }

    public void onHistoryChanged(String historyToken)
    {
        String token = History.getToken();
        if (token != null)
        {
            textHistory.setText(token);
        }
    }
}

 アプリケーションのユーザーによってブラウザの[戻る]および[進む]ボタンが押された場合は、onHistoryChanged()メソッドの中でそれらの操作に応答できます。履歴の追跡にはトークンを用います。適当なところで履歴にトークンを追加し、これらのトークンを頼ってonHistoryChanged()関数内で適切な処理を実行します。

新たなアプリケーションプラットフォーム?

 GoogleがGWTで成し得た成果により、Windowsオペレーティングシステムに頼らずに、ファットクライアントと同等の機能を持つWebアプリケーションを開発することが可能になりました。プラットフォームの新たな領域が開拓されたと言えるのではないでしょうか。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Gautam Shah(Gautam Shah)

政府機関どうしの情報共有を可能にするソリューションなど、大規模で複雑なアプリケーションの開発に10年間にわたって従事。J2EE、.NET、オープンソースソリューションのほか、BizTalk、WebMethods、WebSphere Business Integration Serverのような各種統...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/531 2006/09/11 15:09

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー