Google Web Toolkitについて4
GWT RPCサービスのインターフェースは簡単に増やすことが出来る。
カウントアップだけではなく、リセットも出来るようにしてみる
まず、MyService.javaにインターフェースを追加
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 reset(); }
最後の1行の
public Integer reset();
を追加した。
すると Cypalが MyServiceAsync.javaを次のように生成してくれる。
package tutorial.gwt.client; import com.google.gwt.user.client.rpc.AsyncCallback; public interface MyServiceAsync { public void countUp( Integer cnt, AsyncCallback callback ); public void reset(AsyncCallback callback); }
次に、サーバー側のサービス実装をする(MyServiceImpl#reset が追加したもの)
package tutorial.gwt.server; import tutorial.gwt.client.MyService; import com.google.gwt.user.server.rpc.RemoteServiceServlet; public class MyServiceImpl extends RemoteServiceServlet implements MyService { public Integer countUp(Integer cnt) { System.out.println("Cnt:"+cnt); return cnt+1; } public Integer reset() { System.out.println("Reset"); return 0; } }
そして、リセットボタンとクリックされた場合の処理を記述する。
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; MyServiceAsync sv = MyService.Util.getInstance(); AsyncCallback cb = 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); } }; public void onModuleLoad() { Button btn = new Button("Click!"); btn.addClickListener( new ClickListener() { public void onClick(Widget arg0) { sv.countUp(new Integer(cnt), cb); } }); Button rst = new Button("Reset!"); rst.addClickListener( new ClickListener() { public void onClick(Widget arg0) { sv.reset(cb); } }); RootPanel.get("slot1").add(btn); RootPanel.get("slot1").add(rst); RootPanel.get("slot1").add(lbl); } }
今回たまたまコールバックでやることが一緒なのでコールバック処理を共用した。
これでOK