您的位置:首页 > 理论基础 > 计算机网络

用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

[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]
}
2.创建接口实现类
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]
3.创建服务发布描述文件
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]
4.配置DispatcherServlet
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]
完成以上工作后,服务器端的开发工作就完成了。下面用tomcat来发布这个服务,为了开发方便,我将在Tomcat的server.xml(位于%TOMCAT_HOME%conf/目录下)中配置一个虚拟路径,直接指向workplace中的HttpInvokerServer目录,代码如下::

<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]
}
3.创建invoker-client.xml

[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

附件下载:
  

演示程序源代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