`
Saito
  • 浏览: 43846 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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文档.
引用
static <T> T
create(java.lang.Class<?> classLiteral)
          Instantiates a class via deferred binding.

这个方法就是一个 实例化方法. 然后返回相应的实例. 里面的参数 这里我不禁要问. 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..其实这两个是有很大关系的.并不是没有关系.
引用
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);

这就是异步版的代码跟同步版的区别. 多了一个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 一下. 是否他的调用过程烂熟于心了?    随后带大家继续深入 Google web Toolkit . ps:当然是在有时间的情况下.
3
0
分享到:
评论
1 楼 wang_scu 2009-06-28  
   逛贴发现你的评语,顺便过来顶

   正好我们公司用的也是gwt 不过为了避免每次都写一大堆配置,我们采用了command模式,用一个GWT RPC服务派发所有请求,这样且便于管理,发现google io上有一张ppt将的也是这个,有机会可以研究一下,写个中文翻译就好了。
   英雄所见略同

http://code.google.com/intl/zh-CN/events/io/sessions/GoogleWavePoweredByGWT.html

相关推荐

Global site tag (gtag.js) - Google Analytics