package com.google.gwt.sample.stockwatcher.client; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; @RemoteServiceRelativePath("stockPrices")//子路径 public interface StockPriceService extends RemoteService { //客户端需要的业务方法 StockPrice[] getPrices(String[] symbols); }
实现类如下:
package com.google.gwt.sample.stockwatcher.server;
import com.google.gwt.sample.stockwatcher.client.StockPrice;
import com.google.gwt.sample.stockwatcher.client.StockPriceService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
public class StockPriceServiceImpl extends RemoteServiceServlet implements StockPriceService {
public StockPrice[] getPrices(String[] symbols) {
// TODO Auto-generated method stub
return null;
}
}
接下来,要到web.xml中配置servlet:
<servlet>
<servlet-name>stockPriceServiceImpl</servlet-name>
<servlet-class>com.google.gwt.sample.stockwatcher.server.StockPriceServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>stockPriceServiceImpl</servlet-name>
<url-pattern>/stockwatcher/stockPrices</url-pattern>
</servlet-mapping>
为了能进行异步调用,还要在客户端新增一个接口:
package com.google.gwt.sample.stockwatcher.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface StockPriceServiceAsync {
void getPrices(String[] symbols, AsyncCallback<StockPrice[]> callback);
}
注意几点,这个接口的命名需要遵循规范:同步接口后面加Async。
里面的方法要遵循规范:方法个数和名称完全一样,但是返回值一律没有了(因为是异步的),同时参数列表的最后,增加一个AsyncCallback,这是个泛型的容器类,里面的类别就是同步方法的返回类。这用来调用完成时做些处理。
接下来是真正调用的类,这个类命名没什么规定,但是要记得他是在client端的,因此有些限制。
private ArrayList<String> stocks = new ArrayList<String>();
//创建一个代理,通过这个代理去访问后台的东西
private StockPriceServiceAsync stockPriceSvc = GWT.create(StockPriceService.class);
private void refreshWatchList() {
// Initialize the service proxy.
if (stockPriceSvc == null) {
stockPriceSvc = GWT.create(StockPriceService.class);
}
// 实现一个匿名的Callback类
AsyncCallback<StockPrice[]> callback = new AsyncCallback<StockPrice[]>() {
public void onFailure(Throwable caught) {
// TODO: Do something with errors.
}
public void onSuccess(StockPrice[] result) {
updateTable(result);
}
};
// 真正的调用
stockPriceSvc.getPrices(stocks.toArray(new String[0]), callback);
}
我们注意到,真正的调用代码上并没有出现url,那么GWT的客户端如何得知要访问哪个servlet?答案就在同步interface的annotation中,看蓝色字体表示的单词就明白了。