Ajax并不是本文的中心关注点,因此这里不再赘述,请大家访问参考资源区的相关链接,了解更多关于Ajax技术和应用方面的知识。
众所周知,即使对于Ajax技术非常熟悉的开发者而言,Ajax应用的开发和调试过程也不是一件容易的事情,更困难的是,到目前为止,一直没有出现合适的开发工具能够支持Ajax应用的开发和调试。
与此相反的是,Java语言--企业应用开发的主流语言-的开发和调试过程却因为有各种各样开发工具的支持而简单的多,而且这样的开发工具我们可以免费获得,比如Eclipse、NetBeans。
开发出来的Java应用将由GWT开发包提供的编译工具编译后声生成对应的、应用了Ajax技术的Web应用,Java应用中出现的、和服务器之间的交互动作被自动生成的异步调用代码所代替。
GWT除了支持将应用Java语言开发的应用转化为Ajax应用,同时提供了更多的高级特性,下面是这些特性的简单描述。
我们可以运行com.google.gwt.dev.GWTShell启动宿主模式。
Web模式是指已经成功转化为Ajax应用的状态,这种状态下,我们已经开始通过Web方式来访问Ajax应用了。
在Web模式下运行时,不再需要GWT工具包或者JVM的支持。
GWT工具包中提供了几个非常适用的小工具来帮助我们更快的建立GWT应用开发环境:projectCreator、applicationCreator、junitCreator。
- projectCreator
创建在Eclipse中开发GWT应用所需要的项目基本文件和可选的Ant buildfile文件。 - applicationCreator
applicationCreator命令用于创建基本的HelloWorld!应用和GWT应用开发环境。 - junitCreator
生成junti测试代码。
通过上面的内容,我们已经了解了GWT工具集工作的基本原理和主要特性。有些迫不及待了吧,那么就请随我一起进入GWT应用开发的过程吧,享受应用Java语言开发Ajax应用带来的简单和便利。
本文中所有的环境准备、实例开发和说明均针对Windows操作平台,如果使用其他的操作系统,请根据实际情况进行适当的调整。
请访问java.sun.com网站上下载安装版本,下载后安装到C:/jdk目录下,本书中的后续内容中将使用%JAVA_HOME%变量来引用这个目录。
您可以根据实际情况将JDK安装到任意目录下。但是在运行本文中例子的时候,请记住将对应的%JAVA_HOME%变量替换为您的实际安装目录。
GWT工具包支持不同的操作系统,请根据自己的操作系统选择合适的安装包。
您可以根据实际情况将GWT安装到任意目录下。但是在运行本文中例子的时候,请记住将对应的%GWT_HOME%变量替换为您的实际安装目录。
下面的内容中我们将介绍如何使用GWT工具集来完成第一个GWT的例子-"Hello World!",并且将使用GWT编译及将他转化为Ajax应用,在浏览器中完成测试。
- 1、 在页面上显示一个按钮
- 2、 点击该按钮,默认情况下,我们将在按钮后面紧跟着显示字符串"Hello World!"。
- 3、 如果点击按钮时,"Hello World!"字符串已经显示在浏览器中,我们要将他隐藏起来。我们现在开始使用GWT工具集完成"Hello World!"例子的开发,下面的步骤是完成"Hello World!"例子开发环境配置、应用开发、编译的基本步骤,同样适用于其他GWT应用的开发,只是根据实际情况可能有增减。
打开命令行工具,进入C:/根目录下,执行"mkdi"命令创建新的文件目录HelloWorld。
C:/> mkdir HelloWorld |
执行下面的命令将%JAVA_HOME%/bin目录和%GWT_HOME%目录加入到PATH路径中。
C:/>set path=%JAVA_HOME%/bin;%GWT_HOME% |
请将命令行中的%JAVA_HOME%替换为实际环境中JDK的安装目录,将%GWT_HOME%替换为GWT工具包的安装目录。
进入新创建的HelloWorld目录,然后运行applicationCreator命令创建GWT应用开发环境。
applicationCreator.cmd命令支持的语法如下。
C:/HelloWorld>applicationCreator.cmd org.vivianj.gwt.client.HelloWorld |
根据GWT工具包的默认规则,GWT应用中的主Java类报名的最后一段必须是client。也就是说,只有xxx.client.Xxxx这样命名的Java类才能被识别为正确的GWT应用主类。
ApplicationCreator工具运行的时候,屏幕上会打印如下内容。
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
图1中显示了ApplicationCreator工具执行后生成的目录结构。
我们可以直接在命令行中执行HelloWorld-shell.cmd来启动宿主模式(Hosted Mode),运行新创建的"Hello World!"例子。
C:/HelloWorld>HelloWorld-shell.cmd |
图2 Google Web Toolkit Development Shell运行界面
图4 "Hello World!"例子-单击"Clieck Me"按钮后的界面
要将GWT应用编译成Ajax应用,我们可以执行HelloWorld-compile.cmd。
C:/HelloWorld>HelloWorld-compile.cmd
Output will be written into C:/HelloWorld/www/org.vivianj.gwt.HelloWorld Copying all files found on public path Compilation succeeded |
其中的第一行显示生成的Ajax应用位于C:/HelloWorld/www/org.vivianj.gwt.HelloWorld目录下。
运行HelloWorld-compile.cmd后,GWT应用就已经被编译成Ajax应用了,不再依赖于JDK和GWT环境,而仅仅依赖于浏览器。
图6 Web模式下运行"HelloWorld!"例子的默认效果
图7 Web模式下运行"HelloWorld!"例子-单击"Click Me"按钮后的效果
我们将主要介绍HelloWorld.html中和GWT相关的内容,HelloWorld.html文件的全部内容见清单1。
24. <meta name='gwt:module' content='org.vivianj.gwt.HelloWorld'> |
40. <script language="javascript" src="gwt.js"></script> |
56. <td id="slot1"></td><td id="slot2"></td> |
我们将在主类HelloWorld.java的源代码中使用RootPanel.get("slot1")来获得对该单元格的引用,请参考下面的"主类HelloWorld"部分的说明。
43. <iframe id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe> |
在HelloWorld.html的第43行,我们使用iframe标签来设置当前页支持历史功能,iframe的属性必须和上面的内容保持一致,否则将不会起到任何效果。
清单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>
主类HelloWorld必须继承自com.google.gwt.core.client.EntryPoint类,并且覆盖其public void onModuleLoad()方法。
HelloWorld.java中的19和20行,就声明了Button和Label两个显示组件。
19. final Button button = new Button("Click me"); 20. final Label label = new Label(); |
36. RootPanel.get("slot1").add(button); 37. RootPanel.get("slot2").add(label); |
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. }); |
清单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. }