zoukankan      html  css  js  c++  java
  • 用Http Invoker实现RCP客户端与后台的交互

    为了解决RCP客户端与后台业务层交互的问题,我找到了Spring提供的Http Invoker。给我的感觉就是:不用知道,一用吓一跳,居然会如此简单!为了确保文章简明性和程序的可运行性,我抽出了Http Invoker的基本框架,做了一个简单的演示程序来演示Http Invoker的工作过程(附源代码)。
     
    About Http Invoker
    Spring开发小组意识到在RMI服务和基于HTTP的服务(如HessianBurlap)之间的空白。一方面,RMI使用Java标准的对象序列化,但很难穿越防火墙;另一方面,Hessian/Burlap能很好地穿过防火墙工作,但使用自己私有的一套对象序列化机制。HTTP invoker是一个新的远程调用模型,作为Spring框架的一部分,来执行基于HTTP的远程调用(让防火墙高兴的事),并使用Java的序列化机制(让程序员高兴的事)。―――引自《Spring in Action中文版 
     
    还是“Grow up”的一贯风格,在开始之前先给大家看一个漂亮的演示图,从图中获得一个总体的映像,不至于一顿“神编(指埋头写代码)”后不知道自己在干啥。
     
    从图中可以清晰的看出,客户端通过读取Invoker-client.xmlInvoker-client.xml配置内容见下面的内容)来了获得远程访问的信息,请求提供后,(如提交了:some.service,将由Web.xml中配置的dispatcherServlet来处理service请求,并把它转发到相应的组件上。服务器接受到请求后,根据Service-config的配置信息,对请求进行处理,相应用户请求。从图中可以看出客户端和服务器端必须同时提供服务的接口“IhelloService”类。至于为何要这样,如果感兴趣可以去查一下文档,但有一点非常明确,如果客户端没有与服务器对应的接口类,你将无法在你的程序中编写调用远程服务的方法。不理解没关系,这点会在稍后的介绍中继续说明。
    要实现Http Invoker的完整演示,我们需要进行服务器端和客户端两部分的开发。
    第一部分:服务器端的开发
    1.在eclipse中新建web项目,在classpath中加入spring.jar,并拷贝到lib目录下。创建提供服务的接口类
    IhelloService.java
    public interface IHelloService {
     
    //为了演示方便,只提供一个服务,你可以在添加你想发布的任何服务
    //这个服务负责对前台传入的nameHello
        public String doHelloService(String name);
    }
    2.创建接口实现类
    helloServiceImpl.java
    public class HelloServiceImpl implements IHelloService {
        public String doHelloService(String name) {
            return "Hello "+name + ",this is the result for your request";
        }
    }
    3.创建服务发布描述文件
     Service-config.xml
    <bean id="urlMapping"    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <prop key="/some.service">serviceExporter</prop>
                </props>
            </property>
    </bean>
    <!—-配置要发布的服务类-->
        <bean id="helloService"
              class="edu.bjtu.invokerServer.HelloServiceImpl"/>
     
    <!—-HttpInvokerServiceExporter 发布服务-->
    <bean id="serviceExporter"
    class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
            <property name="service" ref="helloService"/>
            <property name="serviceInterface"
                   value="edu.bjtu.invokerServer.IHelloService"/>
        </bean>
    </beans>
    4.配置DispatcherServlet
    web.xml
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>
               org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
            <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>/WEB-INF/service-config.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>*.service</url-pattern>
        </servlet-mapping>
    完成以上工作后,服务器端的开发工作就完成了。下面用tomcat来发布这个服务,为了开发方便,我将在Tomcatserver.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拷贝到相应的包下。
    2InvokerClient.java
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.
                  support.ClassPathXmlApplicationContext;
     
    public class InvokerClient {
        public static void main(String[] args) {
            ApplicationContext context =
                new ClassPathXmlApplicationContext(
                        "invoker-client.xml");
    //在此引入了服务接口类,只有在客户端有了这个接口类,才能调用远程的服务
            IHelloService service =
                (IHelloService) context.getBean("helloServiceProxy");
            String result = service.doHelloService("ZHAO YUAN");
            System.out.println(result);
        }
    }
    3.创建invoker-client.xml
       <!-- 客户端能够使用下面的代理连接到远程服务 -->
        <bean id="helloServiceProxy"
             class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
            <property name="serviceUrl"
               value="http://59.64.8.33:8080/invoker/some.service"/>
            <property name="serviceInterface"
                value="edu.bjtu.invoker.IHelloService"/>
        </bean>
       <!-- 注意serviceUrl的值,这是一个标准的http请求。如果在本机测试可以把IP地址改成localhost -->
    </beans>
     
    第三步,运行演示
     
    启动Tomcat服务器,可以直接在eclipse中运行InvokerClient.java,此时在控制台输出:
    Hello ZHAO YUAN, this is the result for your request
    如果你看到输出,表示你成功了。
    通过上面的演示我们已经实现了http invoker的前后台通信,我们可以把客户端调用的代码嵌入到RCP中,这样就可以实现RCP与后台服务的交互。这在理论和实践上都是没有问题的,但是因为各自项目的需求不同,在实际开发中你仍会遇到很多问题, 这就要考验你解决问题的能力了。
    在以后的文章中我会接续就RCP中使用http invoker进行讨论。
    为了大家能以最快的速度获得一个感性的认识,我把文中的源代码附上,希望能对你有所帮助。源代码在MyEclipse5.1.1apache-tomcat-5.5.17上测试通过。

    本文出自 “Grow up” 博客,出处http://growup.blog.51cto.com/229061/50412  

    附件下载:
      演示程序源代码 
     

  • 相关阅读:
    JavaScript ---Function
    win7(x64)安装scrapy框架
    [转]mysql性能优化-慢查询分析、优化索引和配置
    [原创]win7环境下搭建eclipse+python+django开发环境
    [原创]Python/Django使用富文本编辑器XHeditor上传本地图片
    Ubuntu下mysql使用
    [整理] mysql操作
    [原创]Sql2008 使用TVP批量插入数据
    一个js获取数组下标的函数
    深入理解js的prototype以及prototype的一些应用
  • 原文地址:https://www.cnblogs.com/chenying99/p/2555660.html
Copyright © 2011-2022 走看看