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