Google Web Toolkit 新手常見問題

最近因為愛用公司貨的緣故,開始使用 Google Web Toolkit (GWT) 開發東西。不過因為 GWT 的文件並不是非常完整,有一些細節沒有提到,所以碰了不少問題。正好利用這篇文章來整理一下遇過的問題。

  • GWT 中的 Java 物件支援並非全部

GWT 雖然是讓程式設計師可以利用 Java 來寫 JavaScript 的程式,但它並不支援所有的 Java 物件,支援也不一定完整;所以如果可以的話,先把 Java Compiler 調整成 Java 1.4 相容的,問題會比較少;另外,像是 Date 這樣的物件,因為 JavaScript 裡面並不像 Java 有這麼多種,目前 GWT 只實作了 Date,同時也允許使用者用 Obsolete methods,結果就是在 Eclipse 裡免會出現很多警告訊息,略過不管就好了。

  • JavaScript Native Interface 使用上的小問題

JavaScript Native Interface (JSNI) 讓 Programmer 可以直接把已經寫好的 JavaScript 拿來照抄,不過很不幸的如果變數不是在這裡 method 內宣告的,記得都要加一個 $wnd 以便程式可以知道這是哪裡來的。例如,你先引入了 YUI 的元件來顯示動畫,並照著網站上的範例照抄:

YAHOO.example.init = function() {
var anim = new YAHOO.util.Anim(‘demo’, { width: {to: 500} });
YAHOO.util.Event.on(document, ‘click’, anim.animate, anim, true);
};

在 GWT 裡面應該寫成:

public native void doAnimation() /*-{

$wnd.YAHOO.example.init = function() {
var anim = new $wnd.YAHOO.util.Anim(‘demo’, { width: {to: 500} });
$wnd.YAHOO.util.Event.on($wnd.document, ‘click’, anim.animate, anim, true);
};

}-*/;

原本文件上沒有強調 document 也要加,要特別注意。

  • 使用 Web Service 時的路徑問題

GWT 可以整合 Java 的 Web Service,和 Java 本身的 Web Service 流程是很像的,只不過說明文件裡面沒有提到幾個小細節,會造成一些問題。

第一個是,範例中的 MyWebServiceImpl.java 應該要另外開一個 server 目錄,丟在 com.mycompany.MyApp.server 這個 package 裡面,而不能和 client 放在同一個目錄。如果放在同一個目錄,就會出現

The import com.google.gwt.user.server cannot be resolved

這個錯誤。這是因為 client 和 server 所用的 lib 是不同的,而我們的 web server implementation 不應該使用 client 的 lib。記得,server/ 目錄下只需要放 implementation class,其他都還是在 client/ 目錄,不然會有其他問題。

第二個,在 MyApp.GWT.xml 中,定義 時, class name 要用 fully qualified class name,不能只寫

class=”MyWebServiceImpl”

要寫成

class=”com.MyComany.MyApp.server.MyWebServiceImpl”

不然在執行時會出現

[ERROR] Unable to instantiate ‘MyWebServiceImpl’
java.lang.ClassNotFoundException: MyWebServiceImpl

  • 寫 Web Service 中的 Server Side 程式就不受 GWT 對 JAVA 支援的限制

GWT 的 web service 中的 server side 其實是用 Tomcat 的 servlet 完成的,所以就跟用 Tomcat 開發是一樣的,不受前面提到的 “GWT 中的 Java 物件支援並非全部” 的限制。講白話一點,就是在寫 MyWebServiceImpl.java (放在 server/ 目錄下那個) 時,就是完全支援 Java,不要像我一樣傻傻分不清 :~

  • 不要在 Server Side 的 Impl class 中亂加 constructor

雖然說 Server Side 的 Implementation Class (MyServiceImpl.java) 應該是隨便寫都可以, 但是因為 GWT 要去 load 它的緣故,  不要亂加有參數的 constructor, 不然可能會在執行 service 時發生 class load 不進來的錯誤。
如果還有遇到其他的再補充吧,GWT 是好物啊~