內容簡介
GoogleWebToolkit(GWT)是一種開源的Java框架,用於構建Java驅動的Web應用程式。通過GWT,開發者可以使用純Java來實現豐富的客戶端套用。在簡化開發能夠運行於各種瀏覽器中的、類似於桌面應用程式的客戶端套用方向,GWT超過了大多數Java框架。局限用戶界面豐富性的唯一因素就是開發者的想像力。《GoogleWebToolki開發實戰》內容涵蓋了GWT的高級特性,在構建具有豐富用戶界面的真實應用程式時,完全可以利用這些特性而不必學習JavaScript和其他相關的Java技術。《GoogleWebToolki開發實戰》中的每個解決方案並不局限於解決一個問題,而是融合了設計模式和最佳實踐。作者對示例應用程式的耐心解釋,有助於讀者迅速掌握高級的GWT技術,例如實現拖放、整合JavaScript庫,以及使用高級事件處理機制等。
內容:構建自定義GWT部件,包括高級複合部件和低級組件。實現具有iPhone風格的自動滾動功能的視口類。通過GWT在應用程式中整合Web服務。將Script.aculo.us.JavaScript框架整合到GWT應用程式中。組合Hibernate和GWT實現基於資料庫的Web應用程式。擴展GWT的PopupPanel類以實現可拖動和可調整大小的視窗。創建拖放模組,包含拖動源和放置目標。將GWT應用程式部署到外部伺服器。動態調整可伸縮表格。在基於Struts.JavaServerFaces等其他框架開發的原有應用程式中使用GWT部件。
作者簡介
DavidGeary著名作者、演講者和顧問。他是JSF(JavaServerFaces)的專家組成員。此外,David不曾為Sun的WebDeveloperCertificationExam編寫試題。DavidGeary編著了8本Java技術書,包括最暢銷的GraphicJava2Series、AdvancedJavaServerPages和CoreJavaServerFaces。
RobGordon獨立諮詢師、資深Sun開發師,也是EssentialJNI作者和EssentialJMF的合著者。
編輯推薦
構建自定義GWT部件,包括高級複合部件和低級組件。
實現具有iPhone風格的自動滾動功能的視口類。
通過GWT在應用程式中整合Web服務。
將Script.aculo.usJavaScript框架整合到GWT應用程式中。
組合Hibernate和GWT實現基於資料庫的Web應用程式。
擴展GWT的PopupPanel類以實現可拖動和可調整大小的視窗。
創建拖放模組,包含拖動源和放置目標。
將GWT應用程式部署到外部伺服器。
動態調整可伸縮表格。
在基於Struts、JavaServerFaces等其他框架開發的原有應用程式中使用GWT部件。
目錄
譯者序
序
前言
第1章 GWT入門與進階
1.1 綜述
1.2 本章要點
1.3 GWT部件簡介
1.4 GWT應用程式分析
1.5 通過GWT面板構建用戶界面
1.5.1 根面板
1.5.2 user.client.uiAPI
1.6 通過CSS為部件添加樣式
1.7 GWT與事件驅動的程式設計
1.8 國際化與本地化
1.8.1 實現GWT國經的4個步驟
1.8.2 使用GWT的il8nCreator命令
1.9 GWTWeb應用程式中的新“視圖”
1.10 GWT的歷史機制
1.10.1 添加歷史類和歷史偵聽器
1.10.2 處理瀏覽器後退按鈕
1.11 GWT的對等實體:DOM元素
1.12 使用延遲命令賦予部件鍵盤焦點
1.13 實現遠程過程調用
1.14 使用自定義部件
1.15 在GWT模組中封裝自定義部件
1.16 完整的登錄實用程式
1.17 本章回顧
第2章 JavaScript整合技術
2.1 本章要點
2.2 整合JavaScript庫Script.aculo.us
2.2.1 在HTML檔案中導入JavaScript檔案
2.2.2 在GWT配置檔案中導入JavaScript檔案
2.3 整合JavaScript日曆
2.4 本章回顧
第3章 自定義部件
3.1 本章要點
3.2 複合的自定義部件
3.2.1 複合部件和傳遞方法
3.2.2 事件處理程式
3.2.3 觸發變化事件
3.2.4 實現HasText和HasName接口
3.2.5 整合Script.aculo.us的BlindDown效果
3.3 低級自定義部件
3.3.1 在低級自定義部件中使用DOM類
3.3.2 為自定義部件設定默認CSS樣式
3.3.3 在自定義部件中通過參數控制Script.aculo.us效果
3.4 本章回顧
第4章 視口與地圖
4.1 本章要點
4.2 通用視口部件
4.3 地圖應用程式的檔案和目錄
4.4 實現視口
4.4.1 通過AbsolutePanel實例在像素級別上放置部件
4.4.2 在視口中拖動視圖
4.4.3 通過焦點面板回響滑鼠事件
4.4.4 通過事件預覽禁止瀏覽器對滑鼠事件的默認回響
4.4.5 捕獲事件
4.5 深入理解焦點面板在視口中的套用
4.6 帶動態手勢的視口視圖
4.7 完成後的視口
4.7.1 加入拖動手勢
4.7.2 回響拖動手勢的動態滾動
4.7.3 與拖動手勢保持同方向動態滾動
4.7.4 改變動態滾動的速度
4.8 本章回顧
第5章 訪問線上Web服務
5.1 本章要點
5.2 Yahoo!MapsWeb服務
5.2.1 示例應用程式分析
5.2.2 地圖應用程式的檔案和目錄
5.2.3 實現Yahoo!Maps應用程式
5.3 訪問Yahoo!Maps的Web服務
5.4 縮放
5.5 本章回顧
第6章 拖放技術
6.1 本章要點
6.2 拖放示例應用程式
6.3 拖放模組
6.4 實現拖放模組
6.4.1 使用音樂播放器和購物車面板組件
6.4.2 使用拖動源和放置目標
6.4.3 定義CSS類
6.5 在GWT模組中實現拖放
6.5.1 模組配置檔案
6.5.2 抽象拖動源和放置目標類
6.5.3 滑鼠偵聽器
6.6 本章回顧
第7章 簡單的視窗
7.1 本章要點
7.2 基於伸縮表格構建視窗
7.3 簡單的視窗
7.3.1 使用彈出面板
7.3.2 重寫彈出面板默認的事件處理行為
7.3.3 使用GWT的伸縮表格並為其單元格添加樣式
7.3.4 接收事件
7.3.5 操作部件DOM元素的Z軸堆疊次序
7.3.6 調整彈出面板的大小
7.3.7 防止意外的瀏覽器效果
7.4 視窗標題欄
7.4.1 在水平面板的單元格內對齊部件
7.4.2 通過滑鼠偵聽器和圖像模擬3D按鈕
7.4.3 移動彈出面板
7.4.4 在視窗標題中防止意外的瀏覽器效果
7.5 本章回顧
第8章 伸縮表格
8.1 本章要點
8.2 伸縮表格簡介
8.3 簡化伸縮表格的操作
8.4 刪除伸縮表格的行
8.5 編輯伸縮表格的單元格
8.6 動態調整伸縮表格的列
8.6.1 通過GWT構建事件偵聽器和觸發事件
8.6.2 構建ResizableCellPanel部件
8.6.3 將ResizableCellPanel部件加入伸縮表格
8.7 通過伸縮表格實現數據分頁
8.8 使用pager部件
8.9 本章回顧
第9章 檔案上傳
9.1 本章要點
9.2 GWT的檔案上傳部件
9.2.1 創建用戶界面
9.2.2 解析JSON
9.3 ApacheCommonsfileUpload
9.4 本章回顧
第10章 整合Hibernate
第11章 外部伺服器部署
第12章 GWT與遺留程式
……
序言
Ajax的成功非常耐人尋味。既沒有經過特別地發布,也沒有產品或報導讓人們知道有一種技術叫Ajax。好像是一夜之間,Ajax就出現了。儘管JesseJamesGarret寫了文章為這種技術取了名字,但該文也沒有聲稱這是他的創造,而是指出它是一種值得關注的新趨勢、結果,雖然我們都意識到了它的存在,但對於“Ajax”到底意味著什麼卻難以達成共識。對此,20位專家可能會有22種不同的解說。假如非要我概括一下他們的意見,那么我只能說它是過去15年來軟體領域中最好的,同時也是最差的一種技術。然而,無論人們是否知道它的起源,它是什麼,或者它的優點和缺點,但每個軟體從業人員似乎都想在自己的下一個產品中加入平滑的新Ajax界面。從技術人員的角度看,這並不意味著是一件簡單的事情。瀏覽器普遍存在兼容性問題,而且其不一致性也給開發人員帶來了無盡的痛苦。於是,大家都從自己的角度提出了正確的意見,但反映的問題卻讓人無法樂觀。。
不過,值得欣慰的是Ajax並非只有技術人員在推動。還有另一股力量對技術人員結構之美的困惑起到了調和作用—即用戶越來越強烈地認為軟體應該簡化生活,而不是讓生活複雜化。雖然技術人員抱怨瀏覽器是軟體開發中的混沌地帶,但用戶卻因為自己熟悉和適應瀏覽器而對它推崇倍至。對用戶而言,瀏覽器把Internet連線的全部複雜性簡化為幾個關鍵概念:地址。連結。前進。後退和搜尋。這就是Web中的語言,而且用戶對這種具有局限性的技術圖景卻樂在其中。他們為什麼不應該如此呢?除了要熟悉各種瀏覽器之外,額外的約束也強迫軟體開發人員更關注用戶的需求。成功使用Ajax開發的一個重要標誌,就是無論你使用什麼技術,但結果必須對用戶有價值。雖然這對於推動應用程式開發的創新明顯具有積極意義,但軟體開發人員必須為此付出的代價,則是要承受更多的痛苦和磨難。
在我聽說的新項目中,“當然,它的UI要設計成非常Ajax的風格”這樣的論調越來越多。一般情況下,通過他們對項目的深愛程度,我都能推測出項目進展。而那些剛剛參與到項目中的人,則會因為能在倍受關注的領域內工作而激動不已。他們會討論選擇某個框架的過程,有時也會粗略地聊一聊早期UI模型的情況。此時此刻,他們已經構建了一些小例子,一切好像都按部就班。不過,也很容易看出基於瀏覽器開發的困難對他們來說並沒有那么誇張,反而對攻克技術難關的滿足感倒是溢於言表。於是,他們決定品嘗一種時尚的濃咖啡來獎勵自己。幾個月後,當我再遇到他們時,發覺他們對那個項目欲言又止。然而,他們最終還是向我透露,開始時對某些問題的難度估計不足,而事實證明挑戰還不小。“我們本來是想讓它實時更新,但誰知道載入要花那么多時間”。此時,我的初步判斷就是他們的信心開始低落,但我還是盡力鼓勵他們。不過,我知道一場耐力賽才剛剛拉開帷幕。這時候,我通常會建議他們別再喝濃咖啡了,而是改喝茶。與咖啡因相比,茶更溫和且具有持久力,咖啡卻總愛在關鍵時刻掉鏈子。簡單地說,要為好的Ajax應用程式畫上完美的句號,必須有足夠的時間。雖然他們都對接近真實挑戰的終點持樂觀態度,但卻往往對我的建議一笑置之。
項目真正的災難開始於出現如下問題:我們的用戶在想什麼?在試圖回答這個問題時,多數人都想通過用戶測驗,或者通過發布早期的beta版來找到答案。另外還有一些人,—這些人大概吃水果之前都不會先洗一下,他們會基於自己認為的對用戶需求的精確把握,提前發布完整版。我覺得這些人最可憐。事實上,在回答這個問題時,上述兩類開發人員存在一些共同問題。首先,他們作出的避免涉及某些較難問題的決定,對用戶而言實際上是錯誤的。其次,他們認為任何測試都比不上實際使用。目前,類似的認識並不僅僅存在於UI內置的Ajax上面。我不知道有哪個成功的項目可以繞過這些難題。但對Ajax應用程式而言,獨有的一個特點就是這些問題越來越難以解決好。因為,需要闖過的關口實在是太多了。.。
首先要面對的恐怕就是瀏覽器間行為的不一致性。用戶會報告說在一個瀏覽器中他們的選單顯示在了錯誤的位置上。在另外一個瀏覽器中,文本又發生了折行。但在第三種瀏覽器中,雖然不存在前兩個問題,但卻在載入應用程式15分鐘後,由於某些內容的變化,導致整個界面出現了閃爍現象。其次,你可能會發現用戶的使用模式不對頭,而且UI中的某些部分還必須得改變—如果不是出現討厭且莫名其妙的問題,這些改變通過JavaScript的靈活表達性來實現也確實會讓人折服。我也曾在很多情況下嘗試無縫地重構大型JavaScript代碼基,但沒有一次令人滿意。在這些錯綜複雜的問題之上,只有一個硬道理:應用程式必須讓用戶滿意。因此,除了剛剛介紹的這些直接困難之外,用戶體驗最大化這個主要目標仍然未變。而且,當應用程式運行後,這也是人們評估它的唯一標準。你的應用程式能夠滿足用戶需要嗎?
簡單地說,這正是GoogleWebToolkit的使命—讓開發人員在面對這些問題時,能夠更輕鬆說“沒問題”。我們越來越討厭攻擊令人頭疼的Ajax開發,特別是忿忿地抱怨瀏覽器,因為這最終毫無結果,更得不到什麼好處。不過,這樣卻會讓你知道什麼對用戶最好,但你卻無法真正實現—因為這就相當於連一把好用的錘子都沒有,卻幻想著建設一套房子。GWT充分利用了已有的工具。例如,軟體工程中就有不少好用的“錘子”,而我們就非常奇怪,怎么就沒有人在Ajax開發中有效地使用它們呢。我們堅定地認為,確保Web應用程式持續改進的正確方法,就是利用優秀的軟體工程工具和已有的最佳實踐。GWT可以讓開發人員通過Java來編寫Ajax代碼,也利用了UI開發人員耳熟能詳的各種概念和模式,在開發中使用可驗證的開發環境,包括像Eclipse這樣具有代碼完成和重構工具的IDE,在真實的瀏覽器中運行並調試應用程式,並使用可靠的調試器,然後,再通過編譯器將全部Java代碼轉換成小型化但卻高性能的JavaScript代碼。而且,這些代碼可以應對絕大多數瀏覽器問題,甚至讓開發人員都毫無覺察。當然,也包括將各種從未想到過的操作平滑地轉換為JavaScript。GWT無意挑起趨勢和語言之爭,它只是一種實用的。能夠解決問題的方案。
為此,當我看到DavidGeary的這本書如其名的著作時,感到非常高興,因為本書側重於具體而實用的解決方案。本書與GWT的精神完全合拍。如果拋開用戶關心的問題不談,那么無論設計模式還是優雅的代碼都將無的放矢。David在本書中不僅提供了精心準備的各種示例,同時也向讀者展示了更高級的內容。而且,書中每個示例都能完美地適應兩個層面的套用。首先,通過這些示例可以學習到使用GWT構建用戶界面的過程,其中不僅融合了常見的模式,甚至還揭示出許多可能的缺陷。其次,書中每個解決方案都可以在實際項目中照樣子加以重用。因此,如果將來湧現的GWT應用程式中出現這些示例的影子,我一點也不會感到驚訝。我相信讀者也會認同這種高效率的方法。事實上,讀者對書中解決方案的評判標準,最好能像我對GWT給出的評判標準一樣:看手中的這本書對您創建滿足用戶需求的應用程式是否有用。