`
raymond.chen
  • 浏览: 1417782 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

通过GWT RPC实现客户端与服务器端的交互

    博客分类:
  • GWT
阅读更多

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;
		}
	}
}

 

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

/**
 * 异步接口的方法返回值均为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);
	}
}

 

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方法
}

 

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());
					}
				});
        
			}
		});
		
	}
}

 

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

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

<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>

       

分享到:
评论
2 楼 raymond.chen 2011-08-14  
这是GWT中RPC的处理机制,建议了解一下相关方面的原理
1 楼 woodhaojava 2011-08-08  
刚刚开始看GWT.
写的很详细,很清楚.
补充一下,第6点中,除了用XML配置,还可以在PersonService中使用注解:
@RemoteServiceRelativePath("personService")
public interface PersonService extends RemoteService ...

再请教一个问题,service,serviceAsync中的方法,为什么会存在那样的联系.
还有,后者是一个接口,实现类我们没有写,那他的getPerson,何以可以调用.
两个问题应该是一个类型.
原代码对我来说有点难度,麻烦看过的大神指点

相关推荐

    云应用开发 ——Google App Engine & Google Web Toolkit入门指南

    云应用开发 Google App Engine & Google Web Toolkit入门指南 侯炯 目录 第1章 应该了解下 1.1云基本知识 1.2Google App engine 1.3Google Web Toolkit ... 10.3.15手机端界面与功能实现 10.3.16总结

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包5

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包7

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包9

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包101

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Java资源包01

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

Global site tag (gtag.js) - Google Analytics