SmartGWT 入門

SmartGWT 概覽(文章來源https://www.ibm.com/developerworks/cn/web/1004_xucy_smartgwt1/)

用一句話來概括,SmartGWT 是封裝了 SmartClient 的 GWT API。而 SmartClient 是一個開源的企業級 Ajax 開發框架。

Google Web Toolkit 的發佈,大大降低了 Java 開發人員進行 Web 開發的門檻。然而 GWT 本身提供的控件及功能相對有限。因此出現了很多第三方開源擴展庫。很多擴展庫都利用 GWT,對現有的 JavaScript 庫做 Java 封裝,爲 GWT 提供了更多可用的 API。SmartGWT 是其中的佼佼者,它的底層使用 SmartClient 這個成熟的 Ajax 庫。SmartGWT 從 2008 年開始開發,一直處在非常活躍的發展狀態中。2009 年 12 月正式發佈了 2.0 版,已經成爲一個成熟的 Web 2.0 開發框架。

SmartGWT 不僅僅是“又一個 Web 控件庫”,它最大的特色在於提供了整合客戶端和服務器端數據的框架。由於底層的 SmartClient 實現了 Ajax 版本的 MVC 模式,這使得在 SmartGWT 中,後臺數據的集成是控件內置的能力,而不是需要用戶自己去組裝的模塊。需要處理多種類型,結構複雜的業務數據是企業級 Web 開發的特點和難點,SmartGWT 對數據操作的關注,大大簡化了企業級 Web2.0 應用開發的門檻。正是這一點讓 SmartGWT 與衆不同。在稍後的介紹中可以看到,一些相當複雜的典型數據應用,在 SmartGWT 中只需很少的代碼即可實現。

總體來看,SmartGWT 有如下特色:

  • 豐富的控件。很多較爲複雜的常用界面都被包裝成簡單易用的控件。比如可編輯的樹形表格、查詢常用的過濾器創建器和類似 Google Calendar 的日曆等等。
  • 內置的數據整合功能。利用 SmartClient 的 MVC 模式,用戶可以通過定義數據源(Data Source),很容易地開發出能對服務器端數據進行創建,更新,獲取和刪除操作的界面。甚至只要 10 行以內的代碼。
  • 支持 Skin。通過 Skin,用戶能定製整套風格一致的界面方案。只需在線切換,就可以換到全新的風格。

如此強大的功能是否上手也很難呢?否!基於 GWT 的 SmartGWT 是非常容易使用的,即使很炫的效果,實現代碼也非常簡短,Java 開發人員很快就可以做出炫目的 Web 應用。

SmartGWT 有四個不同的發行版:免費的 LGPL 版,收費的專業版,Power 版和企業版。除了許可證的區別外,功能上的區別主要體現在服務器端。LGPL 版是純粹的客戶端 GWT 庫,而其它的收費版本,同時提供了 Servlet,SQL 連接器等服務器端組件。本文主要介紹在 LGPL 版本中包含的客戶端 GWT API。


豐富的 UI 組件

SmartGWT 提供了極其豐富的 UI 組件。除了傳統的表單、菜單和對話框等組件之外,SmartGWT 還包含了具有排序、分頁、分組、過濾、彙總、打印預覽和實時更新功能的列表,組件元素間的拖拽,手風琴式分區和堆棧式佈局等。可以說,SmartGWT 是一個強大的“高級”組件庫。

下面我們介紹一些有特色的組件。這些例子都來自於 SmartGWT 發行版內自帶的 Showcase 這個示例應用。

  • Pick Tree

類似多級菜單的樹形選擇器。


圖 1. 樹形選擇器
圖 1. 樹形選擇器

清單 1. 樹形選擇器代碼實例

				 
 Tree tree = new Tree();    
…
 PickTreeItem departmentItem = new PickTreeItem(); 
 departmentItem.setValueTree(tree); 

 

  • TreeGird

樹和表格的組合,處理過複雜多級數據的人都想要的控件!


圖 2. 樹形表格
圖 2. 樹形表格

清單 2. TreeGrid 代碼實例

				 
 TreeGrid treeGrid = new TreeGrid(); 
 TreeGridField nameField = new TreeGridField("Name", 150); 
…
 treeGrid.setFields(nameField, jobField, employeeTypeField,employeeStatusField,  
                salaryField, genderField, maritalStatusField); 

 

  • 類似 Google Calendar 的日曆控件


圖 3. 日曆
圖 3. 日曆

清單 3. Calendar 代碼實例

				 
 Calendar calendar = new Calendar();  
 DataSource eventDS = new DataSource();  
 ... 
 calendar.setDataSource(eventDS);    

 

下面來看兩個複雜一點的例子。

  • 支持數據過濾的表格

如下圖所示,ListGrid 控件中顯示的數據能根據上面的 FilterBuilder 控件所設置的條件進行過濾。查詢條件可以是一個或多個,查詢條件之間可以選擇 and、or 和 not 三種邏輯運算符。


圖 4. 數據過濾器
圖 4. 數據過濾器

清單 4. 數據過濾代碼實例

				 
 FilterBuilder filterBuilder = new FilterBuilder();  
 ListGrid countryGrid = new ListGrid();  
 DataSource worldDS = new DataSource(); 
 ... 
 filterBuilder.setDataSource(worldDS); 
 countryGrid.setDataSource(worldDS);  

 IButton filterButton = new IButton("Filter");  
 filterButton.addClickHandler(new ClickHandler() {  
     public void onClick(ClickEvent event) {  
             countryGrid.filterData(filterBuilder.getCriteria());  
     }  
 });   

 

  • 支持公式計算和總結的表格

以下是展示國家人口面積等數據的表格。如果想顯示人口密度,顯然是需要計算人口除以面積。


圖 5. 原始表格
圖 5. 原始表格

實現如上表格的是 SmartGWT 的 ListGrid 控件,它內置了對公式和加總的支持。只需增加以下兩行代碼:


清單 5. 公式加總代碼實例

				 
 countryGrid.setCanAddFormulaFields(true);  
 countryGrid.setCanAddSummaryFields(true); 

 

在 Show Formula builder 這個按鈕中,我們只需要調用一個方法,一行代碼:


清單 6. 公式編輯支持代碼實例

				 
 public void onClick(ClickEvent event) {  
     countryGrid.addFormulaField();  
 }  

 

SmartGWT 爲你完成了其它全部功能。你只需點下按鈕,這時會顯示如下公式字段創建對話框,很容易即可實現人口密度這個計算而來的字段。


圖 6. 公式編輯器
圖 6. 公式編輯器

保存之後,即可在原先的表格上看到你添加的字段。是不是太容易了?


圖 7. 增加字段之後的表格
圖 7. 增加字段之後的表格

看了以上這些非常吸引人的 UI 組件,你是不是已經迫不及待開始想要使用 SmartGWT 了?


強大的數據集成功能

圖形控件和服務器端數據集成是 SmartGWT 的特色。SmartGWT 中包含一系列以數據爲中心的 UI 組件。比如 ListGrid,TreeGrid,DynamicForm 等等。利用這些控件,用戶可以很容易地開發出功能全面的數據操作界面。如下圖所示,可以對數據進行編輯和增加的應用,只需要幾十行代碼就能實現。


圖 8. 數據操作 UI 組件
圖 8. 數據操作 UI 組件

能支持這樣強大功能是因爲 SmartGWT 中封裝了 SmartClient 的 MVC(模型 - 視圖 - 控制器)模式。這是 SmartClient 這一 Ajax 框架的獨門絕技。實現數據整合的核心是控制器類數據源(DataSource),它爲 UI 組件這樣的視圖和後臺數據模型之間架起了互通的橋樑。


圖 9. SmartGWT 中的數據集成流程
圖 9. SmartGWT 中的數據集成流程

由上圖,從客戶端到服務器的數據訪問大體分爲兩個部分:

  1. UI 組件和數據源對象的交互
  2. 數據源對象和服務器實際數據提供者的交互

在 SmartGWT 中,第一種交互稱爲 數據綁定,第二種交互稱爲 數據集成。在本系列的後續兩篇文章中,我們將分別介紹這兩部分技術及應用。

數據源對象看起來像關係數據庫,在數據源內支持定義數據模型。數據源提供的每條數據稱爲一條記錄(Record),對應於數據庫中的一行。數據源內可以定義字段(Field),對應於數據庫中的列。不僅能定義每個字段的類型,還可以定義數據間關係,比如通過主外鍵關係來確定父子表。可見數據源類是一個完整的關係型數據的抽象表示。爲 UI 組件配置數據源後,對 UI 上的操作,數據源會自動進行相關數據的創建,更新,獲取和刪除等基本操作。

數據源和 UI 組件的鬆耦合模式帶來的另一個優勢是對於同一個數據源,可以同時有多種表示方式,而用戶在任一表示方式中對該數據源進行的操作,能同時更新到其它表示方式中,保持顯示數據的一致性。如下圖所示,員工數據在樹形表格控件和表格控件中同時顯示,在其中一個控件中對員工數據做修改,其更新能自動同步顯示到另一個控件中。


圖 10. 一個數據源,多種顯示方式
圖 10. 一個數據源,多種顯示方式

根據用戶的定製,數據源對象可以讀取 XML、JSON 或者數據庫等等服務器端數據。它把實際的數據來源和你的應用隔離開。帶來的好處之一就是易於測試。在測試的時候,你可以直接在數據源裏返回測試數據,而不用訪問真正數據源。使得測試代碼可以快速運行。而在真正運行時,切換不同的數據來源也非常簡單。

在 SmartGWT 的不同發行版中,最大的不同就是在服務器端的支持能力。在企業版中,提供了對常用的 Java 服務器端數據訪問技術的集成,比如 Hibernate。這樣用戶可以利用現有的 Java 數據服務開發新應用,或者快速爲現有的 Java 數據應用打造一個新的 SmartGWT 風格的界面。


SmartGWT 開發起步

SmartGWT 是基於 GWT 的 API,因此我們可以利用 GWT 所提供的開發工具來進行 SmartGWT 的開發。

Google 提供了方便 GWT 開發的 Eclipse 插件—— Google plugin for Eclipse。該插件可以支持開發 GWT 和 Google App Engine 程序,我們這裏只需利用其中的 GWT 部分。

開發環境環境搭建

  1. 安裝該插件,以 Eclipse 3.5 爲例。使用 Eclipse 中的軟件更新功能,通過以下更新站點來安裝該插件:http://dl.google.com/eclipse/plugin/3.5
  2. 下載 SmartGWT 2.0 壓縮包,並解壓到本地硬盤。
  3. 使用 Google 插件提供的嚮導,創建基於 GWT 的 Web 項目:

    圖 11. 創建 GWT 項目
    圖 11. 創建 GWT 項目
  4. 配置 SmartGWT 支持。首先將解壓後 SmartGWT 目錄中的 smartgwt.jar 加到該項目的類路徑中去。然後在 GWT 模塊描述文件(如上圖所建項目中應該是在源文件夾下的 com/sample/MyFirstSmartGWTProj.gwt.xml)增加一行:

    清單 7. 導入 SmartGWT 包
    				 
      <inherits name="com.smartgwt.SmartGwt" /> 
    

    基本配置至此已經完成,下一步,你就可以開始 SmartGWT 之旅。

探索示例代碼

學習 SmartGWT 最容易上手的方法就是探索發行版中的 Showcase 實例工程。在解壓後的 SmartGWT 目錄中,可以找到 Sample/Showcase/war/index.html,用瀏覽器打開即可在本地運行 SmartGWT Showcase 應用。

Showcase 應用的左邊欄分類列出了對各種功能的演示。選中某個功能,會在右邊打開新的演示。在每個演示的右上角,都有 View Source 這個按鈕。點擊它會彈出窗口顯示代碼。這裏顯示的代碼是完整的 SmartGWT 應用的代碼,直接將這些代碼 copy 到你的項目中,即可單獨運行使用。如下圖所示,非常方便實用。


圖 12. Showcase 的使用
圖 12. Showcase 的使用

嘗試運行示例

在生成的項目中,包含了可直接運行的 GWT 示例代碼,並且有相應和項目同名的運行設置。你可以通過 Eclipse 的運行下拉菜單來選擇運行這個 GWT 程序。讓我們改造一下該項目,並嘗試加入一些 SmartGWT 的實例代碼。假設我們的應用模塊名字是 Hello。

首先,修改項目 war 目錄下的和模塊名同名的 html 文件,即 Hello.html,這是該 Web 應用的入口網頁。我們按自己的需求來改造它,先清空 <body> 標籤,將原有的標題改成自己需要的或者去掉也可以。重要得是,需要在 <head> 標籤中,定義 SmartGWT 所需的全局變量 isomorphicDir,必須在調用其他 javascript 前,設置該變量爲“模塊名 /sc/”,SmartGWT 纔可以正確的找到所需的資源。


清單 8. 設置 isomorphicDir 變量

				 
 <script> var isomorphicDir = "Hello/sc/"; </script> 

 

然後,我們選擇一個 Showcase 中的簡單示例,比如 Forms 類別下的 Various Controls。通過 View Source 按鈕打開代碼,全部拷貝。然後打開項目中的入口類,即 Hello.java,將代碼全部貼入,將類名改回爲 Hello,使之編譯通過。

這時運行看一下效果,怎麼樣,跟 Showcase 裏看得的一模一樣吧?接下里,你可以嘗試修改一些代碼來學習它的使用。


總結

本文概括介紹了 SmartGWT 這一企業級 Web2.0 開發的新框架。SmartGWT 的強大功能是無法在這樣一篇短文中詳細描述的。我們將在後續文章中,通過示例,進一步介紹如何利用 SmartGWT 中的高級功能開發出複雜的企業 Web 應用。

 

發佈了62 篇原創文章 · 獲贊 9 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章