サンプルコードでGWTの概要を理解する

GWT(ぐいっと)とは

GWTとは、ざっくりいうとajaxなアプリケーションをjsを書かずにJavaだけで書けちゃう、というGoogle製のフレームワーク。以前Java Servlet + Ajaxで書いたときにUIの処理をどう書くべきか?というところですごく悩んでしまった。(タグをjsでハードコーディングするのが気持ち悪かったり)
GWTならそのあたりを悩む必要がなさそうだ、という動機で試してみる。
なお、Androidに置き換えて考えると理解しやすそうだったので、随時Androidフレームワークのなにに相当するかをちょこちょこ書いています。

環境

GWTのドキュメントについて

GAEと同様、GWTの日本語ドキュメント(スタート ガイド - クイック スタート - Google Web Toolkit - Google Code)はメンテされていないよう。(最新は2.2なのに1.6とか書いてあるみたい)
英語版(Get Started with the GWT SDK - Google Web Toolkit - Google Code)を見る。

とりあえずサンプルコードを動かすまでの手順

1)File>New> Web Application Projectを選択
2)Use Google Web Toolkitにチェックを入れる(GAEを使うのでGAEにも)
3)Generate GWT project sample codeにチェックを入れてFinish
プロジェクトが作成される。
とりあえず何も変更せずRun As からWeb Applicationを選んで
localhost:8888にアクセスすると、
GWT module 'xxx' may need to be (re)compiled」と表示される。コンパイルが必要とのこと。
Eclipseに戻ってコンパイルをしてみる。
とりあえず設定は変更せず。
数十秒するとコンパイルが完了するので、再度localhost:8888にアクセスすると、サンプル画面が表示される。

チュートリアル斜め読みでGWTの概要を掴む

たくさんファイルが生成されるけど、とりあえず下記のファイルを抑えておけば良いようだ。

1) xxx.gwt.xml

パッケージ直下にある。Androidでいうマニフェストファイルのようなものかな。GWTアプリケーションはエントリーポイントクラスというものが必要で、このファイル内でその指定をしているようだ。

  <!-- Specify the app entry point class.                         -->
  <entry-point class='com.naokichick.samplegwt.client.SampleGWT'/>
2) ホストページ

アプリケーション実行に必要なhtmlファイル。warフォルダ内にプロジェクト名.htmlである。

    <h1>Web Application Starter Project</h1>

    <table align="center">
      <tr>
        <td colspan="2" style="font-weight:bold;">Please enter your name:</td>        
      </tr>
      <tr>
        <td id="nameFieldContainer"></td>
        <td id="sendButtonContainer"></td>
      </tr>
      <tr>
        <td colspan="2" style="color:red;" id="errorLabelContainer"></td>
      </tr>
    </table>

一部を抜粋。
ちなみにホストページが参照するcssもwarに入ってる。

3) エントリポイントクラス

clientパッケージ内の、プロジェクト名と同じ名前のjavaファイル。interface EntryPointを実装している。
アプリケーションを起動すると、このクラスのonModuleLoadが呼ばれる。AndroidのstartActivityにおけるActivity#onCreateみたいなもんと考えてしまおう。このメソッドの中身を見ると、ボタンの生成や配置をしていることがわかる。

		final TextBox nameField = new TextBox();
		nameField.setText("GWT User");
		
		final Label errorLabel = new Label();

		final Button sendButton = new Button("Send");
		// We can add style names to widgets
		sendButton.addStyleName("sendButton");

		// Add the nameField and sendButton to the RootPanel
		// Use RootPanel.get() to get the entire body element
		RootPanel.get("nameFieldContainer").add(nameField);

したの方でRootPanel.get("nameFieldContainer")というのがある。このコードで、ホストページのエレメントのインスタンスを取得できるようだ。
ホストページのtd#nameFieldContainerを取得している。Androidの、layoutファイル内の要素をfindViewByIdで取得するのに似てますね。

感想

Androidフレームワークと類似点を見いだせるので、理解しやすかった気がします。
これからちょこちょこ使えるようになっていきたいです。