zoukankan      html  css  js  c++  java
  • 使用CXF发布和调用webservice之HelloWorld入门

    依赖的JAR
        cxf-2.2.10.jar
        jetty-6.1.21.jar
        jetty-util-6.1.21.jar
        servlet-2_5-api.jar
        wsdl4j-1.6.2.jar
        XmlSchema-1.4.5.jar
    创建一个普通的Java工程即可

    创建webservice接口

    package com.cxf.interfaces;
    
    import javax.jws.WebParam;
    import javax.jws.WebService;
    
    @WebService
    public interface HelloWorldServiceInf {
        
        String sayHello(@WebParam(name="username") String username);
        
    }

    发布和调用webservice
            方法一
    发布webservice

    package com.cxf.impl;
    
    import javax.jws.WebService;
    
    import org.apache.cxf.interceptor.LoggingInInterceptor;
    import org.apache.cxf.interceptor.LoggingOutInterceptor;
    import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
    
    import com.cxf.interfaces.HelloWorldServiceInf;
    
    @WebService(endpointInterface="com.cxf.interfaces.HelloWorldServiceInf",serviceName="helloWorldService")
    public class Server implements HelloWorldServiceInf {
    
        public String sayHello(String username) {
            return "Hello,"+username;
        }
    
        
        public static void main(String[] args) {
            Server impl=new Server();
            JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
            factoryBean.setAddress("http://localhost:9000/hello");
            factoryBean.setServiceClass(HelloWorldServiceInf.class);
            factoryBean.setServiceBean(impl);
            factoryBean.getInInterceptors().add(new LoggingInInterceptor());
            factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
            factoryBean.create();
        }
        
    }

    wsdl描述文件

     <?xml version="1.0" ?> 
    - <wsdl:definitions name="HelloWorldServiceInfService" targetNamespace="http://interfaces.cxf.com/" xmlns:ns1="http://schemas.xmlsoap.org/wsdl/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://interfaces.cxf.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    - <wsdl:types>
    - <xsd:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://interfaces.cxf.com/" xmlns:tns="http://interfaces.cxf.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="sayHello" type="tns:sayHello" /> 
    - <xsd:complexType name="sayHello">
    - <xsd:sequence>
      <xsd:element minOccurs="0" name="username" type="xsd:string" /> 
      </xsd:sequence>
      </xsd:complexType>
      <xsd:element name="sayHelloResponse" type="tns:sayHelloResponse" /> 
    - <xsd:complexType name="sayHelloResponse">
    - <xsd:sequence>
      <xsd:element minOccurs="0" name="return" type="xsd:string" /> 
      </xsd:sequence>
      </xsd:complexType>
      </xsd:schema>
      </wsdl:types>
    - <wsdl:message name="sayHelloResponse">
      <wsdl:part element="tns:sayHelloResponse" name="parameters" /> 
      </wsdl:message>
    - <wsdl:message name="sayHello">
      <wsdl:part element="tns:sayHello" name="parameters" /> 
      </wsdl:message>
    - <wsdl:portType name="HelloWorldServiceInf">
    - <wsdl:operation name="sayHello">
      <wsdl:input message="tns:sayHello" name="sayHello" /> 
      <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse" /> 
      </wsdl:operation>
      </wsdl:portType>
    - <wsdl:binding name="HelloWorldServiceInfServiceSoapBinding" type="tns:HelloWorldServiceInf">
      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
    - <wsdl:operation name="sayHello">
      <soap:operation soapAction="" style="document" /> 
    - <wsdl:input name="sayHello">
      <soap:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output name="sayHelloResponse">
      <soap:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
      </wsdl:binding>
    - <wsdl:service name="HelloWorldServiceInfService">
    - <wsdl:port binding="tns:HelloWorldServiceInfServiceSoapBinding" name="HelloWorldServiceInfPort">
      <soap:address location="http://localhost:9000/hello" /> 
      </wsdl:port>
      </wsdl:service>
      </wsdl:definitions>

    客户端调用

    package com.cxf.client;
    
    import org.apache.cxf.interceptor.LoggingInInterceptor;
    import org.apache.cxf.interceptor.LoggingOutInterceptor;
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    import com.cxf.interfaces.HelloWorldServiceInf;
    
    public class Client {
        public static void main(String[] args) {
            JaxWsProxyFactoryBean  factoryBean=new JaxWsProxyFactoryBean();
            factoryBean.getInInterceptors().add(new LoggingInInterceptor());
            factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
            factoryBean.setServiceClass(HelloWorldServiceInf.class);
            factoryBean.setAddress("http://localhost:9000/hello");
            HelloWorldServiceInf impl=(HelloWorldServiceInf) factoryBean.create();
            System.out.println(impl.sayHello("张三"));
        }
    }

     方法二
    发布webservice

    package com.cxf.impl;
    
    import javax.jws.WebService;
    import javax.xml.ws.Endpoint;
    
    import com.cxf.interfaces.HelloWorldServiceInf;
    
    @WebService(endpointInterface="com.cxf.interfaces.HelloWorldServiceInf",serviceName="helloWorldService")
    public class Server implements HelloWorldServiceInf {
    
        public String sayHello(String username) {
            return "Hello,"+username;
        }
        public static void main(String[] args) {
            Server impl=new Server();
            String address="http://localhost:9000/hello";
            Endpoint.publish(address, impl);
        }
    }

    wsdl文件

     <?xml version="1.0" ?> 
    - <wsdl:definitions name="helloWorldService" targetNamespace="http://impl.cxf.com/" xmlns:ns1="http://interfaces.cxf.com/" xmlns:ns2="http://schemas.xmlsoap.org/wsdl/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.cxf.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <wsdl:import location="http://localhost:9000/hello?wsdl=HelloWorldServiceInf.wsdl" namespace="http://interfaces.cxf.com/" /> 
    - <wsdl:binding name="helloWorldServiceSoapBinding" type="ns1:HelloWorldServiceInf">
      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
    - <wsdl:operation name="sayHello">
      <soap:operation soapAction="" style="document" /> 
    - <wsdl:input name="sayHello">
      <soap:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output name="sayHelloResponse">
      <soap:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
      </wsdl:binding>
    - <wsdl:service name="helloWorldService">
    - <wsdl:port binding="tns:helloWorldServiceSoapBinding" name="ServerPort">
      <soap:address location="http://localhost:9000/hello" /> 
      </wsdl:port>
      </wsdl:service>
      </wsdl:definitions>

    客户端调用

    package com.cxf.client;
    
    import javax.xml.namespace.QName;
    import javax.xml.ws.Service;
    import javax.xml.ws.soap.SOAPBinding;
    
    import com.cxf.interfaces.HelloWorldServiceInf;
    
    public class Client {
        //注意:此处http://interfaces.cxf.com/  来源于wsdl文件中namespace   <wsdl:import location="http://localhost:9000/hello?wsdl=HelloWorldServiceInf.wsdl" namespace="http://interfaces.cxf.com/" /> 
    
        private static final QName SERVICE_NAME=new QName("http://interfaces.cxf.com/","HelloWorldServiceInf");//HelloWorldServiceInf接口类的名称
        private static final QName PORT_NAME=new QName("http://interfaces.cxf.com/", "HelloWorldServiceInfPort");//HelloWorldServiceInfPort 接口类的名称+Port
        public static void main(String[] args) {
            String endPointAddress="http://localhost:9000/hello";
            Service service=Service.create(SERVICE_NAME);
            service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endPointAddress);
            HelloWorldServiceInf inf=service.getPort(HelloWorldServiceInf.class);
            System.out.println(inf.sayHello("张三"));
        }
    }

    CXF根据wsdl文件动态调用WebService

    package com.cxf.client;
    
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
    
    public class ClientFromWsdl {
        
        public static void main(String[] args) throws Exception{
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
            org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:9000/hello?wsdl");
            //sayHello 为接口中定义的方法名称   张三为传递的参数   返回一个Object数组
            Object[] objects=client.invoke("sayHello", "张三"); 
            //输出调用结果
            System.out.println(objects[0].toString());
        }
    }

    参考原文:http://www.blogjava.net/sxyx2008/archive/2010/09/15/332058.html

  • 相关阅读:
    了解 NoSQL 的必读资料
    关于什么时候用assert(断言)的思考
    这次见到了一些大侠
    NetBeans 时事通讯(刊号 # 87 Jan 12, 2010)
    动态链接库dll,静态链接库lib, 导入库lib
    新女性十得 写得了代码,查得出异常
    记录系统乱谈
    新女性十得 写得了代码,查得出异常
    fullpage.js禁止滚动
    RunningMapReduceExampleTFIDF hadoopclusternet This document describes how to run the TFIDF MapReduce example against ascii books. This project is for those who wants to experiment hadoop as a skunkworks in a small cluster (110 nodes) Google Pro
  • 原文地址:https://www.cnblogs.com/duffy/p/5133003.html
Copyright © 2011-2022 走看看