GWT RPC实例

本文概述

  • GWT RPC机制
  • 创建服务
  • 实现服务
RPC(远程过程调用)有助于客户端与服务器进行通信。 RPC是从类调用方法的过程, 但是, 在此过程中, 唯一的区别是该类位于服务器上, 而不是客户端程序的实际部分。
RPC存在问题, 因为JavaScript在Web浏览器中运行, 并且来自浏览器的RPC调用会将浏览器挂起, 直到收到响应为止。
【GWT RPC实例】为避免浏览器挂起, 将GWT RPC调用设为“异步”, 并且在等待响应时浏览器不会挂起。
GWT RPC机制 GWT RPC的实现基于Java Servlet技术。从客户端调用的服务器端代码通常称为服务, 而远程过程调用称为调用服务。
GWT应用程序中的RPC实现如下所示。
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 RPC实例

文章图片
GWT RPC实例

文章图片

    推荐阅读