zoukankan      html  css  js  c++  java
  • Spring 企业级开发应用AXIS和spring的远程服务整合的应用

    Spring框架对远程访问技术提供了很好的集成机制,Spring目前支持的技术包括:
    1. Remote Method Invocation (RMI)。

    通过 RmiProxyFactoryBean和RmiServiceExporter,Spring支持以java.rmi.Remote和java.rmi.RemoteException 定义的传统RMI接口,提供经由RMI的透明访问;
    2.Spring内置的HTTP invoker远程调用机制。

    Spring开发团队意识到在RMI服务和基于HTTP的服务(如Hessian和Burlap)之间的空白。一方面,RMI使用Java标准的对象序列化,但很难穿越防火墙;另一方面,Hessian/Burlap能很好地穿过防火墙工作,但使用自己私有的一套对象序列化机制。因此,Spring的HTTP invoker应运而生。HTTP invoker是一个全新的远程调用模型,作为Spring框架的一部分,来执行基于HTTP的远程调用(可穿越防火墙),并使用Java的序列化机制(从而降低开发工作的难度)。当参数或返回值是复杂类型,并且不能通过Hessian的序列化机制序列化时,Http invoker就很有优势。 Spring中相应的支持类是HttpInvokerProxyFactoryBean和HttpInvokerServiceExporter;
    3.Hessian。

    作为一个轻量级分布式组件技术,Hessian采用了自己定义的二进制协议,这似乎与目前业界大量应用SOAP的趋势背道而驰,但对于一些简单的远程访问服务,Hessian足够应对。在Spring中,通过HessianProxyFactoryBean和HessianServiceExporter两个类,我们可以透明地将需要对外提供的服务发布出去,当然这里依旧采用Caucho这家来自California的公司的二进制协议;
    4.Burlap。

    Burlap可以说是Hessian的XML版本。Spring中的支持类包括BurlapProxyFactoryBean和BurlapServiceExporter;
    5.JAX RPC(Java APIs for XML-based Remote Procedure Call)。

    Spring支持通过JAX RPC访问的Web Service。事实上,Spring对于Web Service的封装相当简单,Spring提供了一个代理工厂Bean:JaxRpcPortProxyFactoryBean,能让你在应用中无缝集成一个web sevice,作为另一个Bean的协作者,JaxRpcPortProxyFactoryBean类用JAX-RPC来访问远程Web Service。
    6.JMS。

    Spring中对应的支持类包括JmsInvokerServiceExporter和JmsInvokerProxyFactoryBean。

        这里,我们着重讨论一下Spring对于Web Service的支持。这种支持包括两方面:
        第一,基于JAX-RPC发布Web Service。
        第二,访问Web Service。

        对于需要发布为Web Service的业务逻辑bean,只需要继承Spring的ServletEndpointSupport 类即可。假设有如下业务接口以及相应的实现类:
    public interface SayHello
    {
      public String sayHello(String who); 
    }
    public class SayHelloImpl implements SayHello
    {
      public String sayHello(String who)
      {
          return "Hello,"+who;
      }
    }
    如果需要将SayHelloImpl 发布为Web Service,则需要编写一个Web Service类,让该类实现SayHello接口,并继承ServletEndpointSupport类。示例如下:

    public class SayHelloEndPoint extends ServletEndpointSupport implements SayHello
    {
          
      private SayHello sh;

      protected void onInit()
      {
          this.sh = (SayHello) getWebApplicationContext().getBean("sayHello");
      }

      //将业务逻辑bean的业务方法公开发布为WebService
      public String sayHello(String who) throws RemoteException
      {
          return sh.sayHello(who);
      }
    }
        
        而后,定义Spring的配置文件,在配置文件中部署业务bean,示例如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
      "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
      <bean id="sayHello" class="com.ws.SayHelloImpl">
            <property name=>
      </bean >
    </beans>

        然后修改web.xml文件,让AxisServlet拦截某些请求 ,示例如下:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD WebApplication 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
        <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>

        <!-- 定义AxisServlet-->
      <servlet>
          <servlet-name>AxisServlet</servlet-name>
          <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
      </servlet>

          <!-- 映射AxisServlet-->
          <servlet-mapping>
                <servlet-name>AxisServlet</servlet-name>
                <url-pattern>/axis/*</url-pattern>
          </servlet-mapping>
    </web-app>

        在上述配置文件中,可以看到所有匹配/axis/*模式的请求都由AxisServlet处理。即:Spring发布的Web Service都在放在axis路径下。
        然后编写WSDL文件,或者使用工具生成。WSDL文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- wsdl的根元素,包含schema等信息-->
    <deployment xmlns="http://xml.apache.org/axis/wsdd/
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <!-- wsdl的全局配置-->
          <globalConfiguration>
                <parameter name="adminPassword" value="admin"/>
                <parameter name="sendXsiTypes" value="true"/>
                <parameter name="sendMultiRefs" value="true"/>
                <parameter name="sendXMLDeclaration" value="true"/>
                <parameter name="axis.sendMinimizedElements" value="true"/>
                <requestFlow>
                      <handler type="java:org.apache.axis.handlers.JWSHandler">
                            <parameter name="scope" value="session"/>
                      </handler>
                      <handler type="java:org.apache.axis.handlers.JWSHandler">
                            <parameter name="scope" value="request"/>
                            <parameter name="extension" value=".jwr"/>
                      </handler>
                </requestFlow>
          </globalConfiguration>
          <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
          <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
          <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
          <!-- 定义WebService的管理台-->
          <service name="AdminService" provider="java:MSG">
                <parameter name="allowedMethods" value="AdminService"/>
                <parameter name="enableRemoteAdmin" value="false"/>
                <parameter name="className" value="org.apache.axis.utils.Admin"/>
                <namespace>http://xml.apache.org/axis/wsdd/</namespace>
          </service>
          <!-- 定义自己的WebService-->
          <service name="SayHelloService" provider="java:RPC">
                <parameter name="allowedMethods" value="*"/>
                <!-- 定义WebService的实现类-->
                <parameter name="className" value="com.ws.SayHelloEndpoint"/>
          </service>
          <!-- 定义WebSerivice的系统服务。-->
          <service name="Version" provider="java:RPC">
                <parameter name="allowedMethods" value="getVersion"/>
                <parameter name="className" value="org.apache.axis.Version"/>
          </service>
          <transport name="http">
                <requestFlow>
                      <handler type="URLMapper"/>
                      <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
                </requestFlow>
          </transport>
          <transport name="local">
                <responseFlow>
                      <handler type="LocalResponder"/>
                </responseFlow>
          </transport>
    </deployment>

    经过上述这些步骤,可将部署在Spring的普通业务逻辑bean发布成Web Service。


      Spring发布的Web Service是标准的基于SOAP协议的Web Service。因此可以使用标准客户端访问,也可以利用IoC容器来管理Web Service,利用IoC容器时,必须借助于JaxRpcPortProxyFactoryBean。
    使用标准客户端访问Web Service非常简单,只需要获得WebService的URL以及方法名即可。根据上面的发布,知道Web Service的URL如下:http://localhost:8080/axis-spring/axis/SayHelloService,则客户端代码示例如下:

    public class WebServiceClient
    {
      public static void main(String args[])
      {
          System.out.println("开始调用WebService");     
          try
          {
              //WebService所在的URL
              String endpoint = "http://localhost:8080/axis-spring/axis/SayHelloService";
              //创建Service对象,Service对用用于创建Call对象
              Service service = new Service();
              //创建Call对象,Call对象用于调用服务
              Call call = (Call)service.createCall();
            //为Call对象设置WebService的url
              call.setTargetEndpointAddress(new java.net.URL(endpoint));
              //为Call对象设置调用的方法名
              call.setOperationName("sayHello");
              //调用WebService的方法,并获得返回值
              String s = (String)call.invoke(new Object[] {"刘德华"});

              System.out.println(s);
          }
          catch (Exception e)
          {
              System.out.println(e.toString());
          }
          System.out.println("调用Web Service正常结束");     
    }
    }

    而如果利用IoC容器管理WebService,必须借助于JaxRpcPortProxyFactoryBean类,该类是个工厂bean,与所有的工厂bean一样,对该bean的请求将返回它的产品。
    配置JaxRpcPortProxyFactoryBean,只需提供WebService的URL、命名空间等必需信息,将可以返回Web Service服务。在Spring配置文件中JaxRpcPortProxyFactoryBean的定义如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
          <!-- 配置测试bean-->
      <bean id="test" class="com.ws.Test">
          <property name="sayHello">
              <ref local="sayHelloService"/>
          </property>
    </bean>
    <!-- 配置WebService bean-->
      <bean id="sayHelloService" class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">
                <!-- 配置WebService实现的接口-->
          <property name="serviceInterface">
              <value>com.ws.SayHello</value>
          </property>
                <!-- 配置WebService的wsdl的URL-->
          <property name="wsdlDocumentUrl">
              <value>http://localhost:8080/axis-spring/axis/SayHelloService?wsdl</value>
          </property>
                <!-- 配置WebService的命名空间uri-->
          <property name="namespaceUri">
              <value>http://localhost:8080/axis-spring/axis/SayHelloService</value>
          </property>
                <!-- 配置WebService的服务名-->
          <property name="serviceName">
              <value>SayHelloService</value>
          </property>
                <!-- 配置WebService的portName-->
          <property name="portName">
              <value>SayHelloService"</value>
          </property>
      </bean>
    </beans>

  • 相关阅读:
    软件工程第三次作业-需求分析-第八组(秃头特工队)
    软工第一次作业
    《机器学习》第一次作业——第一至三章学习记录和心得
    软工第一次作业
    《机器学习》第一次作业——第一至三章学习记录和心得
    20201116 新小组 2019南京icpc重现 总结(3小时)
    软工第一次作业
    网络流
    软工实践个人总结
    2020软工实践第二次结对作业
  • 原文地址:https://www.cnblogs.com/chenying99/p/2555591.html
Copyright © 2011-2022 走看看