Professional Documents
Culture Documents
• 基本的にネットワーク系のプログラマーです
おさらい
GWT(Google Web Toolkit) とは?
• 非同期通信 (Ajax) を Java でコーディング
するための Web プログラミングツールで
す
• 各ブラウザ向けに最適化された Java
Script が送られるようになっています
アドバンテージ
• どのような Java IDE でも利用できます。
もちろんエディタでも OK!
• Unit テスト
• 素早い edit/test/debug/refactor サイクル
• 既存の Java 資産を利用できる
• オブジェクト指向デザインパターン
• Javadoc
• タイプミスなどをコンパイル時に発見で
きる
デバッグとテスト
開発シェル
• GWT では、デバックコンソールとしての
開発シェルが付属しています。
開発シェル
• 開発シェルは、ログ出力のコンソールと
して利用します
• ロギング用のメソッド「 GWT.log() 」を
利用して挿入されたログは、この開発シ
ェルに出力されます
• また、実行時に発行された Exception もす
べてフックされ、開発シェルに出力され
ます
デモ
Hosted モード
• applicationCreator で生成されるスクリプ
トから開発シェルを起動すると、 Java
IDE と連動することができる Hosted モー
ドで起動します
• また、デバッグオプションとともに起動
されるので、手持ちのデバッガーでアタ
ッチすることができます
Web モード
• Web モードで実行するには、まず Java プログ
ラムを JavaScript にコンパイルする必要があり
ます
– com.google.gwt.dev.GWTCompiler を利用して、コマンドライ
ンでプログラムをコンパイルする
• GWT.log() メソッドで書いたログは、プ
ログラムをサーバサイドで実行しても、
ローカルの開発シェルに出力することが
できます
デモ
自動テスト
• 自動テストは JUnit を利用した事があれば、簡
単です。必要なスクリプトは junitCreator で生成
できます
• junit.framework.TestCase を拡張した
com.google.gwt.junit.client.GWTTestCase を拡
張したテストケースクラスを作成
• GWTTestCase.getModuleName() は、テスト対
象のクラス名(パッケージ名込み)を返すよう
に実装
自動テスト
• GWT の自動テストでは、バックグラウンドで見
えないブラウザを実行しています
• 目に見えないブラウザを実行することによって
、テストに GUI ライブラリを使用することがで
きます
• Linux 上では見えないブラウザを起動し、テスト
を実行する前に、ターゲット環境として、 X 仮
想フレームバッファ (Xvfb) を起動することがで
きます
注意点
• Hosted モードでテストを実行している場
合、プログラムは Java バイトコードで実
行されているという点を理解しておく必
要があります
• JUnit では、テストを実行しているスレッドが停止する
とすぐにテストメソッドの呼び出し元に制御が移るよう
になっています
非同期テスト
• GWT の拡張 JUnit では、この問題を解決
する(&非同期のテストをする)ために
、2つのメソッドを用意しています
– GWTTestCase.delayTestFinish(int)
• 非同期モードへの切り替え
– GWTTestCase.finishTest()
• 非同期モードの終了
ただし、
• 一般的なブラウザではマルチスレッドが実装さ
れていないので、 GWT の拡張 JUnit でも、マル
チスレッドやスレッドを停止するテストが許可
されていません
非同期テスト
• 非同期モード中に発生する可能性がある処理
– 非同期モードの終了時間が経過する前で、さらに
finishTest() メソッドが呼び出される前に、テストが
正常終了する
– テストのどこかで例外をスローする
– finishTest() が呼び出されるか、テストが終了する前
に、非同期モードの終了時間が経過する
( TimeoutException がスローされる)
デモ
TestSuite でテストをまとめる
public class MapsTestSuite extends GWTTestSuite {
public static Test suite() {
TestSuite suite = new TestSuite("Test for a Maps Application");
suite.addTestSuite(MapTest.class);
suite.addTestSuite(EventTest.class);
suite.addTestSuite(CopyTest.class);
return suite;
}
}
Setup と Teardown (GWT1.5 ~ )
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
/**
* Removes all elements in the body, except scripts and iframes.
*/
public void gwtSetUp () {
Element bodyElem = RootPanel.getBodyElement();
• Web モード
– junitCreator でスクリプトを生成して、 -
Dgwt.args="-web" オプションを指定して実行します
• マニュアルモード (GWT1.5 ~ )
– マニュアルモードはかなり特殊なモードで、自分の
好きなブラウザで動作させながらテストすることが
できます。出力された URL をブラウザに貼り付けて
実行します
GWT で JSON を使う
HTTP と JSON
• GWT では、 Ajax 通信をするときに、ネ
ットワークプロトコルを意識する必要は
ありませんが、 GWT で既存の WebAPI
を利用したい事があります
– 既存の WebAPI
– 他社が開発した WebAPI
JSON
• Ajax 開発者の間で、 JSON というフォー
マットがますます一般的になっています
[
{
"symbol": "BA",
"price": 87.86,
"change": -0.41
},
{
"symbol": "KO",
"price": 62.79,
"change": 0.49
},
{
"symbol": "JNJ",
"price": 67.64,
"change": 0.05
}
]
JSON
JavaScript だと以下のように書きます
var point = { "x": 3, "y": 4 };
こんなに簡単!
JSON
• 以前、作ったあの WebAPI を利用したい
んだけど、 JSON で結果を返すようにな
ってるんだよなぁ。。。
– クラス
• JSONArray
• JSONBoolean
• JSONNull
• JSONNumber
• JSONObject
• JSONString
– 例外
• JSONException
GWT と JSON
• 文字列を JSON 型にマッピングするには
、
– JSONParser.parse(String)
• JSON 型を文字列に戻すには、
– 単に toString()
JSON で SOP を超える!
public class MyJSONUtility
{
interface JSONHandler {
public void handleJSON(JavaScriptObject obj);
}
@mypackage.MyJSONUtility::dispatchJSON(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/sample/
client/JsonTestApp$JSONHandler;)(jsonObj, handler);
}
// create SCRIPT tag, and set SRC attribute equal to JSON feed URL + callback function name
var script = $wnd.document.createElement("script");
script.setAttribute("src", url+"jsonCallback");
script.setAttribute("type", "text/javascript");
$wnd.document.getElementsByTagName("head")[0].appendChild(script);
}-*/;
try {
Request response = builder.sendRequest(null, new RequestCallback() {
public void onError(Request request, Throwable exception) {
// Code omitted for clarity
}
try {
builder.setHeader("Content-Type", "application/x-www-form-urlencoded");
Request response = builder.sendRequest(postData, new RequestCallback() {
try {
//2000 ミリ秒でタイムアウト
builder.setTimeoutMillis(2000);
if (i > 0) {
sb.append("&");
}
sb.append("=");
return sb.toString();
}
GET/POST 以外のメソッド
• RequestBuilder(String httpMethod, String
url) を利用し、 httpMethod に好きなメソ
ッドを書きます
には、ご注意ください
デモ
おわり
お知らせ
• つい先日、 8 月 28 日に GWT Ver1.5 が正
式リリースされました!
ついでにドキュメントも充実しました!!
!
ただし、英語だけ orz
• また、講演者や議題も募集します!