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呼び出しされていることが確認できた。