GWT有两种与服务端进行交互的技术:GWT RPC和基于普通AJAX的远程交互技术。这里只介绍GWT RPC技术。

一个完整的RPC服务至少包含三个Java文件:

1、客户端远程接口类,需要继承RemoteService类

2、客户端远程接口类的异步类,异步类的名称格式是: 客户端远程接口类名 + Async 后缀

3、服务器端的远程接口类,需要继承RemoteServiceServlet类和实现客户端远程接口类

客户端相关的类必须位于client包及其子包下,服务器端相关的类必须位于server包及其子包下。

1、客户端远程接口类 源码

  1. /**
  2. * 客户端远程接口类需要继承RemoteService类
  3. */
  4. public interface PersonService extends RemoteService {
  5. public Person getPerson(String name, int age) throws RuntimeException;
  6. //使用内部类创建客户端远程接口类的异步类
  7. public static class Utils{
  8. private static PersonServiceAsync serviceAsync;
  9. public static PersonServiceAsync getInstance(){
  10. if(serviceAsync==null){
  11. serviceAsync = (PersonServiceAsync) GWT.create(PersonService.class);
  12. }
  13. return serviceAsync;
  14. }
  15. }
  16. }
/**
* 客户端远程接口类需要继承RemoteService类
*/
public interface PersonService extends RemoteService {
public Person getPerson(String name, int age) throws RuntimeException; //使用内部类创建客户端远程接口类的异步类
public static class Utils{
private static PersonServiceAsync serviceAsync; public static PersonServiceAsync getInstance(){
if(serviceAsync==null){
serviceAsync = (PersonServiceAsync) GWT.create(PersonService.class);
}
return serviceAsync;
}
}
}

2、客户端远程接口类的异步类 源码

  1. /**
  2. * 异步接口的方法返回值均为void,并且其对应的每个方法都比原接口多一个类型为AsyncCallback的参数
  3. */
  4. public interface PersonServiceAsync {
  5. public void getPerson(String name, int age, AsyncCallback callback) throws RuntimeException;
  6. }
/**
* 异步接口的方法返回值均为void,并且其对应的每个方法都比原接口多一个类型为AsyncCallback的参数
*/
public interface PersonServiceAsync {
public void getPerson(String name, int age, AsyncCallback callback) throws RuntimeException;
}

3、服务器端的远程接口类 源码

  1. /**
  2. * 实现类要继承RemoteServiceServlet类
  3. */
  4. public class PersonServiceImpl extends RemoteServiceServlet implements PersonService {
  5. public Person getPerson(String name, int age) throws RuntimeException {
  6. //与HTTP的交互
  7. HttpServletRequest request = this.getThreadLocalRequest();
  8. HttpServletResponse response = this.getThreadLocalResponse();
  9. HttpSession session = request.getSession();
  10. return new Person(name, age);
  11. }
  12. }
/**
* 实现类要继承RemoteServiceServlet类
*/
public class PersonServiceImpl extends RemoteServiceServlet implements PersonService {
public Person getPerson(String name, int age) throws RuntimeException {
//与HTTP的交互
HttpServletRequest request = this.getThreadLocalRequest();
HttpServletResponse response = this.getThreadLocalResponse();
HttpSession session = request.getSession(); return new Person(name, age);
}
}

4、交互过程中传递的对象

  1. /**
  2. * 在GWT RPC中,如果要交互的数据(方法的参数和返回值)是一个复杂类型的话,
  3. * 那么这个类要实现IsSerializable接口,来使该类能被正常序列化和反序列化。
  4. */
  5. public class Person implements IsSerializable {
  6. private String name;
  7. private int age;
  8. public Person(){
  9. }
  10. public Person(String name, int age){
  11. this.name = name;
  12. this.age = age;
  13. }
  14. //省略getter、setter方法
  15. }
/**
* 在GWT RPC中,如果要交互的数据(方法的参数和返回值)是一个复杂类型的话,
* 那么这个类要实现IsSerializable接口,来使该类能被正常序列化和反序列化。
*/
public class Person implements IsSerializable {
private String name;
private int age; public Person(){ } public Person(String name, int age){
this.name = name;
this.age = age;
} //省略getter、setter方法
}

5、GWT应用入口点类需要实现EntryPoint接口,其源码如下

  1. public class Index implements EntryPoint {
  2. public void onModuleLoad() {
  3. Button button = new Button("Click me");
  4. VerticalPanel vPanel = new VerticalPanel();
  5. vPanel.setWidth("100%");
  6. vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
  7. vPanel.add(button);
  8. RootPanel.get().add(vPanel);
  9. //按钮的单击事件
  10. button.addClickListener(new ClickListener() {
  11. public void onClick(Widget sender) {
  12. //初始化Service接口
  13. PersonServiceAsync personService = PersonService.Utils.getInstance();
  14. //为Service代理描述Service接入点的URL
  15. ServiceDefTarget target = (ServiceDefTarget)personService;
  16. String path = GWT.getModuleBaseURL() + "PersonService";
  17. target.setServiceEntryPoint(path);
  18. //发出RPC请求
  19. personService.getPerson("cjm", 100, new AsyncCallback(){
  20. public void onSuccess(Object result) {
  21. Person person = (Person)result;
  22. Window.alert(person.getName());
  23. }
  24. public void onFailure(Throwable caught) {
  25. Window.alert(caught.getMessage());
  26. }
  27. });
  28. }
  29. });
  30. }
  31. }
public class Index implements EntryPoint {
public void onModuleLoad() {
Button button = new Button("Click me"); VerticalPanel vPanel = new VerticalPanel();
vPanel.setWidth("100%");
vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
vPanel.add(button); RootPanel.get().add(vPanel); //按钮的单击事件
button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
//初始化Service接口
PersonServiceAsync personService = PersonService.Utils.getInstance(); //为Service代理描述Service接入点的URL
ServiceDefTarget target = (ServiceDefTarget)personService;
String path = GWT.getModuleBaseURL() + "PersonService";
target.setServiceEntryPoint(path); //发出RPC请求
personService.getPerson("cjm", 100, new AsyncCallback(){
public void onSuccess(Object result) {
Person person = (Person)result;
Window.alert(person.getName());
} public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
}
}); }
}); }
}

6、在Index.gwt.xml文件中增加以下配置信息

将RPC服务与GWT应用入口点类关联起来

  1. <servlet path="/PersonService" class="com.cjm.server.PersonServiceImpl"/>
<servlet path="/PersonService" class="com.cjm.server.PersonServiceImpl"/>

7、在web.xml文件增加以下配置信息

  1. <!-- 在宿主模式下启动应用时,此servlet是必须的 -->
  2. <servlet>
  3. <servlet-name>shell</servlet-name>
  4. <servlet-class>com.google.gwt.dev.shell.GWTShellServlet</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>shell</servlet-name>
  8. <url-pattern>/*</url-pattern>
  9. </servlet-mapping>
  10. <!-- RPC服务配置 -->
  11. <servlet>
  12. <servlet-name>PersonService</servlet-name>
  13. <servlet-class>com.cjm.server.PersonServiceImpl</servlet-class>
  14. </servlet>
  15. <servlet-mapping>
  16. <servlet-name>PersonService</servlet-name>
  17. <url-pattern>/PersonService</url-pattern>
  18. </servlet-mapping>

通过GWT RPC实现客户端与服务器端的交互的更多相关文章

  1. Android客户端和服务器端数据交互

    网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...

  2. ajax+客户端与服务器端的交互

    一. AJAX 原生JS var xhr=new XMLHttpRequest(); xhr.open("GET","[请求地址]",false); xhr.o ...

  3. 浅析Java web程序之客户端和服务器端交互原理(转)

    转载自http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全 ...

  4. [转]HTTP报文接口及客户端和服务器端交互原理

    1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务.该模型的目的 ...

  5. 浅析Java web程序之客户端和服务器端交互原理

    原文链接: https://www.iteye.com/topic/470019 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考 ...

  6. GWT RPC

    GWT RPC GWT RPCRemote Procedure Calls GWT: Google Web Toolkit的缩写,有了 GWT可以使用 Java 编程语言编写 AJAX 前端,然后 G ...

  7. GWT RPC机制

    GWT RPC GWT RPCRemote Procedure Calls GWT: Google Web Toolkit的缩写,有了 GWT可以使用 Java 编程语言编写 AJAX 前端,然后 G ...

  8. zookeeper原理解析-客户端与服务器端交互

    Zookeeper集群中server数量总是确定的,所以集群中的server交互采用比较可靠的bio长连接模型:不同于集群中sever间交互zookeeper客户端其实数量是未知的,为了提高zooke ...

  9. ASP.NET获取客户端、服务器端的信息

    ASP.NET获取客户端.服务器端基础信息 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名: ...

随机推荐

  1. 【python之旅】python的基础三

    目录: 1.装饰器 2.迭代器&生成器 3.Json & pickle 数据序列化 4.软件目录结构规范  一.装饰器 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原 ...

  2. C++有关类的符号总结

    因为我先学习的java,尽管c++与java在类声明与使用上很相似,但是看到c++的源码还是有一些符号不太明白..现在就用一个例子总结一下: #include <iostream> cla ...

  3. 转载“用USBOOT制作DOS启动盘”

    使用软件: Usboot和MaxDOS_5.6s_U盘版. 由于我的U盘容量比较小,暂时只能做DOS启动功能,其它功能如Windows PE,等我以后测试成功后再补充说明. U盘是啥? 读音优盘,可以 ...

  4. 一个简单的makefile,一次性编译本文件夹下所有的cpp文件

    代码: CXX := g++ CFLAGS := -g TARGET := xxx.exe SRCS := $(wildcard *.cpp) OBJS := $(patsubst %cpp,%o,$ ...

  5. react + iscroll5

    react + iscroll5 经过几天的反复折腾,总算做出一个体验还不错的列表页了,主要支持了下拉刷新,上拉加载两个功能. 一开始直接采用了react-iscroll插件,它是基于iscroll插 ...

  6. 安装app到Simulator

    1.安装brew 打开命令行,执行以下命令: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install ...

  7. Accessing Scoped Variables

    To permit the JSP page to access the data, the servlet needs to use setAttribute to store the data i ...

  8. capitalize()在Python中含义

    Python为string对象提供了转换大小写的方法:upper() 和 lower(). 还不止这些,Python还为我们提供了首字母大写,其余小写的capitalize()方法, 以及所有单词首字 ...

  9. 修改sphinx最大输出记录数

    修改sphinx最大输出记录数 归纳如下: Sphinx的查询默认最大记录数是:1000,而我们想更改这个数值.就需要更改三个地方. 1是更改sphinx.conf配置文件的:max_matches ...

  10. Webx之表单验证

    引入服务器端表单验证service,是通过在webx.xml中通过服务引入的方式完成的.例如,在user相关信息的表单验证的产生过程是这样的:webx-user.xml通过 <beans:imp ...