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

来源:互联网 发布:对java面向对象的理解 编辑:程序博客网 时间:2024/05/16 08:32

基于契约优先开发用户管理小功能–实现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