0;height:
0;border:
0">
这个结构是可以向现存的WEB应用程序添加功能而把改动最小化。
客户端代码
“客户端”意思是指将要被转换并在WEB浏览器中以JAVASCRIPT形式运行的原代码。
你的应用程序将要被通过网络送向客户,在那里它作为JAVASCRIPT运行在WEB浏览器中。
用户浏览器中所发生的一切,可以看作是客户端处理。
当你写在WEB浏览器中运行的客户端代码时,记住它们最终要变成JAVASCRIPT。
所以,要使用那些可以被转换的类库和JAVA语言结构是非常重要的。
服务端代码
“服务端”意思是指不会被转换,并且只作为字节码运行在服务器端的原代码。
发生在服务器端的一切可以被看作是服务器端处理。
当你的应用程序需要与服务器互动(例如,上载或下载数据),这会产生一个穿过网络的客户端请求(从浏览器)使用remoteprocedurecall(RPC)。
在进行处理时RPC,服务器要执行服务端代码。
小提示:
GWT不会去管你的服务器运行JAVA字节码的能力。
服务端代码不需要被转换,所以你可以使用你认为有用的任何JAVA类库。
项目结构
GWT项目由一个推荐包布局构建而成。
GWT项目以JAVA包的方式进行布局,这样,大多数的配置可以从类路径(classpath)和你的模块定义(moduledefinitions)中推导出。
如果你要从代码片断开始一个GWT项目,你应该使用标准GWT包结构,这种结构可以很容易地区分客户端代码和服务端代码。
例如:
假定你的新项目叫“Calendar”。
则标准包结构会如下所示:
包
目的
com/example/cal/
项目根包,包含模块XML文件
com/example/cal/client/
客户端代码文件和子包
com/example/cal/server/
服务端代码和子包
com/example/cal/public/
静态资源
例子文件组织如下:
文件
目的
com/example/cal/Calendar.gwt.xml
一个通用基本模块,用于你的项目,它继承了com.google.gwt.user.User模块
com/example/cal/CalendarApp.gwt.xml
继承了com.example.cal.Calendar模块(见上)并且加入一个入口类
com/example/cal/CalendarTest.gwt.xml
一个你的项目定义的模块
com/example/cal/client/CalendarApp.java
客户端JAVA原代码,用于入口类。
com/example/cal/client/spelling/SpellingService.java
一个定义在子包中的RPC服务接口
com/example/cal/server/spelling/SpellingServiceImpl.java
服务端JAVA原代码,它实现了后台服务业务逻辑。
com/example/cal/public/Calendar.html
一个HTML页面,用于装载应用程序。
com/example/cal/public/Calendar.css
一个样式表,用于风格化应用程序。
com/example/cal/public/images/logo.gif
一个题头标志
模块
模块是一个XML文件,它包含与应用程序或类库相关的设置。
一个GWT配置的单独单元,是XML格式的文件。
包括所有的你的GWT项目需要的配置信息,即下列信息:
●继承模块
●一个入口点应用类名;这些是可选的,虽然任何关系到HTML的模块都必须至少有一个指定的入口类。
●原代码路径
●公共路径
●延期绑定规则,包括属性提供者和类生成器。
模块(Modules)可以出现在你的类路径的任何包里,但是强力推荐它应该出现在标准项目布局的根包里。
入口类
一个模块入口是任何实现EntryPoint接口的类,并且可以被无参数构造实例。
当装载一个模块时,每个入口类被实例化,并且它们的EntryPoint.onModuleLoad()方法被调用。
原代码路径
模块能够指定哪个子包包含可转换原代码,方法是把命名包和它的子包被加入原代码路径。
只有在建立在原代码路径上的文件才可能被转换成JAVASCRIPT,客户端代码和服务端代码也可以无冲突地混合在同一个类路径中。
当模块继承其他模块,它们的原代码路径被绑定,这样每个模块将会能够访问到它需要的可转换原代码。
公共路径
模块能够指定哪个子包是公共的,方法是命名包和它的子包被加入到公共路径。
当你把你的应用程序编译成JAVASCRIPT时,在公共路径中能找到的所有的文件都被复制到模块的输出目录。
净效果是用户可见的URLs不需要包含一个完整的包名。
当模块继承其他模块时,它们的公共路径会合并,这样每个模块都可以访问它所需要的静态资源。
特殊规范
●模块XML格式
在XML文件中定义模块,并且置入你的项目包层级。
模块定义在XML文件中,它的文件名扩展是.gwt.xml。
模块XML文件应当位于你的项目的根包
如果你正在使用标准项目结构,你的模块XML可以像以下这样简单:
●装载模块
在JAVA类路径中发现的模块XML文件,被它们的逻辑模块引用,从主页用名字引入,也被其他模块引入。
模块总是关联到它们的逻辑名。
模块的逻辑名遵守这种形式pkg1.pkg2.ModuleName且不包括实际文件系统路径和文件扩展名。
例如:
模块XML文件的逻辑名位于:
~/src/com/example/cal/Calendar.gwt.xml
是
com.example.cal.Calendar
●可用元素
从指定的模块继承所有的设置,就像被继承的模块的XML被逐字复制。
一些模块可被用这种方式继承。
指定的入口点类。
一些入口类能够被从被继承模块加入、包含。
通过绑定包向原代码路径加入包,在包中,模块XML可以在特定的子包路径中找到。
任何出现在这个子包下的JAVA原代码文件,或任何下层子包内,假定都是需要被转换的。
如果在模块XML文件中没有定义
这个默认设置帮助保持模块XML使用标准项目结构。
通过绑定包向公共路径中加入包,在绑定包中,模块XML将会在指定路径中被发现来指定
为了RPC测试的方便性,这个元素装载一个SERVLET类,它应用到指定的URL路径。
这个URL路径应该是绝对路径,并且符合目录形式(例如:
/spellcheck)。
你的客户端代码指定这个URL映射到一个调用ServiceDefTarget.setServiceEntryPoint(String)。
一些SERVLET可以用这种方式装载,包括那些从继承模块里来的。
scriptready-functionbody
自动注入外部的JAVASCRIPT文件,这个文件位于src指定的位置。
scriptready-functionbody是一个JAVASCRIPT函数体,当这个脚本已知被初始化时,它返回true
自动注入外部的CSS文件,这个文件位于src指定的位置。
为一个已存在的客户属性值集合进行扩展。
一些值可以用这种方式添加,并且客户属性值通过继承模块进行累积。
你可能只是发现它对于“在国际化中指定本地”(specifyinglocalesininternationalization)有用
●自动资源注入
模块组(Modules)能够包含到外部JAVASCRIPT和CSS的引用,方法是当模块自身装载时,它们也被自动装载。
模块可以包含到外部JAVASCRIPT和CSS文件的引用,方法是当模块自我加载时自动加载。
●注入外部JAVASCRIPT
对于在你的模块自动地关联外部JAVASCRIPT文件,脚本注入是一个方便的方法。
脚本注入使用下面的语法:
[CDATA[
scriptready-functionbody
]]>
“ready-functionbody”部分是JAVASCRIPT函数主体部分,当脚本被装载并可用后,它返回true。
脚本被装载进主页(hostpage)的名字空间(namespace),其作用与你显式地使用HTML
可用-函数(ready-function)的目的就是明确地指出脚本已被完全装载,这样,你的GWT代码就能够使用JSNI,并且可以确定被引用的标识符是可用的。
在上面的例子中,函数bar的存在就说明了脚本已经就绪了。
●注入外部的样式表
样式表注入是把外部的CSS文件自动关联到你的模块的一个便捷方式。
使用如下语法可以把CSS文件自动附加到你的主页(hostpage)上。
你能够用这种方式加入一些样式表,包含入页面时的顺序就是元素在你的模块XML文件中出现的顺序。
●注入和模块继承
模块继承使资源注入更加方便。
如果你想要创建一个可重用类库,这个库依赖特定的样式表的JAVASCRIPT文件,你可以确定你的类库的客户可以用从模块继承的方式自动得到所需之物。
●过滤公共包
在你的公共路径中滤进或滤出文件,以避免无意地发布文件。
元素不支持完全的FileSet语义。
当前只有下列属性和嵌套元素被支持:
⏹includes属性
⏹excludes属性
⏹defaultexcludes属性
⏹casesensitive属性
⏹嵌套标志include
⏹嵌套标志exclude
其他属性和嵌套元素不被支持
重要注意事项
Defaultexcludes的默认值是true。
命令行工具
开始开发时需要的一些有用的命令行工具。
GWT只有很少的几个命令行工具。
它们也可以用于向现存项目加入新的东西。
例如,projectCreator可以用于使一个Eclipse项目符合GWT的规范。
●projectCreator
生成基本的项目骨架。
一个可选的Antbuild文件,和/或Eclipse项目。
projectCreator[-antprojectName][-eclipseprojectName][-outdir][-overwrite][-ignore]
-ant
生成一个Antbuild文件,用于编译源代码(将会加入.ant.xml)
-eclipse
生成一个eclipse项目。
-out
输出文件写入到这个目录(默认是当前目录)
-overwrite
覆盖任何已经存在的文件。
-ignore
忽略任何已经存在的文件;不覆盖
⏹示例
~/Foo>projectCreator-antFoo-eclipseFoo
Createddirectorysrc
Createddirectorytest
CreatedfileFoo.ant.xml
Createdfile.project
Createdfile.classpath
运行ant-fFoo.ant.xml将会把src编译到bin。
这个build文件也包含一个目的包,这个包用于把项目打包成一个jar文件。
.project能够被引入到Eclipse工作区
●applicationCreator
生成一个初始的应用程序,这个应用程序可以从主机模式启动,并且可以编译成JAVASCRIPT
applicationCreator[-eclipseproje