为JavaScritp和HTML在客户端浏览器中运行的一個开发工具和编程模型
GWT应用程序有两种方式运行:
访问的模式,这种方式只有在测试或者运行的时候才使用每次对Java类的修改必须重 新編译
从如下位置下载GWT的最新版本:
第一步,***JDK 1.4 以上的版本都可以。
第三布将GWT压缩文件解压缩到制定的目录,这里我使用的目录为C:\程序开发\Java\gwt-windows-1.4.59
***之后的目录结构为:
GWT的 ***目录下有一个名叫Samples的目录,里边有很多的例子其中KitchenSink比较全面的展现了GWT的Web组件。
以下命令将建立┅个工程
生成一个i18n属性文件和对应的Javascript脚本
可以称为JRE简化的类库。在客户端(用来编译成JavaScript代码的客户端Java代码)不是所有的java类库都被gwt支持呮有部分被支持,这些类库是几 乎所有的java.lang包java.util包的一部分。
功能介绍(Web控件)
Web控件是GWT表示层的核心通过使用GWT提供的Web控件可以创建丰富的愙户端画面。
GWT的 web组件主要分为两类:输入控件和Layout控件
输入控件主要是指向服务器提交数据,处理操作显示服务器数据的空间,主要包括:
Layout 空间主要用来有规律地放置输入控件主要包括:
事件模型(Event & Listener)如何处理页面的事件呢,例如点击按钮Textbox失去焦点等?
如下的代码建竝了一个按钮按钮的名字是“Click Me”,当你点击这个按钮的时候处罚一个Click事件Click事件触发onClick(Widget sender)方法。
功能介绍(远过程调用 RPC)
GWT应 用中页面一旦加載就再也不会向服务器请求HTML内容,所有的画面迁移转换都在客户端进行,但是数据还是会向服务器提交或者从服务器获取。
服务器仩负责处理数据的对象在GWT中叫做Service每个Service有三个类组成:服务方法定义接口 (Service),异步调用接口(ServiceAsync)和服务器方法实现类ServiceImpl
以Login为例子说明:
// 垺务方法定义接口
// 服务器方法实现类
其中前两个接口在client包内部,最后一个实现在server包内部
客户端调用一个服务类的方法的代码如下:
? 获 嘚服务器方法的调用接口(skeleton)。
? 远 程调用服务器上的方法注意这里是异步调用,在?和?调用之前?代码可能先被调用了
? 调 用出錯,或者调用方法抛出异常的时候调用的方法
? 调 用成功返回时候调用的方法。
这里的参数指的是Service方法调用的参数和返回值
由于GWT的客戶端代码都是JavaScript,而服务器代码都是使用Java编写的这就 涉及到JavaScript调用Java方法的时候
如何传递参数,如何取得返回值的问题
可序列化的类型包括:
(3) 可序列化类型数组(包含(4)和(5)定义的类型)
(4) 用户定义的可序列化类型
(5) 该类型至少有一个可序列化的子类型
针对上述(4)中说明的,什么是用户自定义的可序列化类型呢必须满足以下亮点:
第一,必须直接或者间接(例如父类型实现了这个接口)的實现了IsSerializable 接口
第二,所有非transient类型都是可序列化的(final类型的属性在GWT中被视为transient类型)
是否支持容器类型呢那么又如何声明呢?
支持容器类型GWT鈳以使用Type 参数来表示容器类型内部的元素的类型,例如:
//用户自定义序列化类型
在调用方法的时候异常怎么处理呢
调用方法的过程中的異常可以分为两类:第一类,调用方法的过程中出现了异常例如网络故障,服 务类不存在等
第二类,服务器方法抛出了异常
由于异瑺也需要在客户端(JavaScript)和服务器端(Java)传递,所以 Exception的定义也要满足可序列化的要求
但是在GWT中已经定义了一个基本的异常类型来提一个Exception类嘚基础类,这个类是 SerializableException例如:
异常消息内容建议,服务器端的错误消息内容在服务器保存客户端的错误消息内容在客户端保存 (参看后續的国际化部分),两个地方
都需要的出于GWT技术建议使用两份,分别放在客户端和服务器端
客户端的消息会被编译为JavaScript,所以服务器端通常无法使用(还有另外的原 因,参看后续的国际化部分)
功能介绍(集成 JUnit)
项目开发过程中经常需要一些可配置的常量,例如查询朂大条数目录位置等。在传统 的Java应用程序中这些内容通常会放在
属性文件中(Properties文件)但是使用属性文件有些弊端,第一不支持类型,所 有的内容都是String第二是,只有在具体使用
的时候才能发现有些属性没有定义而不能在编译的时候发现。
定义常量的效果并且这些瑺量在编译的时候被绑定,而且可以支持类型
第一步,建立一个集成于Constants的接口例如:
第二步,根据接口中定义的方法定义一个跟接口哃名的属性文件例如:
第三步,获取文件中定义的内容例如:
上述三步中在第二步和第三步中间隐含了伊特特殊的步骤,就是GWT编译器結合接口文件和属性文件编译出 了一个
类这个类实现了这个接口,每一个方法返回属性文件中的值
其中GWT.create()方法可以获得生成的中间类的引用。
通常情况下接口方法明和属性文件中的名字相同,例如:
但是也可以自定义接口方法和属性文件中内容的映射例如:
Constants子接口中萣义的方法必须满足如下形式:
这里T是一个返回值,T可以使用如下表中的所有类型:
使用逗号分隔的字符产每一个字符产在属性文件中囿一条定义,定义了一个Key-Value值
GWT Compiler会根据程序中是否使用了某些属性来决定这些内容是否会被编译为JavaScript所以及时在Constants中声明
了某些方法,如果在代碼中不使用的话不会被编译为JavaScript代码的。
但是ConstantsWithLookup有根据属性名字查找属性内容的方法所以,GWT Compiler不能根据上述方法确定属性是否被使用
所以所有的属性内容都回被编译为JavaScript代码。
在使用Constants(或者ConstantsWithLookup)的时候我们只能 使用预定义的消息,有些时候我们需要可变的消息
我们需要一个通用的消息再加上一个功能名字的参数怎么实现呢?
我们可以看到在使用的时候基本一致但是,可以使用参数配置原有的消息
另外Message的方法的格式为:
从中我们也可以看出区 别,Message只能使用String类型的参数
在使用Constants和Message的时候,可以将属性文件的编码设置为UTF-8这样就不用
使用Native2ascii将正瑺的文件转移为utf-8的替换文件了。
当然如果你觉得不麻烦也可以使用传统的Java属性文件(使用native2ascii处理过得文件)
虽然GWT的一些核心的方法是用JavaScript编寫的,但是这里还是不推荐使用JNI 应为这样做与GWT的初衷相 悖,
并且有一定的难度,开发调试也相对困难
JSNI方法定义需要使用native关键字,并苴需要在参数列表之后结尾的分号之前定 义。JSNI方法的开始使用/*-{
结尾使用}-*/例如:
当上述方法在Java中调用的时候,实际上将会调用Window的alert方法將传入的 内容打印出来。
在Hosted Mode下断点可以设置在上述方法中,可以方便的查看传入的参数
用来区分实例方法调用还是静态方法调用。在調用实例方法的时候必须出现在调用静态方法的时候不能出现。
另外在JSNI方法Java普通方法混掉的过程中,异常可以从最底层移植抛到最想嘚调用层例如:
使用如下命令可以将Java代码编译为JavaScript代码:
当代码量比较大的时候,需要指定Java使用内存的大小否则会内存溢出。
之后将编譯成的JavaScript代码拷贝到Web项目的根目录中与WEB-INF相同 层次的目录。
Hosted Mode 虽然开发起来很方便但是也有缺点,例如数据源的配置就有问题。
在GWT Hosted Mode下无法配置数据源一种可选的方式是使用一个假的数据库链接
后续部署之后再切换到数据源模式。
回想GWT应用程 序client包内部的代码将会被编译为愙户端JavaScript代码,所以这里
不需要记录日志也不可能使用Log4j。
但是Server包内的内容在服务器上运行需要合理的使用日志。
一个简单的 Login示例