本文概述
- GWT RPC机制
- 创建服务
- 实现服务
RPC存在问题, 因为JavaScript在Web浏览器中运行, 并且来自浏览器的RPC调用会将浏览器挂起, 直到收到响应为止。
【GWT RPC实例】为避免浏览器挂起, 将GWT 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.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.srcmini.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滚动面板
- GWT根面板
- GWT RootLayoutPanel用法
- GWT PopupPanel用法
- GWT面板介绍
- GWT MVP用法实例
- GWT布局面板
- GWT JSON用法
- GWT JavaScript本机接口(JSNI)