GWT介绍
以开发应用程序的方式开发Web2.0程序。

AJAX的概念已经流行了很长时间了,目前比较成功的,“如雷贯耳”的AJAX应用有Google Earth,Gmail等。GWT全称Google Web Toolkit。是Google开发的AJAX开发框架,目前已全部开源。(本文基于GWT提供的开发指南(Developer Guide),所采用的图片,例子均出自GWT,可以认为是GWT的学习笔记J)
GWT的核心是通过一个编译器(compiler)把Java代码翻译为JavaScript代码,开发期间,用户以类似开发AWT或SWING应用程序的方式实现所需要的功能,然后通过GWT的编译器可以把您的应用程序翻译为功能相同的Web2.0程序。而且生成的Web2.0程序可以在大部分主流浏览器上运行,如:Internet Explorer, Firefox, Safari。
基本概念
Hosted Mode:当您利用Java IDE编辑,调试,运行应用程序时,处于Hosted Mode。此时应用程序未翻译为Javascript,而是以字节码(bytecode)形式运行在JVM中。GWT提供一个内嵌
的浏览窗口(browser window)运行应用。您可以采用传统的“编码-测试-调试-修改-……”的方式进行开发。
Web Mode:在Host Mode模式下运行正确的应用,可以通过GWT编译器将Java代码翻译为Javascript代码,发布到Web服务器,以浏览器访问,此时您的应用称为处于Web Mode,而不再依赖于JVM或任何浏览器插件(plug-in)来运行。
Host Page:任何HTML页面,都可以包含GWT生成的代码,称为Host Page。
ajax实例 文件浏览Client-side Code:Javascript代码在客户的浏览器中运行,称为Client-side Processing。GWT应用中部分Java代码将会最终翻译为Javascript,这部分代码称为Client-side Code。
Server-side Code:任何发生Web服务器内部的处理称为Server-side Processing。客户短通过RPC(Remote procedure call)向服务器发起请求,Server-side Code接收请求并处理。
模块(Modules)      模块是GWT中最重要的概念。可以理解为功能模块,即一个模块实现某一特定功能,如:邮件模块可以收,发,阅读邮件等。
      模块配置文件以XML文件的格式定义,文件名后缀通常为:l。主要属性如下:
入口点类(Entry-Point Classes)      模块的入口点类需要实现EntryPoint接口,并且入口点类需要有一个无参数的构造函数。当模块加载时,实例化入口点类,onModuleLoad()方法将会被调用。我们通常在这时构造用户界面。可以指定多个入口点类。
源路径(Source Path)      指定Client-side Code所在的路径,默认为client。
公共路径(Public Path)      指定公共资源所在的路径,默认为public。
继承(inherits)      指定要继承其属性的模块。可以指定继承多个模块。
      通常以逻辑名字引用模块。如:~/src/com/example/cal/l。其逻辑名字为ample.cal.Calendar。
      在页面中,通过指定名为gwt:module的meta属性来将页面与模块绑定,如:
<meta name="gwt:module" c>
GWT编译器在处理时,需要指定模块的逻辑名字,通过逻辑名字在当前路径下寻配置文件,继而确定Client-side Code位置,以及公共资源位置。如:
@java -cp "%~dp0\src;%~dp0\bin;%~dp0\../../gwt-user.jar;%~dp0\../../gwt-dev-windows.jar" le.gwt.dev.GWTCompiler -out "%~dp0\www" %* ample.cal.Calendar
其中:%~dp0表示当前路径。ample.cal.Calendar为模块逻辑名字。编译器将在~/src/
com/example/cal/路径下寻l文件。如果该文件采用默认配置,则会将~/src/com/example/cal/client目录下的Java代码翻译为Javascript代码并保存置~/www/ ample.cal目录下,~/src/com/example/cal/public下的文件则会全部拷贝到~/www/ ample.cal目录下。
GWT项目结构      假设要开发的Web2.0应用名称为ample.call。则推荐的目录结构如下:

目录路径

存放内容

com/example/cal/
模块配置文件(module XML files)

com/example/cal/client/
客户端代码(Client-side Code)

com/example/cal/server/
服务端代码(Server-side Code),如RPC服务的实现代码

com/example/cal/public/
静态文件,如:Html页面,图片,Css文件,脚本文件等

GWT提供的命令行工具      为方便开发GWT应用,提供了几个命令行工具。
ProjectCreator
构造一个初始的Eclipse项目,并可选生成Ant编译文件

ApplicationCreator
构造一个出生的GWT应用,包含编译命令,已经启动命令


JunitCreator
生成Junit测试代码

I18nCreator
生成国际化处理脚本及属性文件

