Google Web Toolkit例程探讨续.

书接上回. 我们该来探讨Ajax的精髓了. 也就是gwt中Java的rpc来实现的.

我们先来看看sendNameToServer()这个方法.

private void sendNameToServer() {
sendButton.setEnabled(false);
String textToServer = nameField.getText();
textToServerLabel.setText(textToServer);
serverResponseLabel.setText("");
greetingService.greetServer(textToServer,
new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
// Show the RPC error message to the user
dialogBox
.setText("Remote Procedure Call - Failure");
serverResponseLabel
.addStyleName("serverResponseLabelError");
serverResponseLabel.setHTML(SERVER_ERROR);
dialogBox.center();
closeButton.setFocus(true);
}

public void onSuccess(String result) {
dialogBox.setText("Remote Procedure Call");
serverResponseLabel
.removeStyleName("serverResponseLabelError");
serverResponseLabel.setHTML(result);
dialogBox.center();
closeButton.setFocus(true);
}
});
}

这可是精髓. 当然那些gui方面的东西我就不分析了. 像类似于sendButton.setEnabled(false);这些的. 我们直接到最要害的地方.
greetingService.greetServer(textToServer,
new AsyncCallback<String>()

突然冒出来一个greetingService 我们找找他的定义在哪?

private final GreetingServiceAsync greetingService = GWT
.create(GreetingService.class);


在这里. 是由GWT.creat()创建的. 我们查查api . 翻看doc文档.
[quote]static <T> T
create(java.lang.Class<?> classLiteral)
Instantiates a class via deferred binding. [/quote]
这个方法就是一个 实例化方法. 然后返回相应的实例. 里面的参数 这里我不禁要问. GreetingServiceAsync 怎么能跟GreetingService.class匹配上? .怎么就不报错?

我们来翻看一下这两个接口的代码.
public interface GreetingService extends RemoteService {
String greetServer(String name);
}

RemoteService是一个标记接口. 只要是rpc的接口都应该继承他.由于是marker接口.所以没有实际的方法. 所以内部自然是我们的方法.
public interface GreetingServiceAsync {
void greetServer(String input, AsyncCallback<String> callback);
}

而仔细观察这两个接口的命名 .我们会发现下面的多了Async..其实这两个是有很大关系的.并不是没有关系.
[quote]As an example, suppose the service interface defines a method called getShapes as follows:

Shape[] getShapes(String databaseName) throws ShapeException, DbException;

Its asynchronous counterpart method be declared as:
void getShapes(String databaseName, AsyncCallback<Shape[]> callback);[/quote]
这就是异步版的代码跟同步版的区别. 多了一个AsyncCallback.而这个东东. 就是就是用来接收异步传过来的数据的.如果接受成功了. 就会调用其中的onSuccess()方法. 而失败了.则会调用onFailure方法. 就是这么个意思.

既然你在程序里面
greetingService.greetServer(textToServer,
new AsyncCallback<String>()

greetServer 方法在哪里? 之前我们看到的都是interface . 除了我们本身的Blog.java其他都是接口.在我们图的下方. 有一个GreetingServiceImpl的class. 他实现了我们的GreetingService接口. 然后他还继承了一个class.名叫RemoteServiceServlet.这个class是做什么用的? 其实这就是用于从clinet自动的反序列化(逆序列化)前面的请求. 然后再序列化给response给client.. 这一切都成功了 AsyncCallback就会找succes . 失败则亦然 .

现在回头看看我们的例程. 右键run as web app 一下. 是否他的调用过程烂熟于心了? :D 随后带大家继续深入 Google web Toolkit . ps:当然是在有时间的情况下.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值