`
zzc1684
  • 浏览: 1214148 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring的WebServiceTemplate访问WebService的方法及其本质原理

阅读更多

WebService客户端调用的本质就是将SAOP格式的XML通过通信协议发送到WebService的服务器端,然后接收服务器端返回的XML.

 

本文简单介绍一下如何通过Spring提供的WebServiceTemplate访问 Webservice,WebServiceTemplate与调用webservice的客户端已及webservice服务器端示意图如下(图片来源 于Spring in Action):

 

 

这里以SOAP over HTTP为例,开发步骤如下:

1,在Spring的配置文件中配置WebServiceTemplate,最简单的配置如下:

    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">  
        <property name="defaultUri" value="http://localhost:8080/prjCXFWS/services/SimpleServicePort"/>  
    </bean>     

 *这种配置省略了MessageFactory和messageSender的配置,Spring默认会使用SaajSoapMessageFactory和HttpUrlConnectionMessageSender.等同于下面的配置

    <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>  
    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">  
        <constructor-arg ref="messageFactory"/>  
        <property name="messageSender">  
            <bean class="org.springframework.ws.transport.http.HttpUrlConnectionMessageSender"/>  
        </property>  
        <property name="defaultUri" value="http://localhost:8080/prjCXFWS/services/SimpleServicePort" />  
    </bean>  

 还可以使用CommonsHttpMessageSender作为messageSender,它提供了设置timeout,用户名,密码等选项的功能.(需要使用commons-httpclient.jar和commons-codec.jar)
MessageFactory还可以使用AxiomSoapMessageFactory和DomPoxMessageFactory.

    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">  
        <property name="messageSender">  
         <bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender">  
          <property name="readTimeout" value="0" />  
         </bean>  
        </property>  
        <property name="defaultUri" value="http://localhost:8080/prjCXFWS/services/SimpleServicePort" />  
    </bean>  

 2,Java调用代码:传输的是SOAP XML.

    private static final String MESSAGE =  
           "<queryPeopleByID  xmlns=\"http://test.cxfws.com\">1231ss</queryPeopleByID> ";  
    public static void test() {  
        ApplicationContext ac = new ClassPathXmlApplicationContext("conf/wsAppcontext.xml");  
        WebServiceTemplate simpleService = (WebServiceTemplate) ac.getBean("webServiceTemplate");  
        StreamSource source = new StreamSource(new StringReader(MESSAGE));  
           StreamResult result = new StreamResult(System.out);          
           simpleService.sendSourceAndReceiveToResult(source, result);  
    }  

 *MESSAGE为需要发送到webservice服务器端的XML payload内容,SOAP body之内的XML内容.

Spring调用Webservice的另一种方法是通过Spring提供的JaxWsPortProxyFactoryBean,示意图如下(图片来源于Spring in Action):

Spring的配置如下:

    <bean id="simpleService"  
        class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">  
        <property name="serviceInterface"  
            value="com.cxfclient.test.SimpleService" />  
        <property name="wsdlDocumentUrl"  
            value="http://localhost:8080/prjCXFWS/services/SimpleServicePort?WSDL" />  
        <property name="namespaceUri" value="http://test.cxfws.com/" />  
        <property name="serviceName" value="SimpleServiceService" />  
        <property name="portName" value="SimpleServicePort" />  
    </bean>  

 **这种方式需要用工具通过Webservice 的wsdl文件生成客户端需要的一些Java类,如service的interface,参数类等等(如下面代码中的SimpleService,People类).
Java调用代码如下

    ApplicationContext ac = new ClassPathXmlApplicationContext("conf/wsAppcontext.xml");  
    SimpleService simpleService = (SimpleService) ac.getBean("simpleService");  
      
    People people = simpleService.queryPeopleByID("test");  
    System.out.println(people.getAge() + people.getName() + people.getPid());  

 关于更多客户端如何调用webservice,参照http://blog.csdn.net/kkdelta/article/details/3987591
对于服务器端,其本质也是接收符合SOAP规范的XML消息,解析XML,返回符合SOAP规范的XML,这里用一个servlet模拟webservice,代码如下:

    public class WSSimulator extends HttpServlet {  
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
        throws IOException {  
            System.out.println("doGet");  
            BufferedReader in = new BufferedReader(new InputStreamReader( request.getInputStream()));  
            String str;  
            while ((str = in.readLine()) != null) {  
                System.out.println(str); ##1  
            }  
            in.close();  
              
            String soapHeader = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">"   
                +"<SOAP-ENV:Header/><SOAP-ENV:Body>";  
            String soapPayload = "<xxx>yyy</xxx>";  
            String soapTail = "</SOAP-ENV:Body></SOAP-ENV:Envelope>";         
            response.getWriter().write(soapHeader + soapPayload + soapTail);  ##2     
        }  
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {  
            System.out.println("doPost");  
            doGet(request, response);  
        }  
    }  

 通过WebServiceTemplate将消息发送到这个servlet监听的url,可以更深理解Webservice的本质.
##1 str就是从客户端传输到服务器端的XML.##2将SOAP消息返回给客户端.
更多服务器端webservice的开发请参照http://blog.csdn.net/kkdelta/article/details/3984312

分享到:
评论

相关推荐

    Spring.Net开发WebService

    - Spring.NET提供了`WebServiceTemplate`类,方便在客户端测试SOAP服务。 - 对于RESTful服务,可以使用HTTP客户端库(如HttpClient)进行单元测试和集成测试。 6. **部署和发布**: - 将Spring.NET应用打包成ASP...

    spring mvc集成webservice

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、...通过理解Spring MVC的MVC模式,掌握Web服务的基本原理,以及学习如何在Spring环境中配置和调用Web服务,开发者可以构建更加灵活和可扩展的Web应用程序。

    spring.net整合webservice实例

    配置完成后,我们可以通过依赖注入获取到Web服务客户端,然后通过WebServiceTemplate调用Web服务方法。例如: ```csharp [Dependency] public IMyWebService MyWebService { get; set; } public void ...

    Spring+webservice例子

    1. **Spring SOAP Web Service**: 使用Spring的`WebServiceTemplate`或JAX-WS的`@WebService`注解创建SOAP服务。服务端通过定义接口和实现类,客户端通过调用这些接口实现数据交互。 2. **Spring配置文件**:XML...

    发布webService服务接口与spring整合教程

    1. **配置Spring上下文**:在Spring配置文件中,你需要声明一个WebServiceTemplate或Endpoint,这是Spring与Web Service交互的核心组件。例如,对于SOAP服务,你可以使用JaxWsPortProxyFactoryBean来配置服务端点。 ...

    springcloud feign 服务消费者 类似 webservice

    Spring Cloud Feign是Spring Cloud生态系统中的一个组件,它作为一个声明式的服务调用客户端,使得编写Web服务客户端变得简单。Feign的设计灵感来源于Netflix的Feign库,它的主要目的是简化微服务之间的通信,使得...

    基于Spring下的webservice

    在IT行业中,Spring框架是Java开发领域中广泛使用的开源框架,尤其在企业级应用开发中扮演着核心角色。它提供了一种优雅的方式来管理应用程序的组件,实现依赖注入,以及为各种服务提供支持,包括Web服务。Web服务是...

    Spring 实现webService

    在这个场景中,描述中提到的是基于Apache Axis的实现,这可能涉及到Spring与Apache Axis的集成,Axis是一个流行的SOAP(简单对象访问协议)Web服务框架。 1. **Spring与Apache Axis的集成**: - Spring与Apache ...

    spring boot2.1 webservice

    一旦添加了相应的依赖,如`spring-boot-starter-web-services`,Spring Boot 将自动配置必要的bean,如WebServiceTemplate,用于发送和接收SOAP消息。同时,它也支持XSD schema的定义和验证,确保数据交换的正确性。...

    Apache CXF2+Spring2.5轻松实现WebService

    Apache CXF和Spring提供了丰富的扩展点,可以集成如Spring Security来控制访问权限,使用Spring AOP来处理事务,以及通过CXF的拦截器机制来实现自定义的日志、验证等功能。 总结来说,Apache CXF 2与Spring 2.5的...

    spring中配置webservice及其基础开发(java).pdf

    spring中配置webservice及其基础开发(java).pdf

    spring中配置webservice及其基础开发(java).doc

    本文档主要讲述的是spring中配置webservice及其基础开发(java);

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

    Spring Web Services 是基于 Spring 框架的 Web 服务框架,主要侧重于基于文档驱动的Web服务,提供 SOAP 服务开发,允许通过多种方式创建 Web 服务。本章利用Apache CXF构建和开发webservice. 1. webservice远程...

    spring+webserviceClient

    【标题】"spring+webserviceClient"涉及到的关键技术是Spring框架与Web服务客户端的整合,主要探讨如何在Spring环境中创建和使用Web Service客户端。Web Service是一种基于SOAP协议的跨平台、跨语言的通信方式,而...

    spring.ws webservice

    Spring WS 是一个强大的Java库,专门用于构建基于SOAP(简单对象访问协议)的Web服务。它为开发人员提供了一个简洁的API,使得在Spring框架内创建和消费Web服务变得更为容易。Spring WS的核心特性包括契约优先的方法...

    Spring_WebService源码

    3. **创建Endpoint**: 实现服务业务逻辑,Spring-WS会自动将SOAP请求映射到相应的Java方法。 4. **配置并启动服务器**: 在Spring配置文件中配置Web服务,如端口、marshaller等,并部署到应用服务器。 5. **客户端...

    CXF2.7+Spring3 Java WebService 集成用例

    Spring 3引入了更多的改进,包括对JSR-330注解的支持,增强了AOP(面向切面编程)功能,以及更强大的数据访问组件。 3. **CXF与Spring集成的优势**: - **依赖注入(DI)**:Spring的DI允许CXF组件轻松地接收来自...

    axis2+spring webservice

    标题中的“axis2+spring webservice”指的是使用Apache Axis2框架与Spring框架集成来开发Web服务。Apache Axis2是Java环境中广泛使用的Web服务引擎,它提供了高性能、灵活且可扩展的架构。Spring框架则是一个全面的...

    使用spring远程调用服务端接口实现WebService功能

    在Java EE平台上,Spring框架提供了一种强大的方式来实现远程服务调用,特别是通过其HttpInvokerServiceExporter组件来实现基于HTTP的WebService功能。这个技术允许客户端和服务端通过HTTP协议进行通信,实现远程...

    CXF2+Spring2.5开发WebService实例

    在本文中,我们将深入探讨如何使用Apache CXF 2与Spring 2.5框架来开发Web服务实例。Apache CXF是一个流行的开源项目,它提供了一种简单且强大的方式来实现和消费SOAP和RESTful Web服务。Spring框架则以其模块化、...

Global site tag (gtag.js) - Google Analytics