📅  最后修改于: 2021-01-02 12:31:24             🧑  作者: Mango
RPC(远程过程调用)有助于客户端与服务器进行通信。 RPC是从类调用方法的过程,但是,在此过程中,唯一的区别是该类位于服务器上,而不是客户端程序的实际部分。
RPC存在问题,因为JavaScript在Web浏览器中运行,并且来自浏览器的RPC调用会将浏览器挂起,直到收到响应为止。
为避免浏览器挂起,将GWT RPC调用设为“异步”,并且在等待响应时浏览器不会挂起。
GWT RPC的实现基于Java Servlet技术。从客户端调用的服务器端代码通常称为服务,而远程过程调用称为调用服务。
GWT应用程序中的RPC实现如下所示。
服务在客户端被称为定义所有服务方法的接口。由于可以在客户端使用服务,因此将其放在客户端程序包下。
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.javatpoint.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
SampleServlet
com.javatpoint.helloworld.server.SampleServiceImpl
SampleServlet
/samplewebapplication/sampleservice
编译文件:示例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.javatpoint.com/ uploads/ Javatpoint-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);
}
});
}
}
输出: