GWT RPC
Remote Procedure Calls前端
Google Web Toolkit的縮寫,有了 GWT可使用 Java 編程語言編寫 AJAX 前端,而後 GWT 會交叉編譯到優化的JavaScript 中,而 JavaScript 能夠自動在全部主要瀏覽器上運行。GWT容許開發人員使用 Java 編程語言快速構建和維護複雜但性能高的 JavaScript 前端應用程序,從而下降了開發難度,尤爲是與 Eclipse Google 插件結合使用時,優點更明顯web
GWT 經過很是簡單的 RPC 與服務器通訊編程
GWT支持一組開放的傳輸協議,例如 JSON 和 XML,但 GWT RPC 使全部 Java 通訊都特別輕鬆且有效。相似於傳統 JavaRMI,只需建立一個用於指定您要調用的遠程方法的接口。從瀏覽器調用遠程方法時,GWT RPC將自動串行化參數,並調用服務器上的適當方法,而後反串行化客戶端代碼的返回值。GWT RPC也將很是成熟,其能夠處理多態類層次結構、對象圖循環,甚至能夠跨網拋出異常json
建立GWT RPC鏈接的三個步驟:
1:建立接口繼承RemoteServive接口,而且建立自定義的RPC接口方法---服務接口
2:建立指定Servlet服務,經過繼承RemoteServiceServlet,而且實現1中建立的接口,並實現自定義方法
3:建立異步接口,與類名,方法名,參數相關的方式去建立接口方法,而後使用AsyncCallback<String> arg的方
式,給接口方法添加參數,用於回調函數.注意方法返回void
注意命名規範
服務接口與異步接口中類名必須符合規範
MyService ---實現的Servlet命名爲MyServiceImpl
MyServiceAsync --異步接口
在定義異步接口的方法時,必須保證方法名,參數名一致的狀況下,在參數部分再添加一個AsyncCallback參數
遠程的Servlet須要進行配置註解,以及須要在web.xml中進行配置Servlet,注意註解值須要和url-pattern同樣
@RemoteServiceRelativePath("myService").
<servlet>
<servlet-name>myServiceImpl</servlet-name>
<servlet-class>com.example.foo.server.MyServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServiceImpl</servlet-name>
<url-pattern>/com.example.foo.Foo/myService</url-pattern>
</servlet-mapping>
若是module在xml文件中使用了別名(rename-to attribute),那麼能夠不用包名
特別注意:須要將gwt-servlet.jar拷貝到web-inf/lib目錄下,以及將java輸出目錄爲/WEB-INF/classes.
編寫客戶端代碼進行調用RPC:
建立的方式仍是爲GWT.create()
1:聲明一個RPC接口對象的實例
MyEmailServiceAsync emailService = (MyEmailServiceAsync) GWT.create(MyEmailService.class);
2:編寫對應回調方法的實例
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Void result) {
// do some UI stuff to show success
}
public void onFailure(Throwable caught) {
// do some UI stuff to show failure
}
};
3:調用接口實例的方法
emailService.emptyMyInbox(fUsername, fPassword, callback);
也能夠直接使用參數中加入匿名實例的方式進行調用
使用集合時,須要使用@gwt.typeArgs <java.lang.String> 註釋指明返回結果,參數集合類型
如
List reverseListAndConvertToStrings(List c);
監聽RPC中的異常---包括 Checked Exceptions 和Unexpected Exceptions
手動發起異步的http請求---可用於json
Using HTTP in GWT
1:須要在xml文件加載<inherits name="com.google.gwt.http.HTTP" />
2:RequestBuilder是用於HTTP請求的核心類
RequestBuilder使用的方法
1:建立一個對象的實例
RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
構造方法的參數爲:請求方式,URL地址...(URL.encode()用於過濾URL)
2:建立對應的監聽函數對象 Request對象
Request request = builder.sendRequest(null, new RequestCallback() {
public void onError(Request request, Throwable exception) {
// Couldn't connect to server (could be timeout, SOP violation, etc.)
} //錯誤監聽
public void onResponseReceived(Request request, Response response) {
if (200 == response.getStatusCode()) {
// Process the response in response.getText()
} else {
// Handle the error. Can get the status text from response.getStatusText()
}
} //接收到返回信息
});
接收後可使用Response.getText(),來獲取內容.若是是xml或者json可使用類庫進行轉換
在RPC中調用時,若是有返回值,可使用onSuccess()方法的重載來實現
calService.getPeople(startRow, maxRows, new AsyncCallback<Person[]>() {
// When the RPC returns, this code will be called if the RPC fails
public void onFailure(Throwable caught) {
statusLabel.setText("Query failed: " + caught.getMessage());
acceptor.failed(caught);
}
// When the RPC returns, this code is called if the RPC succeeds
public void onSuccess(Person[] result) {
lastStartRow = startRow;
lastMaxRows = maxRows;
lastPeople = result;
pushResults(acceptor, startRow, result);
statusLabel.setText("Query reutrned " + result.length + " rows.");
}
});瀏覽器
轉載出處:http://hi.baidu.com/untra_/item/0942c0311ea36ee0a884289d服務器