当前位置 : 首页 » 博文聚焦 » 正文

webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)

分类 : 博文聚焦 | 发布时间 : 2013-10-12 18:35:00 | 浏览 : 0

服务器端:

1、编写wsdl文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:tns="http://www.example.org/mywsdl/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    name="MyServiceImplService" 
    targetNamespace="http://www.example.org/mywsdl/">
    
    <!-- 定义类型 -->
  <wsdl:types>
    <xsd:schema targetNamespace="http://www.example.org/mywsdl/">
        <xsd:element name="add" type="tns:add"/>
        <xsd:element name="addResponse" type="tns:addResponse"/>
        <xsd:element name="divide" type="tns:divide"/>
        <xsd:element name="divideResponse" type="tns:divideResponse"/>
        <xsd:element name="licenseInfo" type="xsd:string"/>
        
        <xsd:complexType name="add">
            <xsd:sequence>
                <xsd:element name="a" type="xsd:int"/>
                <xsd:element name="b" type="xsd:int"/>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="addResponse">
            <xsd:sequence>
                <xsd:element name="addResult" type="xsd:int"/>
            </xsd:sequence>
        </xsd:complexType>
        
        <xsd:complexType name="divide">
            <xsd:sequence>
                <xsd:element name="num1" type="xsd:int"/>
                <xsd:element name="num2" type="xsd:int"/>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="divideResponse">
            <xsd:sequence>
                <xsd:element name="divideResult" type="xsd:int"/>
            </xsd:sequence>
        </xsd:complexType>
        
    </xsd:schema>
  </wsdl:types>
  
  <!-- 定义消息 -->
  <wsdl:message name="add">
      <wsdl:part name="add" element="tns:add"/>
  </wsdl:message>
  <wsdl:message name="addResponse">
      <wsdl:part name="addResponse" element="tns:addResponse"></wsdl:part>
  </wsdl:message>
  <wsdl:message name="divide">
      <wsdl:part name="divide" element="tns:divide"/>
  </wsdl:message>
  <wsdl:message name="divideResponse">
      <wsdl:part name="divideResponse" element="tns:divideResponse"/>
  </wsdl:message>
  
  <!-- 头消息 -->
  <wsdl:message name="licenseInfo">
      <wsdl:part name="licenseInfo" element="tns:licenseInfo"></wsdl:part>
  </wsdl:message>
  
  <!-- 定义port -->
  <wsdl:portType name="IMyService">
      <wsdl:operation name="add">
          <wsdl:input message="tns:add"/>
          <wsdl:output message="tns:addResponse"/>
      </wsdl:operation>
      
      <wsdl:operation name="divide">
          <wsdl:input message="tns:divide"/>
          <wsdl:output message="tns:divideResponse"/>
      </wsdl:operation>
  </wsdl:portType>
  
  <!-- 绑定服务 -->
  <wsdl:binding name="myServiceSOAP" type="tns:IMyService">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="add">
      <wsdl:input>
        <soap:body use="literal"/>
        <!-- 为add添加隐式的头信息 -->
        <soap:header use="literal" part="licenseInfo" message="tns:licenseInfo"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    
    <wsdl:operation name="divide">
      <wsdl:input>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  
  <!-- 发布服务 -->
  <wsdl:service name="MyServiceImplService"><!-- 这里的名字必须和<wsdl:definitions里的name一致 -->
    <wsdl:port binding="tns:myServiceSOAP" name="MyServiceImplPort">
      <soap:address location="http://localhost:8989/ms"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 

2、使用wsimport命令生成服务端接口类(IMyService.java)
备注:生成的其他文件都可以删除

在add方法的参数定义上加上

@WebParam(name="licenseInfo")String licenseInfo

 

3、编写服务接口的实现类MyServiceImpl.java

package org.example.mywsdl;

import javax.jws.WebService;

//这里必须制定wsdlLocation来约定参数等名称等
//endpointInterface可写也可不写,写它主要是用到自动生成的一些注解信息
@WebService(endpointInterface="org.example.mywsdl.IMyService",
        targetNamespace="http://www.example.org/mywsdl/",
        wsdlLocation="META-INF/wsdl/mywsdl.wsdl",
        name="MyServiceImpl"
        )
public class MyServiceImpl implements IMyService {

    @Override
    public int add(int a, int b, String licenseInfo) {
        return a+b;
    }

    @Override
    public int divide(int num1, int num2) {
        return num1/num2;
    }

}

 

4、服务启动类

package org.example.mywsdl;

import javax.xml.ws.Endpoint;

public class RunService {

