Google Web Toolkit (GWT) 在這篇Google Web Toolkit - 傻瓜也可以寫 AJAX ! 已經簡單介紹過了。建立一個 GWT 的 project 並不難,這裡我紀錄一下之前摸 GWT 提供的 Remote Procedure Calls (RPC) 的功能。

首先我們先知道,利用 GWT 建立出的網頁是屬於 AJAX 技術,就像是在瀏覽器內執行的應用程式。在 GUI 的部分我們可以做到這點,但是就算 GWT 製作的網頁,還是需要從 server 端取得資訊。而這個向 server 端溝通的技術就是 Remote Procedure Calls (RPC)。透過這層機制,我們可以將大部分的 GUI 邏輯移到 client 端,藉此可以增加效率,八啦八啦等許多很好的效果。在看架構圖之前,先了解 client 端執行的其實是 JavaScript,因此我們在用 Java 寫程式的時候會受到一些限制。而 server 端就可以運行真正的 Java,不會受像 client 端的限制。以下範例直接從 Google 官網貼上來,我自己的程式碼比較多,就不貼了。


這是整個 RPC 的架構圖,我們在實作的時候也需要按照這個架構。首先我們先從 client 端建立一個新的 service interface:

  public interface MyService extends RemoteService {
     public String myMethod(String s);
  }

注意的是我們要 extends RemoteService,在 com.google.gwt.user.client.rpc 裡面。接下來按照架構圖,我們建立一個對應的非同步的 interface。

  public interface MyServiceAsync {
     public void myMethod(String s, AsyncCallback callback);
  }

要注意的有兩點,第一點是名字要和之前的 interface 名字後面,加上 Async 。第二點是 myMethod 的回傳 type 必須是 void,且傳入的參數加上 AsyncCallback,這個一樣也在 com.google.gwt.user.client.rpc 裡面。client 端都搞定後,就要將這個 interface 實作,實作的地方就是在 server 端,別忘記要 extends RemoteServiceServlet。

  public class MyServiceImpl extends RemoteServiceServlet implements MyService {
    public String myMethod(String s) {
      // Do something interesting with 's' here on the server.
      return s;
    }
  }

都好了以後,接下來就可以呼叫這個服務了!

  public void menuCommandEmptyInbox() {
    MyService service = (MyServiceAsync) GWT.create(MyService.class);

    ServiceDefTarget endpoint = (ServiceDefTarget) service;
    String moduleRelativeURL = GWT.getModuleBaseURL() + "email";
    endpoint.setServiceEntryPoint(moduleRelativeURL);

    AsyncCallback callback = new AsyncCallback() {
      public void onSuccess(Object result) {
        // do some UI stuff to show success
      }

      public void onFailure(Throwable caught) {
        // do some UI stuff to show failure
      }
    };

    service.myMethod("test", callback);
  }

先建立 MyService,然後指定相對的 URL,接著宣告 asynchronous callback,最後將 callback 傳入我們的 method,就可以運作了。其中若此 Remote Procedure Call 成功的話,就會執行 onSuccess,反之執行 onFailure。如此一個最簡單的 RPC 就完成啦!先寫到這,下一篇寫 RPC 裡 Serializable Types 的部份。
創作者介紹

zwai 小窩

zwai 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • DANNY
  • 請問一下,那可以使用RPC來與資料庫溝通 撈取資料嗎?
  • 可以吧,RPC只是一個溝通方式阿,你要做什麼都可以才對。

    zwai 於 2008/09/17 23:17 回覆

找更多相關文章與討論