用Http Invoker实现RCP客户端与后台的交互
2012-06-20 08:55
337 查看
为了解决RCP客户端与后台业务层交互的问题,我找到了Spring提供的Http Invoker。给我的感觉就是:不用知道,一用吓一跳,居然会如此简单!为了确保文章简明性和程序的可运行性,我抽出了Http Invoker的基本框架,做了一个简单的演示程序来演示Http Invoker的工作过程(附源代码)。
About Http Invoker
[align=left]Spring开发小组意识到在RMI服务和基于HTTP的服务(如Hessian和Burlap)之间的空白。一方面,RMI使用Java标准的对象序列化,但很难穿越防火墙;另一方面,Hessian/Burlap能很好地穿过防火墙工作,但使用自己私有的一套对象序列化机制。HTTP invoker是一个新的远程调用模型,作为Spring框架的一部分,来执行基于HTTP的远程调用(让防火墙高兴的事),并使用Java的序列化机制(让程序员高兴的事)。―――引自《Spring in Action中文版 》[/align]
[align=left] [/align]
还是“Grow up”的一贯风格,在开始之前先给大家看一个漂亮的演示图,从图中获得一个总体的映像,不至于一顿“神编(指埋头写代码)”后不知道自己在干啥。
从图中可以清晰的看出,客户端通过读取Invoker-client.xml(Invoker-client.xml配置内容见下面的内容)来了获得远程访问的信息,请求提供后,(如提交了:some.service),将由Web.xml中配置的dispatcherServlet来处理service请求,并把它转发到相应的组件上。服务器接受到请求后,根据Service-config的配置信息,对请求进行处理,相应用户请求。从图中可以看出客户端和服务器端必须同时提供服务的接口“IhelloService”类。至于为何要这样,如果感兴趣可以去查一下文档,但有一点非常明确,如果客户端没有与服务器对应的接口类,你将无法在你的程序中编写调用远程服务的方法。不理解没关系,这点会在稍后的介绍中继续说明。
要实现Http Invoker的完整演示,我们需要进行服务器端和客户端两部分的开发。
第一部分:服务器端的开发
1.在eclipse中新建web项目,在classpath中加入spring.jar,并拷贝到lib目录下。创建提供服务的接口类
IhelloService.java
2.创建接口实现类
helloServiceImpl.java
3.创建服务发布描述文件
Service-config.xml
4.配置DispatcherServlet类
web.xml
完成以上工作后,服务器端的开发工作就完成了。下面用tomcat来发布这个服务,为了开发方便,我将在Tomcat的server.xml(位于%TOMCAT_HOME%conf/目录下)中配置一个虚拟路径,直接指向workplace中的HttpInvokerServer目录,代码如下::
第二部分,客户端的开发
1. 在eclipse中新建项目,在classpath中加入spring.jar,并拷贝到lib目录下。把前面创建的接口类IhelloService拷贝到相应的包下。
2.InvokerClient.java
3.创建invoker-client.xml
第三步,运行演示
启动Tomcat服务器,可以直接在eclipse中运行InvokerClient.java,此时在控制台输出:
如果你看到输出,表示你成功了。
通过上面的演示我们已经实现了http invoker的前后台通信,我们可以把客户端调用的代码嵌入到RCP中,这样就可以实现RCP与后台服务的交互。这在理论和实践上都是没有问题的,但是因为各自项目的需求不同,在实际开发中你仍会遇到很多问题, 这就要考验你解决问题的能力了。
在以后的文章中我会接续就RCP中使用http invoker进行讨论。
为了大家能以最快的速度获得一个感性的认识,我把文中的源代码附上,希望能对你有所帮助。源代码在MyEclipse5.1.1,apache-tomcat-5.5.17上测试通过。
本文出自 “Grow up” 博客,出处/article/4341911.html
附件下载:
演示程序源代码
About Http Invoker
[align=left]Spring开发小组意识到在RMI服务和基于HTTP的服务(如Hessian和Burlap)之间的空白。一方面,RMI使用Java标准的对象序列化,但很难穿越防火墙;另一方面,Hessian/Burlap能很好地穿过防火墙工作,但使用自己私有的一套对象序列化机制。HTTP invoker是一个新的远程调用模型,作为Spring框架的一部分,来执行基于HTTP的远程调用(让防火墙高兴的事),并使用Java的序列化机制(让程序员高兴的事)。―――引自《Spring in Action中文版 》[/align]
[align=left] [/align]
还是“Grow up”的一贯风格,在开始之前先给大家看一个漂亮的演示图,从图中获得一个总体的映像,不至于一顿“神编(指埋头写代码)”后不知道自己在干啥。
从图中可以清晰的看出,客户端通过读取Invoker-client.xml(Invoker-client.xml配置内容见下面的内容)来了获得远程访问的信息,请求提供后,(如提交了:some.service),将由Web.xml中配置的dispatcherServlet来处理service请求,并把它转发到相应的组件上。服务器接受到请求后,根据Service-config的配置信息,对请求进行处理,相应用户请求。从图中可以看出客户端和服务器端必须同时提供服务的接口“IhelloService”类。至于为何要这样,如果感兴趣可以去查一下文档,但有一点非常明确,如果客户端没有与服务器对应的接口类,你将无法在你的程序中编写调用远程服务的方法。不理解没关系,这点会在稍后的介绍中继续说明。
要实现Http Invoker的完整演示,我们需要进行服务器端和客户端两部分的开发。
第一部分:服务器端的开发
1.在eclipse中新建web项目,在classpath中加入spring.jar,并拷贝到lib目录下。创建提供服务的接口类
IhelloService.java
[align=left]public interface IHelloService {[/align] [align=left] [/align] [align=left]//为了演示方便,只提供一个服务,你可以在添加你想发布的任何服务[/align] [align=left]//这个服务负责对前台传入的name说Hello[/align] [align=left] public String doHelloService(String name);[/align] } |
helloServiceImpl.java
[align=left]public class HelloServiceImpl implements IHelloService {[/align] [align=left] public String doHelloService(String name) {[/align] [align=left] return "Hello "+name + ",this is the result for your request";[/align] [align=left] }[/align] [align=left]}[/align] |
Service-config.xml
[align=left]<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">[/align] [align=left] <property name="mappings">[/align] [align=left] <props>[/align] [align=left] <prop key="/some.service">serviceExporter</prop>[/align] [align=left] </props>[/align] [align=left] </property>[/align] [align=left]</bean>[/align] [align=left]<!—-配置要发布的服务类-->[/align] [align=left] <bean id="helloService"[/align] [align=left] class="edu.bjtu.invokerServer.HelloServiceImpl"/>[/align] [align=left] [/align] [align=left]<!—-用HttpInvokerServiceExporter 发布服务-->[/align] [align=left]<bean id="serviceExporter"[/align] [align=left]class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">[/align] [align=left] <property name="service" ref="helloService"/>[/align] [align=left] <property name="serviceInterface"[/align] [align=left] value="edu.bjtu.invokerServer.IHelloService"/>[/align] [align=left] </bean>[/align] [align=left]</beans>[/align] |
web.xml
[align=left] <servlet>[/align] [align=left] <servlet-name>dispatcherServlet</servlet-name>[/align] [align=left] <servlet-class>[/align] [align=left] org.springframework.web.servlet.DispatcherServlet[/align] [align=left] </servlet-class>[/align] [align=left] <init-param>[/align] [align=left] <param-name>contextConfigLocation</param-name>[/align] [align=left] <param-value>/WEB-INF/service-config.xml</param-value>[/align] [align=left] </init-param>[/align] [align=left] <load-on-startup>1</load-on-startup>[/align] [align=left] </servlet>[/align] [align=left] <servlet-mapping>[/align] [align=left] <servlet-name>dispatcherServlet</servlet-name>[/align] [align=left] <url-pattern>*.service</url-pattern>[/align] [align=left] </servlet-mapping>[/align] |
<Context path="/invoker" docBase="D:\j2ee\workspace\HttpInvokerServer\WebContent" reloadable="true" debug="0" /> |
1. 在eclipse中新建项目,在classpath中加入spring.jar,并拷贝到lib目录下。把前面创建的接口类IhelloService拷贝到相应的包下。
2.InvokerClient.java
[align=left]import org.springframework.context.ApplicationContext;[/align] [align=left]import org.springframework.context.[/align] [align=left] support.ClassPathXmlApplicationContext;[/align] [align=left] [/align] [align=left]public class InvokerClient {[/align] [align=left] public static void main(String[] args) {[/align] [align=left] ApplicationContext context =[/align] [align=left] new ClassPathXmlApplicationContext([/align] [align=left] "invoker-client.xml");[/align] [align=left]//在此引入了服务接口类,只有在客户端有了这个接口类,才能调用远程的服务。[/align] [align=left] IHelloService service =[/align] [align=left] (IHelloService) context.getBean("helloServiceProxy");[/align] [align=left] String result = service.doHelloService("ZHAO YUAN");[/align] [align=left] System.out.println(result);[/align] [align=left] }[/align] } |
[align=left] <!-- 客户端能够使用下面的代理连接到远程服务 -->[/align] [align=left] <bean id="helloServiceProxy"[/align] [align=left] class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">[/align] [align=left] <property name="serviceUrl"[/align] [align=left] value="http://59.64.8.33:8080/invoker/some.service"/>[/align] [align=left] <property name="serviceInterface"[/align] [align=left] value="edu.bjtu.invoker.IHelloService"/>[/align] [align=left] </bean>[/align] [align=left] <!-- 注意serviceUrl的值,这是一个标准的http请求。如果在本机测试可以把IP地址改成localhost -->[/align] </beans> |
启动Tomcat服务器,可以直接在eclipse中运行InvokerClient.java,此时在控制台输出:
Hello ZHAO YUAN, this is the result for your request |
通过上面的演示我们已经实现了http invoker的前后台通信,我们可以把客户端调用的代码嵌入到RCP中,这样就可以实现RCP与后台服务的交互。这在理论和实践上都是没有问题的,但是因为各自项目的需求不同,在实际开发中你仍会遇到很多问题, 这就要考验你解决问题的能力了。
在以后的文章中我会接续就RCP中使用http invoker进行讨论。
为了大家能以最快的速度获得一个感性的认识,我把文中的源代码附上,希望能对你有所帮助。源代码在MyEclipse5.1.1,apache-tomcat-5.5.17上测试通过。
本文出自 “Grow up” 博客,出处/article/4341911.html
附件下载:
演示程序源代码
相关文章推荐
- 用Http Invoker实现RCP客户端与后台的交互 推荐
- nodejs 原生代码实现http 服务器和客户端并交互
- javascript 中XMLHttpRequest 实现前台向后台的交互
- 利用eWebEditor提供的Client API实现在客户端与编辑器的交互(转自http://www.ewebeditor.net/documentation/)
- 远程服务HttpInvoker源码解析(五)客户端实现
- SpringHttpInvoker解析3-客户端实现
- 【Jetty Server 开发系列之一】搭建Jetty Server环境&&Http客户端实现交互
- Android之使用HttpPost提交数据到服务器(Android手机客户端和后台服务器交互)
- 【Jetty Server 开发系列之一】搭建Jetty Server环境&&Http客户端实现交互
- 关于http和serverlet实现服务器和客户端的交互
- Android使用SAX实现XML解析,使用text/xml格式与后台交互
- 使用springmvc实现网页前端与后台的数据交互
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分)
- 左右互搏,基于http的xml消息的服务器和客户端实现
- php与ajax交互——实现php实时返回结果给ajax,并在后台保持继续运行的方法
- iOS前端与后台交互技术实现及技术细节
- asp.net mvc 5.0 借助路由规则实现*.aspx与HttpHandler交互
- 1个月实现1个iOS客户端+后台服务端
- 通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分)