个性化阅读
专注于IT技术分析

GWT RPC实例

点击下载

本文概述

RPC(远程过程调用)有助于客户端与服务器进行通信。 RPC是从类调用方法的过程, 但是, 在此过程中, 唯一的区别是该类位于服务器上, 而不是客户端程序的实际部分。

RPC存在问题, 因为JavaScript在Web浏览器中运行, 并且来自浏览器的RPC调用会将浏览器挂起, 直到收到响应为止。

为避免浏览器挂起, 将GWT RPC调用设为“异步”, 并且在等待响应时浏览器不会挂起。


GWT RPC机制

GWT RPC的实现基于Java Servlet技术。从客户端调用的服务器端代码通常称为服务, 而远程过程调用称为调用服务。

GWT应用程序中的RPC实现如下所示。

GWT Rpc 1

创建服务

服务在客户端被称为定义所有服务方法的接口。由于可以在客户端获得服务, 因此将其放在客户端程序包下。

1)定义服务接口:我们将创建一个客户端Java接口, 该接口扩展RemoteService接口以开发新的服务接口。

SampleService.java

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("sampleservice")
public interface SampleService extends RemoteService{
String sayHello(String name); 
}

2)定义异步服务接口:除非在异步接口内部将void定义为返回类型, 否则上述服务将产生错误。该接口应该具有异步服务的回调对象。异步接口的名称应与服务接口相同, 后跟异步。

SampleServiceAsync.java

import com.google.gwt.user.client.rpc.AsyncCallback;

 public interface SampleServiceAsync { 
void sayHello(String name, AsyncCallback callback);
 }

3)异步回调和错误处理:此接口实现OnSuccess和OnFailure两种方法。在该类中, 该类从服务器接收回调并提供其功能。

SampleCallback.java

import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.rpc.AsyncCallback;
public class SampleCallback implements AsyncCallback {
@Override 
public void onFailure(Throwable caught) {
 Window.alert("Not able to process client request. Exception occurred at server: " + caught);
 }
@Override
 public void onSuccess(String result) {
 Window.alert("Client request processed successfully. Result from server: " + result)
 }
 }

实现服务

实现服务以执行一些处理以响应客户端请求。服务实现基于Servlet体系结构。

1)定义服务接口实现:GWT服务必须扩展RemoteServiceServlet类, 并应实现关联的服务接口。它扩展了RemoteServiceServlet而不是HttpServlet。数据的序列化由RemoteServiceServlet自动处理。

SampleServiceImpl.java

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 import com.srcmini.helloworld.client.service.SampleService;
public class SampleServiceImpl extends RemoteServiceServlet implements SampleService {
 @Override
public String sayHello(String name) {
 return "Hello " + name;
}
 }

2)更新服务条目:在此我们更新web.xml中的条目, 在其中定义servlet并映射URL。

web.xml

<!-- servlets -->
<servlet>
        <servlet-name> SampleServlet</servlet-name>
         <servlet-class> com.srcmini.helloworld.server.SampleServiceImpl </servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name> SampleServlet</servlet-name>
        <url-pattern>/samplewebapplication/sampleservice</url-pattern>
</servlet-mapping>

编译文件:示例WebApplicaion.java

public class SampleWebApplication implements EntryPoint, ClickHandler{
SampleServiceAsync sampleServiceAsync = GWT.create(SampleService.class); 
Label lbl; TextBox textBox;
/** * This is the entry point method. */
 		public void onModuleLoad() {
VerticalPanel verticalPanel = new VerticalPanel();
verticalPanel.setSize("100%", "100%"); verticalPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
verticalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
 				textBox = new TextBox();
 Button btn = new Button("Get Update from Server");  btn.addClickHandler(this);
 lbl = new Label("The text will be updated here.");
 Image image = new Image();
 				image.setUrl("https://www.srcmini02.com/ uploads/ srcmini-logo.png");
verticalPanel.add(textBox); verticalPanel.add(btn); verticalPanel.add(lbl); verticalPanel.add(image);
RootLayoutPanel.get().add(verticalPanel);
}
@Override
public void onClick(ClickEvent event) {
sampleServiceAsync.sayHello(textBox.getText(), new AsyncCallback() {
@Override
public void onFailure(Throwable caught) {
// handle failure from server.
 Window.alert("Exception Received from server.");
}
@Override
 public void onSuccess(String result) { lbl.setText(result);
}
 });
 }
 }

输出:

GWT RPC 2
GWT RPC 3
赞(0)
未经允许不得转载:srcmini » GWT RPC实例

评论 抢沙发

评论前必须登录!