构造用户界面
GWT用户界面开发类似于目前流行的UI框架,如:Awt,SWING。可以用GWT提供的DOM接口来处理浏览器的DOM树,也可以用GWT提供的Widget树来构造界面,通常来讲后者要简单很多。GWT通过组合Widgets和Panels来构造界面。界面风格用标准的CSS进行定义。
Widgets是单独可复用的界面组件,如按钮(Button),树(Tree),菜单(Menu,MenuItem),文字输入框(TextBox)。
Button



RadioButton


TextArea


MenuBar


Tree
Panels则是用来摆放Widgets的容器,GWT提供了多种Panel。其中RootPanel是每个GWT应用都需要用到的,它是整个UI树的根节点,可通过()方法获取。默认的RootPanel与HTML页面的Body对应。其他常用的Panel主要有:
HorizontalPanel



VerticalPanel


FlowPanel


StackPanel


DockPanel


TabPanel



更多的Widgets和Panels请参考GWT提供的API。
和AWT,SWING类似,GWT应用也采用事件-监听者(Events-Listeners)方式进行交互。Widgets发布不同的事件,通过绑定相应的监听者类对事件进行处理。熟悉Java开发或.Net开发的可以很容易理解这一点。
如果觉得GWT提供的组件不满足要求,也可以开发自定义的组件,主要有三种方法开发自定义组件:
1.
继承Composite类,在其中组合需要的Widget
2.
参考GWT提供的Widget实现,从头开始开发
3.
利用JavaScript
通常建议用第一种方法开发自定义组件。GWT所附带的例子程序中有自定义开发组件的例子。
RPC – Remote Procedure Call
GWT应用与传统的HTML Web应用最基本的区别是:GWT应用执行请求时不需要获取整个页面数据,就像运行在浏览器中的一个应用程序,GWT应用可以部分更新用户界面,一个好的GWT应用可以把大部分用户界面逻辑处理放在客户端执行,只在需要业务数据时与服务器交互,获取合适的数据。显而易见,这种方式可以大大节省通讯流量,提高应用性能,降低Web服务器缚在,改善用户体验。这种客户端与服务器的交互,称为RPC。服务端提供给客户端调用的功能称为服务(Service)。要注意,这里的服务与常说的Web Service完全是两个概念。也许大家能够猜到GWT应用底层是如何实现RPC的,核心就是XMLHttp,一个比较古老的东东,借助与GWT框架,发挥出了强大的能量。
     

上图为要实现一个Service所要做的工作。
在Client-side Code 声明两个接口:YourService和YourServiceAsync。即一个同步接口和一个异步接口。要求同步接口声明继承le.gwt.user.client.RemoteService接口,异步接口所声明的方法必须与同步接口声明的方法具有相同的名称,返回类型一定为void,且参
数比同步方法的参数多一个AsyncCallback对象,异步接口的名字为同步接口名+Async。
假设我们声明一个同步接口:ample.foo.client.FooService如下:
public
interface FooService extends RemoteService
{

ReturnType fooMethod(ParamType1 start, ParamType2 end,……);

}
则异步接口要声明为:
public
interface FooServiceAsync
{
void fooMethod(ParamType1 start, ParamType2 end,……, AsyncCallback callback);

}
在Server-side Code实现具体的处理类:YourServiceImpl。该类需要具体实现上述同步接口声明的方法,同时要继承RemoteServiceServlet类,该类继承自HttpServlet,即所实现的具体处理类实际上为一个标准的Servlet,在产品发布到应用服务器时,要在l文件中对该Servlet进行配置。在开发过程中,可以利用GWT提供的嵌入Tomcat环境,通过在模块配置文件中配置<servlet>标签来对RPC服务进行测试。
从客户端发起RPC调用的过程如下:
1.
通过GWT.Create()方法获取服务接口
2.
通过ServiceDefTarget类指定服务入口地址(Service entry poin URL)
3.
构造一个AsyncCallback类
4.
传人上面的AsyncCallback类,调用服务接口方法
假设服务接口定义为:
public interface MyEmailService extends RemoteService
{
void emptyMyInbox(String username, String password);
}
则对应的异步接口定义为:
public interface MyEmailServiceAsync
{
void emptyMyInbox(String username, String password,
AsyncCallback callback);
}
客户端调用过程如下:
……
//1。获取服务接口代理类
MyEmailServiceAsync emailService = (MyEmailServiceAsync) ate(MyEmailService.class);
//2。指定服务入口地址
ServiceDefTarget endpoint = (ServiceDefTarget) emailService;
String moduleRelativeURL = ModuleBaseURL() + "email";
endpoint.setServiceEntryPoint(moduleRelativeURL);
//3。构造AsyncCallback类
AsyncCallback callback = new AsyncCallback() {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。