    public static void main(String[] args) {
        //这里的发布地址必须和wsdl中定义的一样
        Endpoint.publish("http://localhost:8989/ms", new MyServiceImpl());
    }
}

 

访问服务:http://localhost:8989/ms?wsdl

 

客户端直接用上面的地址生成即可,生成的wsdl文件即是我们编写的那个wsdl文件

<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --><wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/mywsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="MyServiceImplService" targetNamespace="http://www.example.org/mywsdl/">
    
    <!-- 定义类型 -->
  <wsdl:types>
    <xsd:schema targetNamespace="http://www.example.org/mywsdl/">
        <xsd:element name="add" type="tns:add"></xsd:element>
        <xsd:element name="addResponse" type="tns:addResponse"></xsd:element>
        <xsd:element name="divide" type="tns:divide"></xsd:element>
        <xsd:element name="divideResponse" type="tns:divideResponse"></xsd:element>
        <xsd:element name="licenseInfo" type="xsd:string"></xsd:element>
        
        <xsd:complexType name="add">
            <xsd:sequence>
                <xsd:element name="a" type="xsd:int"></xsd:element>
                <xsd:element name="b" type="xsd:int"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="addResponse">
            <xsd:sequence>
                <xsd:element name="addResult" type="xsd:int"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        
        <xsd:complexType name="divide">
            <xsd:sequence>
                <xsd:element name="num1" type="xsd:int"></xsd:element>
                <xsd:element name="num2" type="xsd:int"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="divideResponse">
            <xsd:sequence>
                <xsd:element name="divideResult" type="xsd:int"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        
    </xsd:schema>
  </wsdl:types>
  
  <!-- 定义消息 -->
  <wsdl:message name="add">
      <wsdl:part name="add" element="tns:add"></wsdl:part>
  </wsdl:message>
  <wsdl:message name="addResponse">
      <wsdl:part name="addResponse" element="tns:addResponse"></wsdl:part>
  </wsdl:message>
  <wsdl:message name="divide">
      <wsdl:part name="divide" element="tns:divide"></wsdl:part>
  </wsdl:message>
  <wsdl:message name="divideResponse">
      <wsdl:part name="divideResponse" element="tns:divideResponse"></wsdl:part>
  </wsdl:message>
  
  <!-- 头消息 -->
  <wsdl:message name="licenseInfo">
      <wsdl:part name="licenseInfo" element="tns:licenseInfo"></wsdl:part>
  </wsdl:message>
  
  <!-- 定义port -->
  <wsdl:portType name="IMyService">
      <wsdl:operation name="add">
          <wsdl:input message="tns:add"></wsdl:input>
          <wsdl:output message="tns:addResponse"></wsdl:output>
      </wsdl:operation>
      
      <wsdl:operation name="divide">
          <wsdl:input message="tns:divide"></wsdl:input>
          <wsdl:output message="tns:divideResponse"></wsdl:output>
      </wsdl:operation>
  </wsdl:portType>
  
  <!-- 绑定服务 -->
  <wsdl:binding name="myServiceSOAP" type="tns:IMyService">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>
    <wsdl:operation name="add">
      <wsdl:input>
        <soap:body use="literal"></soap:body>
        <!-- 为add添加隐式的头信息 -->
        <soap:header use="literal" part="licenseInfo" message="tns:licenseInfo"></soap:header>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"></soap:body>
      </wsdl:output>
    </wsdl:operation>
    
    <wsdl:operation name="divide">
      <wsdl:input>
        <soap:body use="literal"></soap:body>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"></soap:body>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  
  <!-- 发布服务 -->
  <wsdl:service name="MyServiceImplService"><!-- 这里的名字必须和<wsdl:definitions里的name一致 -->
    <wsdl:port binding="tns:myServiceSOAP" name="MyServiceImplPort">
      <soap:address location="http://localhost:8989/ms"></soap:address>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 

使用该wsdl生成客户端java代码后的add方法如下:

@WebMethod
    @WebResult(name = "addResult", targetNamespace = "")
    @RequestWrapper(localName = "add", targetNamespace = "http://www.example.org/mywsdl/", className = "com.ws04.Add")
    @ResponseWrapper(localName = "addResponse", targetNamespace = "http://www.example.org/mywsdl/", className = "com.ws04.AddResponse")
    public int add(@WebParam(name = "a", targetNamespace = "") int a,
            @WebParam(name = "b", targetNamespace = "") int b);

此时方法的参数里没有看到有头信息参数的定义,调用该方法可以使用handler或者soap来编码传递头信息

相关阅读: