2007年5月9日星期三

用GWT(GoogleWebToolkit)开发Ajax-GetTime

摘要: 前边已经有了两篇文章, 用GWT(Google Web Toolkit)开发Ajax-HelloWorld,用GWT(Google Web Toolkit)开发Ajax-你好,前边两个例子,都是只用了客户端的代码,并没有客户端和服务器端的交互过程。本文将会介绍一个简单的客户-服务器交互过程。客户端一样会显示一个按钮,点击的时候会返回服务器时间。并一同介绍一下简单的调试过程。
关键字: GWT Google Web Toolkit Ajax 入门应用 rpc调用 RemoteService RemoteServiceServlet

介绍

GWT(GoogleWebToolkit)是一个由Google开发提供的Java Ajax开发框架,已经用于开发GoogleMaps,GMail等应用了,它帮助开发者从各个不同的浏览器的诡异中解脱出来。现在写一个动态的Ajax 应用是一个令人郁闷,有严重错误倾向的过程,可能要花上90%的时间来处理那些敏感的,易错的浏览器之间的兼容性和跨平台,并且javascript的难 以调试性更加增加了整个开发过程的难度,和应用的健壮性。
GWT可以让你提供同样的即时的,有良好用户体验的应用的时候,避免很多这样令人头痛的事情。开发者可以用java语言来写界面,然后GWT提供的编译器会把他们编译成javascript和HTML。
假如说前面的两个例子,只是一个依样画葫芦的,从今天开始,就需要更多地去考虑一些Ajax的模式和GWT提供的便利的背后的原理。
GWT应用和传统的HTML页面应用的根本的区别就是,GWT在执行过程不需要获取新的页面来更新信息。尽管如此,向所有的客户端/服务端应用程序一样, GWT应用也要在执行过程,不断地才服务器取得数据,这种由一种叫RPC(远端过程调用)的机制来实现,也有时叫做服务端调用。GWT让这个RPC过程可 以直接引用一些Java对象来实现。(注:这里是只是一些,并不是所有的)。
恰当的利用好这个特性可以提供应用的效率,减少客户端服务器端的数据交换,更能提供友好的用户体验。
这些服务器端的代码,或是操作,被称为一个service,这个不同于SOAP(简单对象访问协议)中的Web Service。这是一个需要区别的概念。
本文将会介绍一个简单的客户-服务器交互过程。客户端一样会显示一个按钮,点击的时候会返回服务器时间。并一同介绍一下简单的调试过程。

实现过程

1、如用GWT(Google Web Toolkit)开发Ajax-HelloWorld创建应用。
应用名为org.jmg.client.GetTime
2、创建Service

创建两个接口和一个实现:
interface:org.jmg.client.GetTimeService extends RemoteService
interface:org.jmg.client.GetTimeServiceAsync
class:org.jmg.server.GetTimeServiceImpl extends RemoteServiceServlet implements RemoteServcie
在接口GetService中添加 String getTime()方法。
GetTimeServiceAsync中添加 void getTime(AsyncCallback callback)方法。
在类GetTimeServiceImpl中实现获取时间的方法:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
注意:
a.GetTimeService 必须扩展RemoteService这个标志接口
b.GetTimeServiceAsync 的命名规则,只能在GetTimeService 后边添加 Async
c.GetTimeServiceAsync 的 getTime 这个方法不能有返回值,实际上,这个接口的所有的方法都不能有返回值,只能void。这里的原因会在以后的慢慢解释。
d.GetTimeServiceImpl 必须继承 RemoteServiceServlet
e.GetTimeServiceAsync 不需要实现,GWT会在编译的时候帮你实现。 f.以上的三个类的包都不能修改

3、修改部署文件:
修改WEB-INFweb.xml:
添加
<servlet>
<servlet-name>GetTimeServcie</servlet-name>
<servlet-class>org.jmg.server.GetTimeServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetTimeServcie</servlet-name>
<url-pattern>/timeService</url-pattern>
</servlet-mapping>
GetTimeServiceImpl继承了RemoteServiceServlet(这个类扩展java的HttpServlet),它将需要部署成一个servlet。

4、修改GetTime
和前面的两个例子一样,默认创建的应用的GetTime中按钮的动作就是在页面上显示"hello world"。现在我们需要改变这个按钮的点击时候行为,要把从服务器获取时间显示出来。
a.找到我们定义的timeServcie的Servlet。 在GetTime中添加一个方法:initiailizeServiceEntryPoint
private final GetTimeServiceAsync initiailizeServiceEntryPoint() {
GetTimeServiceAsync timeService = (GetTimeServiceAsync) GWT.create(GetTimeService.class);(注意,这里create参数是GetTimeService.class,但是返回的实例是一个GetTimeServiceAsync)
ServiceDefTarget target = (ServiceDefTarget) timeService;(这里又把timeService,强换型成ServiceDefTarget)
String staticResponseURL = GWT.getModuleBaseURL();(取得应用的基路径,这个可能会导致之不到servlet,只要把它改成应用的路径,例如/gwt/)
staticResponseURL += "/timeService";
target.setServiceEntryPoint(staticResponseURL);(把刚刚定义的servlet的path和应用基路径两者组合,得到最后的servlet路径)
return timeService;
}
一直都保持这么一个概念,所有client中的代码都GWT都会编译成合适js,HTML,都会在客户端执行。会对整个过程的理解有很好的帮助。
b.修改onModuleLoad:
public void onModuleLoad() {
final Button button = new Button("Click me");
final Label label = new Label();
final GetTimeServiceAsync gtsa = initiailizeServiceEntryPoint();
button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
gtsa.getTime(new AsyncCallback() {
public void onFailure(Throwable caught) {
label.setText(caught.getLocalizedMessage());(调用失败的时候,把错误信息显示出来)
}
public void onSuccess(Object result) {
label.setText((String) result);(这里为什么可以强换型到String?这里的值就是GetTimeService.getTime()方法的返回值)
);
}
});

5、编译与部署:
a.老习惯,用GetTime-compile.cmd用编译客户端代码(注意,这里只是编译客户端代码),会在wwworg.jmg.GetTime 目录生成客户端所合适的html和js,复制wwworg.jmg.GetTime下所有的文件到tomcat应用的webappsgwt gettime目录下。
b.复制elipse编译输出目录下的类到tomcat应用webappsgwtWEB-INFclasses目录。
c.检查web.xml文件是否已经复制,或是已经修改。
部署完成。
6、运行测试:
启动tomcat
访问http://localhost:8080/gwt/gettime/GetTime.html
点击click me 按钮,显示服务器时间


参考: Google Web Toolkit

Remote Procedure Calls
更多文章: 用GWT(GoogleWebToolkit)开发Ajax-HelloWorld

用GWT(GoogleWebToolkit)开发Ajax-你好,世界

没有评论: