Google Web Toolkit(GWT)はなかなか面白いWebフレームワークですね。WicketやASP.NETとはまったく違ったアプローチでWebページをデザインできます。
いまさらながら、その特徴について書いてみようと思います。
いきなりまとめ
結論を先にまとめてみました。この比較を導いた考察を説明していきます。
Wicket | ASP.NET | GWT | |
---|---|---|---|
イベントハンドラの記述 | Java | .NET | Java |
イベントハンドラの実行 | サーバ | サーバ | クライアント(JavaScript) |
コンポーネントの状態保持 | サーバセッション | ViewState | なし(クライアントでの動作なので不要) |
画面デザイン | HTML | ASP(デザイナあり) | コードによるコンポーネント階層構築(HTMLも可?) |
JavaScriptコンパイラ
GWTはコンポーネント志向でWebアプリケーションを作成できるわけですが、最大の特徴はJava→JavaScriptへのコンパイル機能です。Javaで記述したコンポーネントのイベントハンドラのロジックは、JavaScriptに変換されて実行されます。ただし、開発時に使用するホステッドモードという状態ではJavaのまま動作します。
WicketやASP.ENTはイベントハンドラのロジックはサーバーサイドで動作します。
GWTはJavaScriptに変換されてクライアントサイドで動作します。でもコードはJavaで記述できます。ここが大きく異なります。
例えば、ボタンを押したら、”AフィールドとBフィールドの値をから、ゴニョゴニョ計算してその結果をCフィールドに表示する”といったコードを記述した場合、WicketとGWTはほとんど似たような記述になると思います。でもWicketの場合はサーバーサイドで処理を実行します。一方GWTは全部クライアントで行うわけです。不思議ですねえ。
ホステッドモードの場合は、コンパイルを行わずにJavaコードのままで実行されます。ホステッドモードは開発用の専用ブラウザでのみ使用可能です。JavaScriptへのコンパイルは結構時間がかかるので、開発時の動作確認はホステッドモードで行うわけです。(ロジックはJavaで記述されているので、Javaコードとして実行するのは簡単)Javaコードとして実行するのでJVMの強力なデバッグ機能(ステップ実行や変数参照)が使用可能です。
RPC
GWTのもうひとつの機能としてRemote Procedure Calls(RPC)が用意されています。これはサーバーサイドのメソッドを呼び出すための機能です。サーバーサイドのメソッドをJavaScriptから呼び出し、引数の変換(JavaScript→Java)や戻り値の変換(Java→JavaScirpt)を行います。ただし前述の通り、クライアントサイドの処理をJavaで記述しているので、ソースコード的には普通にJavaでメソッドを呼び出しているような記述になります。不思議ですねえ。(ホステッドモードのときはそのままJavaメソッドを呼び出すように動作している)
私の勘違い
私は最初はこのような勘違いをしていました。
「GWTはAjaxをバリバリ使ったWebフレームワークで、ASP.NET Ajaxと似たようなもんだろう」
いや違います。Ajaxの機能もありますが、真髄はJavaScriptコンパイラにあります。クライアントサイドでバリバリ動作するようなアプリケーションこそGWTに最適かと思います。
「TextBoxに値をセットする」とか、クライアントでもできる処理を全部サーバに持っていったのがWicketやASP.NETです。おかげでサーバサイド言語で統一して記述できるようになりました。一方、GWTはJavaScriptで実行しますが、Java言語で記述できるようにしたものです。「TextBoxに値をセットする」という処理はクライアントで実行します。セットする値がサーバサイドで取得する場合はRPCを使って取得します。
他フレームワークのAjaxコンポーネント
WicketのAjaxコンポーネントやASP.NET Ajaxでは、ページ全体を送信してないわけですが、(私の認識が間違っていなければ)ページの描画HTMLはサーバサイドで作っています。フォーム情報を全部サーバに送信し処理結果のHTMLの“一部”を返却して描画を置き換えています。GWTの場合はメソッドの引数にあたるオブジェクトを送信し、結果をオブジェクトとして受け取ります。そして描画の書き換えはJavaScriptで行います。HTMLを生成して書き換える方式に比べて処理効率がよいと考えられます。
GWTの不安点
GWTのデメリットとしては「JavaScriptコンパイラをどこまで信頼できるか」でしょう。私が評価として作成している間はコンパイルの不具合はなかったですが、もしも「ホステッドモードでの動作とJavaScriptでの動作が異なる」という現象が起きたときには手も足もでなくなりそうです。そういった意味でWicket AjaxやASP.NET Ajaxのアプローチは安全です。
JavaScriptコンパイラは、JRE1.4の基本的なAPIについて対応しています。
1画面ですべて完結するようなGmailのような画面はいいのですが、画面遷移する場合はどうしたらよいのか分からない。(当然、遷移したら画面の状態は保持できなくなる)
Java徹底活用 Google Web Toolkitによる
Ajaxアプリケーション開発