`
avery_leo
  • 浏览: 382284 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于Spring的远程访问与Web Service(二)

阅读更多

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>


(声明:本文部分内容来自《Spring Reference》和《Spring 2.0宝典》)

分享到:
评论

相关推荐

    基于Spring的远程访问与Web Service

    基于Spring的远程访问与Web Service

    Spring 实现远程访问详解——rmi

    Spring远程访问通过使用普通POJOs,能更容易的开发远程访问服务。目前,Spring远程访问的主要技术如下: 1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,...

    Spring 实现远程访问详解——jms和activemq

    前几章我们分别利用spring rmi、httpinvoker、httpclient、webservice技术实现不同服务器间的远程访问。本章我将通过spring jms和activemq实现单Web项目服务器间异步访问和多Web项目服务器间异步访问。 一. 简介 1. ...

    spring4.1核心包

    在基础IOC功能上提供扩展服务,此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层框架的支持。这个jar 文件为Spring 核心提供了大量扩展。可以找到使用...

    spring in action英文版

     6.1 Spring远程调用概览  6.2 与RMI一起工作  6.2.1 连接RMI服务  6.2.2 输出RMI服务  6.3 使用Hessian和Burlap的远程调用  6.3.1 访问Hessian/Burlap服务  6.3.2 用Hessian或Burlap公开Bean的...

    Spring中文帮助文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring API

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    spring security 参考手册中文版

    远程处理 - spring-security-remoting.jar 25 Web - spring-security-web.jar 25 配置 - spring-security-config.jar 26 LDAP - spring-security-ldap.jar 26 ACL - spring-security-acl.jar 26 CAS - spring-...

    Spring.net框架

    你真的了解Ioc与AOP吗? 收藏 你真的了解Ioc与AOP吗?我现在还不是很了解,而且越学习越发现自己了解的很少,Ioc与AOP中蕴涵了大量的能量等待我们去开发。在这个系列 中,我仅仅利用Sping.net这个框架向大家展示一下...

    Spring In Action 简体中文CHM版.rar

    Spring In Action 简体中文CHM版  很多你开发的应用会像被遗弃... 本册子将涉及与RMI一起工作、使用Hessian和Burlap的远程调用、JMS发送消息、使用Tile设计页面布局、保护Web应用程序、使用JAX-RPC的Web Service等。

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...

    BOS技术整理-05

    3.更易于实现缓存机制(第一次访问资源缓存,第二次访问资源,返回304客户端调用本地) JAX-RS整合spring服务器端开发 建立 maven web项目,演示RS整合spring服务发布 pom文件中导入坐标 web.xml配置...

    asp.net知识库

    ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 NET2.0系列介绍(一).NET 2.0 中Web 应用程序主题的切换 ASP.NET 2.0 中Web 应用程序主题的切换 2.0正式版中...

    BOS 技术整理

    服务器端Service和DAO编写整合springdatajpa 业务层接口 修改 Action 代码调用 Service 业务层实现类 在applicationContext添加一条 用来整合 Spring Data jpa 注意: 这里的扫描包,必须指定到类的上级包 ...

    SomeJava:将以往项目应用中各种框架、中间件的使用方式抽取出来,希望以后给刚接触直接运行,入门参考。。

    帮别人弄的一个框架Demo、基于maven构建、采用springMvc+springJdbc,特点是web层和service层分离,采用hessian实现远程交互,这样web和service可以分开部署,中间用代理服务器转发,实现一台web多个service节点提供...

    从Java走向Java+EE+.rar

    第16章 基于良好设计模式的Spring 243 16.1 Spring简介 243 16.2 实例——用Spring来打招呼 246 16.3 小结 248 第17章 JNDI和Java RMI远程调用 249 17.1 用Java RMI实现远程调用 250 17.2 利用JNDI定位...

    Amentet Monitoring Service:CORBA服务器监控服务-开源

    Amenetet监视服务监视向其注册的远程服务,双向使用心跳来监视远程服务的运行状况。... 该服务使用Spring Security Framework进行访问控制,并且可以配置为使用Spring Security Framework支持的任何身份验证授权系统。

    DWR中文文档.pdf

    DWR进阶 63 8.1 DWR Annotations 63 8.1.1 初始配置 63 8.1.2 远程访问类 63 8.1.3 对象转换 64 8.2 错误和异常处理 64 8.2.1 错误处理 64 8.2.2 异常 65 8.2.3 找出更多的信息 65...

    Java EE常用框架.xmind

    基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用 术语 XML. Extensible Markup Language -扩展性标记语言 WSDL – WebService Description Language – Web...

Global site tag (gtag.js) - Google Analytics