通过GWT RPC实现客户端与服务器端的交互
GWT有两种与服务端进行交互的技术:GWT RPC和基于普通AJAX的远程交互技术。这里只介绍GWT RPC技术。
一个完整的RPC服务至少包含三个Java文件:
1、客户端远程接口类,需要继承RemoteService类
2、客户端远程接口类的异步类,异步类的名称格式是: 客户端远程接口类名 + Async 后缀
3、服务器端的远程接口类,需要继承RemoteServiceServlet类和实现客户端远程接口类
客户端相关的类必须位于client包及其子包下,服务器端相关的类必须位于server包及其子包下。
1、客户端远程接口类 源码
- /**
- * 客户端远程接口类需要继承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;
- }
- }
- }
/**
* 客户端远程接口类需要继承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、客户端远程接口类的异步类 源码
- /**
- * 异步接口的方法返回值均为void,并且其对应的每个方法都比原接口多一个类型为AsyncCallback的参数
- */
- public interface PersonServiceAsync {
- public void getPerson(String name, int age, AsyncCallback callback) throws RuntimeException;
- }
/**
* 异步接口的方法返回值均为void,并且其对应的每个方法都比原接口多一个类型为AsyncCallback的参数
*/
public interface PersonServiceAsync {
public void getPerson(String name, int age, AsyncCallback callback) throws RuntimeException;
}
3、服务器端的远程接口类 源码
- /**
- * 实现类要继承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);
- }
- }
/**
* 实现类要继承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、交互过程中传递的对象
- /**
- * 在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方法
- }
/**
* 在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接口,其源码如下
- 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());
- }
- });
- }
- });
- }
- }
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应用入口点类关联起来
- <servlet path="/PersonService" class="com.cjm.server.PersonServiceImpl"/>
<servlet path="/PersonService" class="com.cjm.server.PersonServiceImpl"/>
7、在web.xml文件增加以下配置信息
- <!-- 在宿主模式下启动应用时,此servlet是必须的 -->
- <servlet>
- <servlet-name>shell</servlet-name>
- <servlet-class>com.google.gwt.dev.shell.GWTShellServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>shell</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
- <!-- RPC服务配置 -->
- <servlet>
- <servlet-name>PersonService</servlet-name>
- <servlet-class>com.cjm.server.PersonServiceImpl</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>PersonService</servlet-name>
- <url-pattern>/PersonService</url-pattern>
- </servlet-mapping>
通过GWT RPC实现客户端与服务器端的交互的更多相关文章
- Android客户端和服务器端数据交互
网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...
- ajax+客户端与服务器端的交互
一. AJAX 原生JS var xhr=new XMLHttpRequest(); xhr.open("GET","[请求地址]",false); xhr.o ...
- 浅析Java web程序之客户端和服务器端交互原理(转)
转载自http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全 ...
- [转]HTTP报文接口及客户端和服务器端交互原理
1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务.该模型的目的 ...
- 浅析Java web程序之客户端和服务器端交互原理
原文链接: https://www.iteye.com/topic/470019 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考 ...
- GWT RPC
GWT RPC GWT RPCRemote Procedure Calls GWT: Google Web Toolkit的缩写,有了 GWT可以使用 Java 编程语言编写 AJAX 前端,然后 G ...
- GWT RPC机制
GWT RPC GWT RPCRemote Procedure Calls GWT: Google Web Toolkit的缩写,有了 GWT可以使用 Java 编程语言编写 AJAX 前端,然后 G ...
- zookeeper原理解析-客户端与服务器端交互
Zookeeper集群中server数量总是确定的,所以集群中的server交互采用比较可靠的bio长连接模型:不同于集群中sever间交互zookeeper客户端其实数量是未知的,为了提高zooke ...
- ASP.NET获取客户端、服务器端的信息
ASP.NET获取客户端.服务器端基础信息 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名: ...
随机推荐
- AppDelegate解析
当我们创建一个iOS项目,默认会有main.m类,这是一个程序的主入口.main.m方法体如下: #import <UIKit/UIKit.h> #import "AppDele ...
- 在ios开发中有多少常用的加密解密方式(备用)
最常用的是MD5和base64编码,还有DES 3DES AES加密 ios怎么实现RAS加密解密 最近几天折腾了一下如何在iOS上使用RSA来加密.iOS上并没有直接的RSA加密API.但是iOS提 ...
- 简谈ArrayList和LinkedList区别
对于ArrayList和LinkedList,他们都实现了List接口,他们的区别大致为: ArrayList LinkedList (1)底层是数组,可以以O(1)的时间复杂度对元素进行随机访问 以 ...
- 转:PHP – Best Practises
原文来自于:http://thisinterestsme.com/php-best-practises/ There are a number of good practises that you s ...
- 第 12 章 命令模式【Command Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描 ...
- Codeforces Round #197 (Div. 2) : D
这题也是一个线段树的水题: 不过开始题目没看明白,害得我敲了一个好复杂的程序.蛋疼啊.... 最后十几分钟的时候突然领悟到了题意,但是还是漏掉一个细节,老是过不去... 以后比赛的时候不喝啤酒了,再也 ...
- String 类型的相关转换
题目: what is the result of the expression 5.4+"3.2"? 答案: 当一个运算数为原始数据类型,另外一个为字符串时,则基本数据类型会转化 ...
- 不同框架实现的WebService的服务端获取HttpServletRequest的方法
一. 基于xfire实现的WebService HttpServletRequest request = XFireServletController.getRequest(); 二. 基于axis实 ...
- VC禁止在任务管理器中结束本进程
转自百度空间:http://hi.baidu.com/175943462/item/657905e13b73b70b8d3ea8bb 一提到进程保护特别是在Windows下,没有最安全,只有更安全.下 ...
- Windows Azure案例分析: 选择虚拟机或云服务?
作者 王枫 发布于2013年6月27日 随着云计算技术和市场的日渐成熟,企业在考虑IT管理和运维时的选择也更加多样化,应用也从传统部署方式,发展为私有云.公有云.和混合云等部署方式.作为微软核心的公有 ...