浏览 2732 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-04
摘要: 前边已经有了两篇文章,用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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |