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. Things About 'extern'

    Note: All Learned From Here C和Objective-C的function前面都有个隐含的extern,对于function来说,有没有extern都无所谓,但变量不一样. ...

  2. 工作流(worfflow)

    -- 工作流(Workflow)就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务 ...

  3. C#中的委托事件的分析

    推荐:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 委托和事件在 .NET Framework 中的应用非常广泛,然而, ...

  4. Linq学习之旅——LINQ查询表达式

    1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 ...

  5. django入门教程(下)

    在两篇文章帮你入门Django(上)一文中,我们已经做了一个简单的小网站,实现了保存用户数据到数据库,以及从后台数据库读取数据显示到网页上这两个功能. 看上去没有什么问题了,不过我们可以让它变得更加完 ...

  6. JENKINS里,如何为SLAVE配置多个不同的JAVA环境?

    今天遇到这个问题了, 原来在MASTER配置里可以统一管理的,不管这个路径有没有在MASTER上. 这样一来,JENKINS在编译时,会优先选用环境变量里的JAVA版本,然后才是MAVEN里的JAVA ...

  7. 使用SparseArray代替HashMap

    HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performanc ...

  8. 在html中嵌入markdown

    在博客园网页里写markdown的时候, 某些特殊内容想加上自定义的css, 于是用<div class="xxx">包裹起来, 但是发现该<div>中的m ...

  9. leetcode面试准备:Contains Duplicate I && II

    1 题目 Contains Duplicate I Given an array of integers, find if the array contains any duplicates. You ...

  10. Android读取url图片保存及文件读取

    参考: 1.http://blog.csdn.net/ameyume/article/details/6528205 2.http://blog.sina.com.cn/s/blog_85b3a161 ...