麵向 Java 開發人員的 Ajax: Google Web Toolkit 入門
簡介: Ajax 被用於創建更加動態和交互性更好的 Web 應用程序。Google Web Toolkit (簡稱GWT) 是 Google 推出的 Ajax 應用開發包,GWT 支持開發者使用Java 語言開發 Ajax 應用。本文中作者將介紹如何使用 GWT 開發 Ajax 應用的基本方法和步驟。 ## Ajax簡介 ## Ajax是 Asynchronous JavaScript and XML(以及 DHTML 等)的縮寫,由XHTML、CSS、JavaScript、XMLHttpRequest、XML等技術組合而成,是當前Web應用開發領域的熱門技術,用於創建更加動態和交互性更好的Web應用程序,提升用戶的瀏覽體驗。 Ajax的核心是JavaScript對象XmlHttpRequest。XmlHttpRequest處理所有服務器通信的對象,是一種支持異步請求的技術。簡而言之,XmlHttpRequest使您可以使用JavaScript向服務器提出請求並處理響應,而不阻塞用戶。 Ajax並不是本文的中心關注點,因此這裏不再贅述,請大家訪問參考資源區的相關鏈接,了解更多關於Ajax技術和應用方麵的知識。
為什麼選擇GWT?
眾所周知,即使對於Ajax技術非常熟悉的開發者而言,Ajax應用的開發和調試過程也不是一件容易的事情,更困難的是,到目前為止,一直沒有出現合適的開發工具能夠支持Ajax應用的開發和調試。 與此相反的是,Java語言–企業應用開發的主流語言-的開發和調試過程卻因為有各種各樣開發工具的支持而簡單的多,而且這樣的開發工具我們可以免費獲得,比如Eclipse、NetBeans。 如果能夠應用Java語言開發Ajax,Ajax應用開發的最大難題-開發工具的缺失-就將迎刃而解。這種情況下,我們就可以既充分利用Java語言的開發優勢降低Ajax應用開發的難度,加快Ajax應用的開發速度,為Ajax的大規模應用創造可能,又可以充分發揮Ajax技術的優勢,創建更加動態和交互性更好的Web應用程序,提升用戶的瀏覽體驗。 Google Web Toolkit(簡稱GWT)的出現為我們提供了這種可能。GWT是Google推出的Ajax應用開發包,支持開發者使用Java語言開發Ajax應用。GWT框架本身是開源的,但是GWT中的開發工具僅僅提供開發用License,不允許分發。 GWT提供了一組基於Java語言的開發包,這個開發包的設計參考Java AWT包設計,類命名規則、接口設計、事件監聽等都和AWT非常類似。熟悉Java AWT的開發者不需要花費多大的力氣就能夠快速的理解GWT開發工具包,將更多地時間投入到GWT應用的開發過程中。 開發出來的Java應用將由GWT開發包提供的編譯工具編譯後聲生成對應的、應用了Ajax技術的Web應用,Java應用中出現的、和服務器之間的交互動作被自動生成的異步調用代碼所代替。
GWT特性
GWT除了支持將應用Java語言開發的應用轉化為Ajax應用,同時提供了更多的高級特性,下麵是這些特性的簡單描述。
- GWT編譯器 GWT編譯器是GWT的核心,負責完成將Java代碼翻譯很Ajax內容的工作。GWT編譯器能夠翻譯Java語言的大部分特性。包括支持Java語言中的基本類型、違例處理等,支持java.lang包和java.util包中的絕大部分類和接口,支持正則表達式和序列化。
- 跨平台支持 如果你使用GWT中提供的顯示組件(比如Button)和組裝組件(比如VerticalPanel),GWT編譯生成的Ajax應用能夠支持大部分的瀏覽器和操作係統,比如Internet Explorer、Firefox等,也能夠支持Linux、Windows等不同操作係統。這是因為GWT最大限度的將這些控件翻譯成瀏覽器內置的類型。比如Button類編譯後生成的是標準HTML:。 GWT建議使用CSS修飾頁麵元素的顯示效果。GWT的類中很少提供訪問頁麵元素樣式屬性的方法,我們可以直接在CSS文件中通過對應的樣式名稱來設置頁麵元素的默認顯示效果。比如使用 .gwt-Button { font-size: 150%; } 使用Button元素的默認顯示效果。
- 宿主模式(Hosted Mode) 宿主模式是指我們和沒有轉換為Ajax應用的GWT應用交互的狀態。當我們開發和調試時,我們就一直處在宿主模式下。在這種情況下,Java虛擬機使用GWT內置的瀏覽器運行GWT應用編譯後的class內容,因此能夠提供”編碼、測試、調試”過程的最佳速度。 我們可以運行com.google.gwt.dev.GWTShell啟動宿主模式。
- Web模式(Web Mode) 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操作平台,如果使用其他的操作係統,請根據實際情況進行適當的調整。
環境準備
1、 下載和安裝JDK1.4.X
GWT工具包的編譯需要JDK支持,因此在安裝GWT工具包之前請下載和安裝合適的JDK。GWT工具支持Java語言1.4版本或者以下版本,因此JDK版本選擇JDK1.4.X是比較合適的,不需要采用最新的JDK5.0或者更高版本。 請訪問java.sun.com網站上下載安裝版本,下載後安裝到C:/jdk目錄下,本書中的後續內容中將使用%JAVA_HOME%變量來引用這個目錄。 您可以根據實際情況將JDK安裝到任意目錄下。但是在運行本文中例子的時候,請記住將對應的%JAVA_HOME%變量替換為您的實際安裝目錄。
2、 下載和安裝GWT
請訪問https://code.google.com/webtoolkit/下載GWT的最新版本,將下載的壓縮文件解壓縮到C:/GWT目錄下。本書中的後續內容中將使用%GWT_HOME%變量來引用這個目錄。 GWT工具包支持不同的操作係統,請根據自己的操作係統選擇合適的安裝包。
您可以根據實際情況將GWT安裝到任意目錄下。但是在運行本文中例子的時候,請記住將對應的%GWT_HOME%變量替換為您的實際安裝目錄。
第一個例子-Hello World!
下麵的內容中我們將介紹如何使用GWT工具集來完成第一個GWT的例子-“Hello World!”,並且將使用GWT編譯及將他轉化為Ajax應用,在瀏覽器中完成測試。 我們要完成的例子要實現的功能包括:
1、 在頁麵上顯示一個按鈕
2、 點擊該按鈕,默認情況下,我們將在按鈕後麵緊跟著顯示字符串”Hello World!”。
3、 如果點擊按鈕時,”Hello World!”字符串已經顯示在瀏覽器中,我們要將他隱藏起來。 我們現在開始使用GWT工具集完成”Hello World!”例子的開發,下麵的步驟是完成”Hello World!”例子開發環境配置、應用開發、編譯的基本步驟,同樣適用於其他GWT應用的開發,隻是根據實際情況可能有增減。
1、 創建GWT應用開發環境
從上麵的GWT特性部分我們知道,GWT工具包中提供的applicationCreator命令行工具可以幫助我們創建GWT應用開發所需要的環境,因此我們可以直接使用applicationCreator幫助我們完成這項工作。 打開命令行工具,進入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命令支持的語法如下。
ApplicationCreator [-eclipse projectName] [-out dir]
[-overwrite] [-ignore] className
其中最重要的一個參數是classname,也就是我們創建的GWT應用中的主Java類,我們這裏選擇使用org.vivianj.gwt.client.HelloWorld。
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
2、 開發”Hello World!”例子
使用ApplicationCreator工具的時候,ApplicationCreator工具其實已經幫我們生成了符合Hello World!例子要求的全部內容。為了不打斷第一個例子的演示過程,我們先簡單的了解一下ApplicationCreator工具的生成內容。我們將在將在測試過程後麵做出更加詳細的分析。
圖1中顯示了ApplicationCreator工具執行後生成的目錄結構。
圖1中的src\org\vivianj\gwt\client目錄中的HelloWorld.java是GWT應用的主類;src\org\vivianj\gwt\public目錄中的
HelloWorld.html文件是例子的默認頁麵;src\org\vivianj\gwt目錄下的HelloWorld.gwt.xml是GWT應用的配置文件,提供GWT應用中頁麵和主類的配置信息;根目錄下的HelloWorld-compile.cmd文件用於提供將該GWT應用編譯成Ajax的命令;根目錄下的HelloWorld-shell.cmd文件用於啟動宿主模式(Hosted Mode),方便測試GWT應用。
3、 在宿主模式下啟動”Hello World!”例子 我們可以直接在命令行中執行HelloWorld-shell.cmd來啟動宿主模式(Hosted Mode),運行新創建的”Hello World!”例子。
C:\HelloWorld>HelloWorld-shell.cmd
這個命令將啟動兩個可視化界麵:Google Web Toolkit Development Shell(見圖2)和GWT內置的GWT應用瀏覽器(見圖3),GWT應用瀏覽器中將顯示”Hello World!”例子的初始界麵,如果我們點擊界麵上的”Click Me”按鈕,按鈕後麵將會顯示”Hello World!”字符串(見圖4),如果再次單擊頁麵上的”Click Me”按鈕,按鈕後麵的”Hello World!”字符串會消失。
圖2 Google Web Toolkit Development Shell運行界麵
圖3 “Hello World!”例子初始運行界麵
圖4 “Hello World!”例子-單擊”Clieck Me”按鈕後的界麵
4、 編譯”Hello World!”例子
要將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目錄下。
圖5 “Hello World!”例子編譯後的目錄結構
從上麵的圖中我們可以看到,新生成的www目錄下有一個名為org.vivianj.gwt.HelloWorld的目錄,它的命名規則是GWT主類全名(org.vivianj.gwt.client.HelloWorld)去掉其中的”client.”。
org.vivianj.gwt.HelloWorld目錄下的HelloWorld.html文件就是”Hello World!”例子對應的頁麵,以.cache.html後綴結尾的文件就是”Hello World!”例子中對應的Ajax代碼部分,而gwt.js文件則是GWT提供的、Ajax代碼中需要用到的JavaScript公共函數。其他還有些輔助文件。
5、 Web模式下測試”Hello World!”例子
運行HelloWorld-compile.cmd後,GWT應用就已經被編譯成Ajax應用了,不再依賴於JDK和GWT環境,而僅僅依賴於瀏覽器。 我們打開IE瀏覽器,打開C:\HelloWorld\www\org.vivianj.gwt.HelloWorld\HelloWorld.html文件,就可以看到”Hello World!”例子在Web模式下的運行效果(見圖6),單擊頁麵上的”Click Me”按鈕,按鈕後麵會出現”Hello World!”字符串(見圖7),如果再次單擊頁麵上的”Click Me”按鈕,按鈕後麵的”Hello World!”字符串會消失。
圖6 Web模式下運行”HelloWorld!”例子的默認效果
圖7 Web模式下運行”HelloWorld!”例子-單擊”Click Me”按鈕後的效果
實例詳細分析
上麵的步驟中,我們已經完成第一個GWT應用的編譯和測試,下麵我們來詳細的介紹一下GWT應用開發過程中涉及的幾個文件:顯示頁麵HelloWorld.html、主類HelloWorld和配置文件HelloWorld.gwt.xml。
1. 顯示頁麵HelloWorld.html
GWT應用中的HTML內容必須存放在public目錄下,public目錄的全路徑是”org\vivianj\gwt\ublic”,是將主類HelloWorld的包名”org.vivianj.gwt.client”中的client替換為”public”後形成的目錄結構。
我們將主要介紹HelloWorld.html中和GWT相關的內容,HelloWorld.html文件的全部內容見清單1。
24.<meta name='gwt:module' content='org.vivianj.gwt.HelloWorld'>
在HelloWorld.html文件的第24行,我們使用meta標簽指定了本頁麵和GWT模塊” org.vivianj.gwt.HelloWorld”之間的聯係,meta標簽的name屬性是不變的,而content屬性則是GWT主類全名(org.vivianj.gwt.client.HelloWorld)去掉其中的”client.”後的結果。
40. <script language="javascript" src="gwt.js"></script>
在HelloWorld.html文件的第40行,我們使用script標記引入GWT工具提供的默認函數庫。根據HTML語言的規定,我們可以選擇在<head></head>之間加入這行代碼,也可以選擇在<body></body>之間加入這段代碼。GWT建議在<head></head>之間加入這行代碼,以便獲得稍微快一些的起動速度。
56. <td ></td><td ></td>
在HelloWorld.html文件的第56行,我們使用td標簽定義了兩個相鄰的表格單元格,他們分別命名為”slot1”和”slot2”,根據”HelloWorld!”例子的要求,名為”slot1”的單元格中應該顯示按鈕,而名為”slot2”的單元格中則根據情況決定顯示”HelloWorld!”字符串或者不顯示任何內容。 我們將在主類HelloWorld.java的源代碼中使用RootPanel.get(“slot1”)來獲得對該單元格的引用,請參考下麵的”主類HelloWorld”部分的說明。
43. <iframe ></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
></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 ></td><td
></td>
57. </tr>
58. </table>
59. </body>
60. </html>
2. 主類HelloWorld
主類HelloWorld必須繼承自com.google.gwt.core.client.EntryPoint類,並且覆蓋其public void onModuleLoad()方法。 在onModuleLoad()方法中,我們使用GWT中提供的默認顯示組件(比如Button)和組裝組件(比如VerticalPanel)來設計需要顯示的界麵,所有這些組件都位於com.google.gwt.user.client.ui包下麵。這些組件的命名規則和Java AWT的命名規則基本類似,使用方式也和AWT的基本一致,不過GWT中提供了不少的新組建可供選擇,比如可以直接用VerticalPanel來實現垂直方向的布局管理。 HelloWorld.java中的19和20行,就聲明了Button和Label兩個顯示組件。
19.final Button button = new Button("Click me");
20.final Label label = new Label();
onModuleLoad()方法中,我們需要把生成的顯示組件或者組裝組建加入到顯示頁麵的對應顯示區域。首先,我們需要在頁麵上使用id屬性為顯示區域指定唯一的名稱(參見清單1中的56行)。com.google.gwt.user.client.ui.RootPanel的靜態方法get可以根據傳入的字符串參數(參數值就是顯示區域的id屬性)獲取頁麵上對應的顯示區域。 HelloWorld.java的36、37行,就使用了RootPanel的get方法分別獲得頁麵上id為”slot1”、”slot2”的顯示區域,然後調用add方法將生成的Button和Label對象加入到顯示區域中。
36.RootPanel.get("slot1").add(button);
37.RootPanel.get("slot2").add(label);
Ajax最重要的功能就是為用戶提供更好的交互體驗,GWT中使用和AWT中相同的事件監聽機製完成客戶端事件監聽,GWT中支持的Listener接口包括ChangeListener、ClickListener等。我們可以通過各種各樣的Listener接口獲得用戶界麵上所發生的動作,通過處理這些動作來完成對應業務邏輯。
HelloWorld.java中的第22行~29行的內容就實現了一個ClickListender接口,並且提供了對應的onClick方法實現,用於處理按鈕點擊後的業務邏輯(判斷是否需要顯示”Hello World!”字符串),然後調用Button對象的addClickListener方法增加監聽器。
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.});
HelloWorld類的全部源代碼內容見清單2。
清單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. 配置文件HelloWorld.gwt.xml
配置文件中包括兩個元素。Inherits元素地設置GWT應用的繼承信息,而entry-point元素的class屬性則用於設置設置GWT應用的主類。
清單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>
結束語
Ajax是當前熱門的Web應用開發技術,Java是企業應用開發中的主流技術,GWT框架將這兩種技術合二為一,是我們能夠應用Java語言來開發Ajax,在保留Ajax技術的優點基礎上,解決了Ajax應用開發、調試困難的缺點。 本文中介紹了GWT的基本知識、主要特性,提供了”HelloWorld!”例子說明使用Java和GWT框架開發Ajax應用的開發、編譯、測試過程,並且通過對”HelloWorld!”例子中涉及文件的分析,講解了使用GWT框架開發Ajax應用的技術細節和約束條件。
下載資源
JDK下載地址: https://java.sun.com
參考資料
學習 GWT 在線資源: https://code.google.com/webtoolkit/gettingstarted.html
developerWorks 網站 Ajax 技術資源中心:https://www.ibm.com/developerworks/cn/xml/ajax/。
獲得產品和技術 JDK 下載地址:https://java.sun.com
GWT 下載地址:https://code.google.com/webtoolkit/
討論 GWT 在線FAQ:https://code.google.com/webtoolkit/faq.html
GWT 開發者論壇:https://groups.google.com/group/Google-Web-Toolkit。
參考地址:https://www.ibm.com/developerworks/cn/java/j-lo-gwt-intro/
最後更新:2017-04-03 08:26:26