书接上回. 我们该来探讨Ajax的精髓了. 也就是gwt中Java的rpc来实现的.
我们先来看看sendNameToServer()这个方法.
这可是精髓. 当然那些gui方面的东西我就不分析了. 像类似于sendButton.setEnabled(false);这些的. 我们直接到最要害的地方.
突然冒出来一个greetingService 我们找找他的定义在哪?
在这里. 是由GWT.creat()创建的. 我们查查api . 翻看doc文档.
[quote]static <T> T
create(java.lang.Class<?> classLiteral)
Instantiates a class via deferred binding. [/quote]
这个方法就是一个 实例化方法. 然后返回相应的实例. 里面的参数 这里我不禁要问. GreetingServiceAsync 怎么能跟GreetingService.class匹配上? .怎么就不报错?
我们来翻看一下这两个接口的代码.
RemoteService是一个标记接口. 只要是rpc的接口都应该继承他.由于是marker接口.所以没有实际的方法. 所以内部自然是我们的方法.
而仔细观察这两个接口的命名 .我们会发现下面的多了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方法. 就是这么个意思.
既然你在程序里面
greetServer 方法在哪里? 之前我们看到的都是interface . 除了我们本身的Blog.java其他都是接口.在我们图的下方. 有一个GreetingServiceImpl的class. 他实现了我们的GreetingService接口. 然后他还继承了一个class.名叫RemoteServiceServlet.这个class是做什么用的? 其实这就是用于从clinet自动的反序列化(逆序列化)前面的请求. 然后再序列化给response给client.. 这一切都成功了 AsyncCallback就会找succes . 失败则亦然 .
现在回头看看我们的例程. 右键run as web app 一下. 是否他的调用过程烂熟于心了? :D 随后带大家继续深入 Google web Toolkit . ps:当然是在有时间的情况下.
我们先来看看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:当然是在有时间的情况下.