用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-INF\web.xml:

添加



GetTimeServcie

org.jmg.server.GetTimeServiceImpl





GetTimeServcie

/timeService



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用编译客户端代码(注意,这里只是编译客户端代码),会在www\org.jmg.GetTime
目录生成客户端所合适的html和js,复制www\org.jmg.GetTime下所有的文件到tomcat应用的webapps\gwt\
gettime目录下。

b.复制elipse编译输出目录下的类到tomcat应用webapps\gwt\WEB-INF\classes目录。

c.检查web.xml文件是否已经复制,或是已经修改。

部署完成。

6、运行测试:

启动tomcat

访问http://localhost:8080/gwt/gettime/GetTime.html

点击click me 按钮,显示服务器时间






参考: Google Web Toolkit

Remote Procedure Calls

来自:http://letup.blogspot.com/2006/09/gwtgooglewebtoolkitajax-gettime.html

你可能感兴趣的:(GWT,Ajax,应用服务器,Google,Web)