Google Web Toolkitについて3

Google Web Toolkitから標準のRPCを利用してサーバー側と通信させてみる。

プロジェクトに新規ファイルで Cypal Studioの「リモート・サービス」を追加

プロジェクト、モジュールを指定し、

名前:MyService
サービスURI:MyService.action

として作成。

tutorial.gwt.client.MyService.java        - サービスインターフェース
tutorial.gwt.client.MyServiceAsync.java   - 非同期呼び出しインターフェース(これは触らない)
tutorial.gwt.server.MyServiceImpl.java    - サーバー側サービス実装

の3つと、web.xmlへのMyService.actionサーブレットの登録がされる。

MyService.javaにRPCの呼び出しエントリを追加する。
意味はないが渡された数字をカウントアップして返却する countUp を次のように追加

package tutorial.gwt.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

public interface MyService extends RemoteService {

	public static final String SERVICE_URI = "/MyService.action";

	public static class Util {

		public static MyServiceAsync getInstance() {

			MyServiceAsync instance = (MyServiceAsync) GWT
					.create(MyService.class);
			ServiceDefTarget target = (ServiceDefTarget) instance;
			target.setServiceEntryPoint(GWT.getModuleBaseURL() + SERVICE_URI);
			return instance;
		}
	}

	public Integer countUp( Integer cnt );
}

※最後の

	public Integer countUp( Integer cnt );

以外は Cypalで自動生成したコード。

これで保存すると、MyServiceAsync.java に必要な呼び出しインターフェースの登録が自動でなされる。

そして、
MyServiceImpl.java で次のようにサーバー側のサービスを実装する。

package tutorial.gwt.server;

import tutorial.gwt.client.MyService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class MyServiceImpl extends RemoteServiceServlet implements MyService {
	@Override
	public Integer countUp(Integer cnt) {
		System.out.println("Cnt:"+cnt);
		return cnt+1;
	}

}

そして、前の MyGWT.javaでRPC呼び出しをするように変更

package tutorial.gwt.client;

import tutorial.gwt.client.MyService;
import tutorial.gwt.client.MyServiceAsync;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;

public class MyGWT implements EntryPoint {
	Label lbl = new Label("");
	int cnt =0;
	public void onModuleLoad() {
		Button btn = new Button("Click!");
		btn.addClickListener( new ClickListener() {
			public void onClick(Widget arg0) {
				MyServiceAsync sv = MyService.Util.getInstance();
				sv.countUp(new Integer(cnt), new AsyncCallback() {
					public void onFailure(Throwable arg0) {
						Window.alert(arg0.toString());
					}
					public void onSuccess(Object arg0) {
						Integer ans = (Integer)arg0;
						cnt = ans.intValue();
						lbl.setText(  ""+cnt);
					}
				});
			}

		});

		RootPanel.get("slot1").add(btn);
		RootPanel.get("slot1").add(lbl);
	}
}

ポイントは

MyServiceAsync sv = MyService.Util.getInstance();

で取得した、非同期インターフェースの必要なメソッド(CountUp)を完了時のコールバックとともに呼び出すこと。

実行して、Clickするとサーバー側のログに出力がされてRPC呼び出しされていることが確認できた。