webservice24--基于契约优先开发用户管理小功能--实现wsdl

基于契约优先开发用户管理小功能–实现wsdl

1、编写schema

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    默认的命名空间,就是xmlns,没有后追, 只能有一个。
 -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/user" 
        xmlns:tns="http://www.example.org/user" 
        elementFormDefault="qualified">
    <!--  User (username nickname password) 
        使用百叶窗方式, 只有一个根节点。
    -->
    <xsd:element name="user" type="tns:userType"></xsd:element>

    <!--  方法:  add  delete login list -->
    <xsd:element name="add" type="tns:addType"></xsd:element>
    <xsd:element name="addResponse" type="tns:addResponseType"></xsd:element>
    <xsd:element name="delete" type="tns:deleteType"></xsd:element>
    <xsd:element name="deleteResponse" type="tns:deleteResponseType"></xsd:element>
    <xsd:element name="login" type="tns:loginType"></xsd:element>
    <xsd:element name="logResponse" type="tns:loginResponseType"></xsd:element>
    <xsd:element name="list" type="tns:listType"></xsd:element>
    <xsd:element name="listResponse" type="tns:listResponseType"></xsd:element>


    <xsd:complexType name="addType">
        <xsd:sequence>
            <xsd:element name="user" type="tns:userType"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="addResponseType">
        <xsd:sequence>
            <xsd:element name="addResponse" type="xsd:boolean"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>


    <xsd:complexType name="deleteType">
        <xsd:sequence>
            <xsd:element name="username" type="tns:usernameType"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="deleteResponseType">
        <xsd:sequence>
            <xsd:element name="deleteResponse" type="xsd:boolean"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="loginType">
        <xsd:sequence>
            <xsd:element name="username" type="tns:usernameType"></xsd:element>
            <xsd:element name="password" type="tns:passwordType"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="loginResponseType">
        <xsd:sequence>
            <xsd:element name="loginResponse" type="xsd:boolean"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="listType">
        <xsd:sequence>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="listResponseType">
        <xsd:sequence >
            <!-- 返回的是User对象。 -->
            <xsd:element name="listResponse" type="tns:userType"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>


    <!-- (username nickname password) -->
    <xsd:complexType name="userType">
        <xsd:sequence>
            <xsd:element name="username" type="tns:usernameType"></xsd:element>
            <xsd:element name="nickname" type="xsd:string"></xsd:element>
            <xsd:element name="password" type="tns:passwordType"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:simpleType name="usernameType">
        <xsd:restriction base="xsd:string">
            <xsd:minLength value="1"></xsd:minLength>
        </xsd:restriction>
    </xsd:simpleType>

    <!-- 使用simpleType 限制密码的长度 -->
    <xsd:simpleType name="passwordType">
        <xsd:restriction base="xsd:string">
            <xsd:minLength value="6"></xsd:minLength>
            <xsd:maxLength value="30"></xsd:maxLength>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema>

2、编写wsdl

2.1、schema的引用

2.1.1、使用include 的引用
  <wsdl:types>
    <xsd:schema targetNamespace="http://service.chb.com/">
      <xsd:include schemaLocation="user.xsd"></xsd:include>
    </xsd:schema>
  </wsdl:types>
2.1.1、使用import的引用,可以在import中设置命名空间。
  <wsdl:types>
    <xsd:schema >
        <xsd:import schemaLocation="user.xsd"  namespace="http://service.chb.com/" ></xsd:import>
    </xsd:schema>
  </wsdl:types>

2.2、设置message

  <wsdl:message name="add">
    <wsdl:part element="tns:add" name="parameters"/>
  </wsdl:message>
  <wsdl:message name="addResponse">
    <wsdl:part element="tns:addResponse" name="parameters"/>
  </wsdl:message>

  <wsdl:message name="delete">
    <wsdl:part element="tns:delete" name="parameters"/>
  </wsdl:message>
  <wsdl:message name="deleteResponse">
    <wsdl:part element="tns:deleteResponse" name="parameters"/>
  </wsdl:message>

  <wsdl:message name="login">
    <wsdl:part element="tns:login" name="parameters"/>
  </wsdl:message>
  <wsdl:message name="loginResponse">
    <wsdl:part element="tns:loginResponse" name="parameters"/>
  </wsdl:message>

  <wsdl:message name="list">
    <wsdl:part element="tns:list" name="parameters"/>
  </wsdl:message>
  <wsdl:message name="listResponse">
    <wsdl:part element="tns:listResponse" name="parameters"/>
  </wsdl:message>

