Ajax 被用于创建更加动态和交互性更好的 Web 应用E序。Google Web Toolkit (UGWT) ?Google 推出?Ajax 应用开发包QGWT 支持开发者用Java 语言开?Ajax 应用。本文中作者将介绍如何使用 GWT 开?Ajax 应用的基本方法和步骤?/blockquote>
Ajax?/span>
Ajax?Asynchronous JavaScript and XMLQ以?DHTML {)的羃写,由XHTML、CSS、JavaScript、XMLHttpRequest、XML{技术组合而成Q是当前Web应用开发领域的热门技术,用于创徏更加动态和交互性更好的Web应用E序Q提升用L览体验?/p>
Ajax的核心是JavaScript对象XmlHttpRequest。XmlHttpRequest处理所有服务器通信的对象,是一U支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出hq处理响应,而不d用户?/p>
Ajaxq不是本文的中心x点,因此q里不再赘述Q请大家讉K参考资源区的相关链接,了解更多关于Ajax技术和应用斚w的知识?/p>
Z么选择GWTQ?/span>
众所周知Q即使对于Ajax技术非常熟悉的开发者而言QAjax应用的开发和调试q程也不是一件容易的事情Q更困难的是Q到目前为止Q一直没有出现合适的开发工兯够支持Ajax应用的开发和调试?/p>
与此相反的是QJava语言--企业应用开发的L语言-的开发和调试q程却因为有各种各样开发工L支持而简单的多,而且q样的开发工h们可以免费获得,比如Eclipse、NetBeans?/p>
如果能够应用Java语言开发AjaxQAjax应用开发的最大难?开发工L~失-将q刃而解。这U情况下Q我们就可以既充分利用Java语言的开发优劉K低Ajax应用开发的隑ֺQ加快Ajax应用的开发速度QؓAjax的大规模应用创造可能,又可以充分发挥Ajax技术的优势Q创建更加动态和交互性更好的Web应用E序Q提升用L览体验?/p>
Google Web Toolkit(UGWT)的出Cؓ我们提供了这U可能。GWT是Google推出的Ajax应用开发包Q支持开发者用Java语言开发Ajax应用。GWT框架本n是开源的Q但是GWT中的开发工具仅仅提供开发用LicenseQ不允许分发?/p>
GWT提供了一l基于Java语言的开发包Q这个开发包的设计参考Java AWT包设计,cd名规则、接口设计、事件监听等都和AWT非常cM。熟悉Java AWT的开发者不需要花费多大的力气p够快速的理解GWT开发工具包Q将更多地时间投入到GWT应用的开发过E中?/p>
开发出来的Java应用由GWT开发包提供的编译工L译后声生成对应的、应用了Ajax技术的Web应用QJava应用中出现的、和服务器之间的交互动作被自动生成的异步调用代码所代替?/p>
GWTҎ?/span>
GWT除了支持应用Java语言开发的应用转化为Ajax应用Q同时提供了更多的高U特性,下面是这些特性的单描q?/p>
1. GWT~译?/p>
GWT~译器是GWT的核心,负责完成Java代码译很Ajax内容的工作。GWT~译器能够翻译Java语言的大部分Ҏ。包括支持Java语言中的基本cd、违例处理等Q支持java.lang包和java.util包中的绝大部分类和接口,支持正则表达式和序列化?/p>
2. 跨^台支?/p>
如果你用GWT中提供的昄lg(比如Button)和组装组?比如VerticalPanel)QGWT~译生成的Ajax应用能够支持大部分的览器和操作pȝQ比如Internet Explorer、Firefox{,也能够支持Linux、Windows{不同操作系l。这是因为GWT最大限度的这些控件翻译成览器内|的cd。比如Buttoncȝ译后生成的是标准HTMLQ?lt;input type="button">?/p>
GWT使用CSS修饰面元素的显C效果。GWT的类中很提供访问页面元素样式属性的ҎQ我们可以直接在CSS文g中通过对应的样式名U来讄面元素的默认显C效果。比如?.gwt-Button { font-size: 150%; } 使用Button元素的默认显C效果?/p>
3. 宿主模式(Hosted Mode)
宿主模式是指我们和没有{换ؓAjax应用的GWT应用交互的状态。当我们开发和调试Ӟ我们׃直处在宿L式下。在q种情况下,Java虚拟Z用GWT内置的浏览器q行GWT应用~译后的class内容Q因此能够提?~码、测试、调?q程的最佳速度?/p>
我们可以q行com.google.gwt.dev.GWTShell启动宿主模式?/p>
4. Web模式(Web Mode)
Web模式是指已经成功转化为Ajax应用的状态,q种状态下Q我们已l开始通过Web方式来访问Ajax应用了?/p>
在Web模式下运行时Q不再需要GWT工具包或者JVM的支持?/p>
5. 命o行工?/p>
GWT工具包中提供了几个非帔R用的小工具来帮助我们更快的建立GWT应用开发环境:projectCreator、applicationCreator、junitCreator?/p>
- projectCreator
创徏在Eclipse中开发GWT应用所需要的目基本文g和可选的Ant buildfile文g?
- applicationCreator
applicationCreator命o用于创徏基本的HelloWorldQ应用和GWT应用开发环境?
- junitCreator
生成junti试代码?
通过上面的内容,我们已经了解了GWT工具集工作的基本原理和主要特性。有些迫不及待了吧,那么p随我一赯入GWT应用开发的q程吧,享受应用Java语言开发Ajax应用带来的简单和便利?/p>
本文中所有的环境准备、实例开发和说明均针对Windows操作q_Q如果用其他的操作pȝQ请Ҏ实际情况q行适当的调整?/p>
环境准备
1?下蝲和安装JDK1.4.X
GWT工具包的~译需要JDK支持Q因此在安装GWT工具包之前请下蝲和安装合适的JDK。GWT工具支持Java语言1.4版本或者以下版本,因此JDK版本选择JDK1.4.X是比较合适的Q不需要采用最新的JDK5.0或者更高版本?/p>
误问java.sun.com|站上下载安装版本,下蝲后安装到C:/jdk目录下,本书中的后箋内容中将使用%JAVA_HOME%变量来引用这个目录?/p>
您可以根据实际情况将JDK安装CQ意目录下。但是在q行本文中例子的时候,误住将对应?JAVA_HOME%变量替换为您的实际安装目录?/p>
2?下蝲和安装GWT
误?a >http://code.google.com/webtoolkit/下蝲GWT的最新版本,下载的压羃文g解压~到C:/GWT目录下。本书中的后l内容中?GWT_HOME%变量来引用这个目录?/p>
GWT工具包支持不同的操作pȝQ请Ҏ自己的操作系l选择合适的安装包?/p>
您可以根据实际情况将GWT安装CQ意目录下。但是在q行本文中例子的时候,误住将对应?GWT_HOME%变量替换为您的实际安装目录?/p>
W一个例?Hello WorldQ?/span>
下面的内容中我们介l如何用GWT工具集来完成W一个GWT的例?"Hello WorldQ?Qƈ且将使用GWT~译及将他{化ؓAjax应用Q在览器中完成试?/p>
我们要完成的例子要实现的功能包括Q?/p>
1?在页面上昄一个按?/p>
2?点击该按钮,默认情况下,我们在按钮后面紧跟着昄字符?Hello World!"?/p>
3?如果点击按钮Ӟ"Hello World!"字符串已l显C在览器中Q我们要他隐藏h。我们现在开始用GWT工具集完?Hello WorldQ?例子的开发,下面的步骤是完成"Hello WorldQ?例子开发环境配|、应用开发、编译的基本步骤Q同样适用于其他GWT应用的开发,只是Ҏ实际情况可能有增减?/p>
1?创徏GWT应用开发环?/p>
从上面的GWTҎ部分我们知道,GWT工具包中提供的applicationCreator命o行工具可以帮助我们创建GWT应用开发所需要的环境Q因此我们可以直接用applicationCreator帮助我们完成q项工作?/p>
打开命o行工Pq入C:/根目录下Q执?mkdi"命o创徏新的文g目录HelloWorld?/p>
执行下面的命令将%JAVA_HOME%\bin目录?GWT_HOME%目录加入到PATH路径中?/p>
C:\>set path=%JAVA_HOME%\bin;%GWT_HOME%
|
请将命o行中?JAVA_HOME%替换为实际环境中JDK的安装目录,?GWT_HOME%替换为GWT工具包的安装目录?/p>
q入新创建的HelloWorld目录Q然后运行applicationCreator命o创徏GWT应用开发环境?/p>
applicationCreator.cmd命o支持的语法如下?/p>
ApplicationCreator [-eclipse projectName] [-out dir] [-overwrite] [-ignore] className 其中最重要的一个参数是classnameQ也是我们创徏的GWT应用中的主Javac,我们q里选择使用org.vivianj.gwt.client.HelloWorld?/p>
C:\HelloWorld>applicationCreator.cmd org.vivianj.gwt.client.HelloWorld
|
ҎGWT工具包的默认规则QGWT应用中的主JavacL名的最后一D必Lclient。也是_只有xxx.client.Xxxxq样命名的JavacL能被识别为正的GWT应用ȝ?/p>
ApplicationCreator工具q行的时候,屏幕上会打印如下内容?/p>
Created directory C:\HelloWorld\src
Created directory C:\HelloWorld\src\org\vivianj\gwt
Created directory C:\HelloWorld\src\org\vivianj\gwt\client
Created directory C:\HelloWorld\src\org\vivianj\gwt\public
Created file C:\HelloWorld\src\org\vivianj\gwt\HelloWorld.gwt.xml
Created file C:\HelloWorld\src\org\vivianj\gwt\public\HelloWorld.html
Created file C:\HelloWorld\src\org\vivianj\gwt\client\HelloWorld.java
Created file C:\HelloWorld\HelloWorld-shell.cmd
Created file C:\HelloWorld\HelloWorld-compile.cmd
|
2?开?Hello WorldQ?例子
使用ApplicationCreator工具的时候,ApplicationCreator工具其实已经帮我们生成了W合Hello World!例子要求的全部内宏Vؓ了不打断W一个例子的演示q程Q我们先单的了解一下ApplicationCreator工具的生成内宏V我们将在将在测试过E后面做出更加详l的分析?/p>
?中显CZApplicationCreator工具执行后生成的目录l构?/p>
? GWT应用开发环?/strong>
?中的src\org\vivianj\gwt\client目录中的HelloWorld.java是GWT应用的主c;src\org\vivianj\gwt\public目录中的HelloWorld.html文g是例子的默认面Qsrc\org\vivianj\gwt目录下的HelloWorld.gwt.xml是GWT应用的配|文Ӟ提供GWT应用中页面和ȝ的配|信息;根目录下的HelloWorld-compile.cmd文g用于提供该GWT应用~译成Ajax的命令;根目录下的HelloWorld-shell.cmd文g用于启动宿主模式(Hosted Mode)Q方便测试GWT应用?/p>
3?在宿L式下启动"Hello WorldQ?例子
我们可以直接在命令行中执行HelloWorld-shell.cmd来启动宿L?Hosted Mode)Q运行新创徏?Hello WorldQ?例子?/p>
C:\HelloWorld>HelloWorld-shell.cmd
|
q个命o启动两个可视化界面QGoogle Web Toolkit Development ShellQ见?Q和GWT内置的GWT应用览器(见图3Q,GWT应用览器中显C?Hello WorldQ?例子的初始界面,如果我们点击界面上的"Click Me"按钮Q按钮后面将会显C?Hello World!"字符Ԍ见图4Q,如果再次单击面上的"Click Me"按钮Q按钮后面的"Hello WorldQ?字符串会消失?/p>
? Google Web Toolkit Development Shellq行界面
? "Hello WorldQ?例子初始q行界面
? "Hello WorldQ?例子-单击"Clieck Me"按钮后的界面
4?~译"Hello WorldQ?例子
要将GWT应用~译成Ajax应用Q我们可以执行HelloWorld-compile.cmd?/p>
C:\HelloWorld>HelloWorld-compile.cmd
|
命oq行Ӟ界面上将会显CZ面的内容?/p>
Output will be written into C:\HelloWorld\www\org.vivianj.gwt.HelloWorld
Copying all files found on public path
Compilation succeeded
|
其中的第一行显C生成的Ajax应用位于C:\HelloWorld\www\org.vivianj.gwt.HelloWorld目录下?/p>
? "Hello WorldQ?例子~译后的目录l构
从上面的图中我们可以看到Q新生成的www目录下有一个名为org.vivianj.gwt.HelloWorld的目录,它的命名规则是GWTȝ全名(org.vivianj.gwt.client.HelloWorld)L其中?client."?/p>
org.vivianj.gwt.HelloWorld目录下的HelloWorld.html文g是"Hello WorldQ?例子对应的页面,?cache.html后缀l尾的文件就?Hello WorldQ?例子中对应的Ajax代码部分Q而gwt.js文g则是GWT提供的、Ajax代码中需要用到的JavaScript公共函数。其他还有些辅助文g?/p>
5?Web模式下测?Hello WorldQ?例子
q行HelloWorld-compile.cmd后,GWT应用已l被~译成Ajax应用了,不再依赖于JDK和GWT环境Q而仅仅依赖于览器?/p>
我们打开IE览器,打开C:\HelloWorld\www\org.vivianj.gwt.HelloWorld\HelloWorld.html文gQ就可以看到"Hello WorldQ?例子在Web模式下的q行效果Q见?Q,单击面上的"Click Me"按钮Q按钮后面会出现"Hello WorldQ?字符Ԍ见图7Q,如果再次单击面上的"Click Me"按钮Q按钮后面的"Hello WorldQ?字符串会消失?/p>
? Web模式下运?HelloWorldQ?例子的默认效?/strong>
? Web模式下运?HelloWorldQ?例子-单击"Click Me"按钮后的效果
实例详细分析
上面的步骤中Q我们已l完成第一个GWT应用的编译和试Q下面我们来详细的介l一下GWT应用开发过E中涉及的几个文Ӟ昄面HelloWorld.html、主cHelloWorld和配|文件HelloWorld.gwt.xml?/p>
1. 昄面HelloWorld.html
GWT应用中的HTML内容必须存放在public目录下,public目录的全路径?org\vivianj\gwt\ublic"Q是主cHelloWorld的包?org.vivianj.gwt.client"中的client替换?public"后Ş成的目录l构?/p>
我们主要介lHelloWorld.html中和GWT相关的内容,HelloWorld.html文g的全部内容见清单1?/p>
24. <meta name='gwt:module' content='org.vivianj.gwt.HelloWorld'>
|
在HelloWorld.html文g的第24行,我们使用meta标签指定了本面和GWT模块" org.vivianj.gwt.HelloWorld"之间的联p,meta标签的name属性是不变的,而content属性则是GWTȝ全名(org.vivianj.gwt.client.HelloWorld)L其中?client."后的l果?/p>
40. <script language="javascript" src="gwt.js"></script>
|
在HelloWorld.html文g的第40行,我们使用script标记引入GWT工具提供的默认函数库。根据HTML语言的规定,我们可以选择?lt;head></head>之间加入q行代码Q也可以选择?lt;body></body>之间加入q段代码。GWT?lt;head></head>之间加入q行代码Q以便获得稍微快一些的起动速度?/p>
56. <td id="slot1"></td><td id="slot2"></td>
|
在HelloWorld.html文g的第56行,我们使用td标签定义了两个相ȝ表格单元|他们分别命名?slot1"?slot2"Q根?HelloWorld!"例子的要求,名ؓ"slot1"的单元格中应该显C按钮,而名?slot2"的单元格中则Ҏ情况军_昄"HelloWorld!"字符串或者不昄M内容?/p>
我们在ȝHelloWorld.java的源代码中用RootPanel.get("slot1")来获得对该单元格的引用,请参考下面的"ȝHelloWorld"部分的说明?/p>
43. <iframe id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe>
|
在HelloWorld.html的第43行,我们使用iframe标签来设|当前页支持历史功能Qiframe的属性必d上面的内容保持一_否则不会vCQ何效果?/p>
清单1 src\org\vivianj\gwt\public\public\HelloWorld.html
1. <html>
2. <head>
3.
4. <!-- -->
5. <!-- Any title is fine -->
6. <!-- -->
7. <title>Wrapper HTML for HelloWorld</title>
8.
9. <!-- -->
10. <!-- Use normal html, such as style -->
11. <!-- -->
12. <style>
13. body,td,a,div,.p{font-family:arial,sans-serif}
14. div,td{color:#000000}
15. a:link,.w,.w a:link{color:#0000cc}
16. a:visited{color:#551a8b}
17. a:active{color:#ff0000}
18. </style>
19.
20. <!-- -->
21. <!-- The module reference below is the link -->
22. <!-- between html and your Web Toolkit module -->
23. <!-- -->
24. <meta name='gwt:module' content='org.vivianj.gwt.HelloWorld'>
25.
26. </head>
27.
28. <!-- -->
29. <!-- The body can have arbitrary html, or -->
30. <!-- you can leave the body empty if you want -->
31. <!-- to create a completely dynamic ui -->
32. <!-- -->
33. <body>
34.
35. <!-- -->
36. <!-- This script is required bootstrap stuff. -->
37. <!-- You can put it in the HEAD, but startup -->
38. <!-- is slightly faster if you include it here. -->
39. <!-- -->
40. <script language="javascript" src="gwt.js"></script>
41.
42. <!-- OPTIONAL: include this if you want history support -->
43. <iframe id="__gwt_historyFrame"
style="width:0;height:0;border:0"></iframe>
44.
45. <h1>HelloWorld</h1>
46.
47. <p>
48. This is an example of a host page for the HelloWorld application.
49. You can attach a Web Toolkit module to any HTML page you like,
50. making it easy to add bits of AJAX functionality to existing
pages
51. without starting from scratch.
52. </p>
53.
54. <table align=center>
55. <tr>
56. <td id="slot1"></td><td
id="slot2"></td>
57. </tr>
58. </table>
59. </body>
60. </html>
|
2. ȝHelloWorld
ȝHelloWorld必须l承自com.google.gwt.core.client.EntryPointc,q且覆盖其public void onModuleLoad()Ҏ?/p>
在onModuleLoad()Ҏ中,我们使用GWT中提供的默认昄lg(比如Button)和组装组?比如VerticalPanel)来设计需要显C的界面Q所有这些组仉位于com.google.gwt.user.client.ui包下面。这些组件的命名规则和Java AWT的命名规则基本类|使用方式也和AWT的基本一_不过GWT中提供了不少的新l徏可供选择Q比如可以直接用VerticalPanel来实现垂直方向的布局理?/p>
HelloWorld.java中的19?0行,声明了Button和Label两个昄lg?/p>
19. final Button button = new Button("Click me");
20. final Label label = new Label();
|
onModuleLoad()Ҏ中,我们需要把生成的显C组件或者组装组建加入到昄面的对应显C区域。首先,我们需要在面上用id属性ؓ昄区域指定唯一的名U?参见清单1中的56?。com.google.gwt.user.client.ui.RootPanel的静态方法get可以Ҏ传入的字W串参数Q参数值就是显C区域的id属性)获取面上对应的昄区域?/p>
HelloWorld.java?6?7行,׃用了RootPanel的getҎ分别获得面上id?slot1"?slot2"的显C区域,然后调用addҎ生成的Button和Label对象加入到显C区域中?/p>
36. RootPanel.get("slot1").add(button);
37. RootPanel.get("slot2").add(label);
|
Ajax最重要的功能就是ؓ用户提供更好的交互体验,GWT中用和AWT中相同的事g监听机制完成客户端事件监听,GWT中支持的Listener接口包括ChangeListener、ClickListener{。我们可以通过各种各样的Listener接口获得用户界面上所发生的动作,通过处理q些动作来完成对应业务逻辑?/p>
HelloWorld.java中的W?2行~29行的内容实C一个ClickListender接口Qƈ且提供了对应的onClickҎ实现Q用于处理按钮点d的业务逻辑Q判断是否需要显C?Hello World!"字符ԌQ然后调用Button对象的addClickListenerҎ增加监听器?/p>
22. button.addClickListener(new ClickListener() {
23. public void onClick(Widget sender) {
24. if (label.getText().equals(""))
25. label.setText("Hello World!");
26. else
27. label.setText("");
28. }
29. });
|
HelloWorldcȝ全部源代码内容见清单2?/p>
清单2 src\org\vivianj\gwt\client\HelloWorld.java
1. package org.vivianj.gwt.client;
2.
3. import com.google.gwt.core.client.EntryPoint;
4. import com.google.gwt.user.client.ui.Button;
5. import com.google.gwt.user.client.ui.ClickListener;
6. import com.google.gwt.user.client.ui.Label;
7. import com.google.gwt.user.client.ui.RootPanel;
8. import com.google.gwt.user.client.ui.Widget;
9.
10. /**
11. * Entry point classes define <code>onModuleLoad()</code>.
12. */
13. public class HelloWorld implements EntryPoint {
14.
15. /**
16. * This is the entry point method.
17. */
18. public void onModuleLoad() {
19. final Button button = new Button("Click me");
20. final Label label = new Label();
21.
22. button.addClickListener(new ClickListener() {
23. public void onClick(Widget sender) {
24. if (label.getText().equals(""))
25. label.setText("Hello World!");
26. else
27. label.setText("");
28. }
29. });
30.
31. // Assume that the host HTML has elements defined whose
32. // IDs are "slot1", "slot2". In a real app, you probably would not want
33. // to hard-code IDs. Instead, you could, for example, search for all
34. // elements with a particular CSS class and replace them with widgets.
35. //
36. RootPanel.get("slot1").add(button);
37. RootPanel.get("slot2").add(label);
38. }
39. }
|
3. 配置文gHelloWorld.gwt.xml
配置文g中包括两个元素。Inherits元素地设|GWT应用的承信息,而entry-point元素的class属性则用于讄讄GWT应用的主cR?/p>
清单3 src\org\vivianj\gwt\HelloWorld.gwt.xml
1. <module>
2.
3. <!-- Inherit the core Web Toolkit stuff. -->
4. <inherits name='com.google.gwt.user.User'/>
5.
6. <!-- Specify the app entry point class. -->
7. <entry-point class='org.vivianj.gwt.client.HelloWorld'/>
8.
9. </module>
|
l束?/span>
Ajax是当前热门的Web应用开发技术,Java是企业应用开发中的主技术,GWT框架这两种技术合二ؓ一Q是我们能够应用Java语言来开发AjaxQ在保留Ajax技术的优点基础上,解决了Ajax应用开发、调试困隄~点?/p>
本文中介l了GWT的基本知识、主要特性,提供?HelloWorldQ?例子说明使用Java和GWT框架开发Ajax应用的开发、编译、测试过E,q且通过?HelloWorldQ?例子中涉及文件的分析Q讲解了使用GWT框架开发Ajax应用的技术细节和U束条g?/p>
下蝲资源
参考资?
学习
获得产品和技?/strong>
- JDK 下蝲地址Q?a >http://java.sun.com
- GWT 下蝲地址Q?a >http://code.google.com/webtoolkit/
讨论
关于作?/span>
 |
|
 |
肖菁Q?a >?J 族创始hQ开源项?a >BuildFileDesigner?a >V-Security 创始人,Open Source 推广人,主要研究 J2EE ~程技术、Web Service 技术以及他们在 WebSphere、WebLogic?Apache q_上的实现Q拥?IBM ?Developing With Websphere Studio 证书?/p>
|