2.3、设置port’Type, 也就是方法

2.3.1、修改service的名称

name="user"

改为

name="UserService" 

2.3.2、设置portType


  <!-- 接口 -->
  <wsdl:portType name="IUserService">
    <!-- 设置方法, operation就是方法。 -->
    <wsdl:operation name="add">
      <wsdl:input message="tns:add"/>
      <wsdl:output message="tns:addResponse"/>
    </wsdl:operation>
    <wsdl:operation name="delete">
      <wsdl:input message="tns:delete"/>
      <wsdl:output message="tns:deleteResponse"/>
    </wsdl:operation> 
    <wsdl:operation name="login">
      <wsdl:input message="tns:login"/>
      <wsdl:output message="tns:loginResponse"/>
    </wsdl:operation>
    <wsdl:operation name="list">
      <wsdl:input message="tns:list"/>
      <wsdl:output message="tns:listResponse"/>
    </wsdl:operation>  
  </wsdl:portType>

2.4、binding

这里写图片描述

2.5 service

  <!-- service -->
  <wsdl:service name="UserService">
    <wsdl:port binding="tns:userServiceSOAP" name="UserServicePort">
      <soap:address location="http://localhost:9990/us/"/>
    </wsdl:port>
  </wsdl:service>

至此, wsdl已经完成,

契约已经定好, 通过定制好的wsdl生成, java文件

G:\JavaWeb\qyyx_01\WebContent\WEB-INF\wsdl>wsimport -d  G:\JavaWeb\qyyx_01\src -keep -verbose user.wsdl

服务端

这里写图片描述

客户端,使用http://localhost:9999/us?wsdl导文件(注意: 使用的是wsdlurl, 而不是wsdl文件。

G:\JavaWeb\qyyx_01\WebContent\WEB-INF\wsdl>wsimport -d  G:\JavaWeb\qyyx_01_client\src -verbose -keep http://localhost:9999/us?wsdl

这里写图片描述

2.6、问题, 测试客户端时候发现, list方法报错, 无法将User 对象转化为List<User>的错误,

查看IUserService中的list方法返回值,是User, 而不是List<User>
这是wsdl文件的listResponse类型有问题。

 public User list();

listResponse类型有问题。

    <xsd:complexType name="listResponseType">
        <xsd:sequence >
            <!-- 返回的是User对象。 -->
            <xsd:element name="listResponse" type="tns:userType"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>

解决:minOccurs=”0” maxOccurs=”unbounded”限定。

    <xsd:complexType name="listResponseType">
        <!-- 返回的是List<User>对象。 -->
        <xsd:sequence minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="listResponse" type="tns:user"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>

客户端测试

package com.chb.service.client;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

import com.chb.service.IUserService;
import com.chb.service.User;
import com.chb.service.UserService;

/**
 * wsimport -d  G:\JavaWeb\qyyx_01_client\src -verbose -keep http://localhost:9999/us?wsdl
 */
public class MyClient {
    public static void main(String[] args) throws MalformedURLException {
        //创建访问的URL 
        URL url = new URL("http://localhost:9999/us?wsdl");

        QName qName = new QName("http://service.chb.com/", "UserService");

        UserService msis = new UserService(url, qName);
        //获取IMyService, 简单多了
        IUserService iMyService = msis.getUserservicePort();
        User user = new User();
        user.setUsername("wx");
        user.setNickname("wuxin");
        user.setPassword("111");
        iMyService.add(user);

        for (User u : iMyService.list()) {
            System.out.println(u);
        }
        System.out.println(iMyService.login("chb", "123456"));

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值