一个简单的模拟用户名是否存在的基于契约优先WSDL的webservice开发实例

来源:互联网 发布:神州科捷工作知乎 编辑:程序博客网 时间:2024/05/16 09:04
服务端

新建java工程MyWebservice,在类路径下新建META-INF/wsdl目录,新建check.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/check/"                   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"                   name="CheckUserService"                   targetNamespace="http://www.example.org/check/">  <!-- 定义类型 -->  <wsdl:types>    <xsd:schema targetNamespace="http://www.example.org/check/">      <xsd:element name="checkUser" type="tns:checkUserType" />      <xsd:element name="checkUserResponse" type="tns:checkUserResponseType" />            <xsd:complexType name="checkUserType">         <xsd:sequence>           <xsd:element name="userName" type="xsd:string"></xsd:element>         </xsd:sequence>      </xsd:complexType>            <xsd:complexType name="checkUserResponseType">         <xsd:sequence>           <xsd:element name="checkUserResult" type="xsd:boolean"></xsd:element>         </xsd:sequence>      </xsd:complexType>          </xsd:schema>  </wsdl:types>    <!-- 定义消息 -->  <wsdl:message name="checkUserRequest">    <wsdl:part element="tns:checkUser" name="parameters"/>  </wsdl:message>  <wsdl:message name="checkUserResponse">    <wsdl:part element="tns:checkUserResponse" name="parameters"/>  </wsdl:message>    <wsdl:portType name="ICheckUserService">    <wsdl:operation name="checkUser">      <wsdl:input message="tns:checkUserRequest"/>      <wsdl:output message="tns:checkUserResponse"/>    </wsdl:operation>  </wsdl:portType>    <wsdl:binding name="checkUserSOAP" type="tns:ICheckUserService">    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>    <wsdl:operation name="checkUser">      <wsdl:input>        <soap:body use="literal"/>      </wsdl:input>      <wsdl:output>        <soap:body use="literal"/>      </wsdl:output>    </wsdl:operation>  </wsdl:binding>    <wsdl:service name="CheckUserService">    <wsdl:port binding="tns:checkUserSOAP" name="CheckUserPort">      <soap:address location="http://127.0.0.1:9090/cu/"/>    </wsdl:port>  </wsdl:service></wsdl:definitions>

使用wsimport命令生成服务端代码,在cmd下进到wsdl文件目录下
wsimport -d G:\workspace\EclipseWorkspaceNew\MyWebservice\src -keep -verbose check.wsdl

-d 表示生成的文件保存路径,这里我直接保存在工程的src目录下,完成之后刷新工程即可看到生成的java代码
生成的接口如下
package org.example.check;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.xml.bind.annotation.XmlSeeAlso;import javax.xml.ws.RequestWrapper;import javax.xml.ws.ResponseWrapper;/** * This class was generated by the JAX-WS RI. * JAX-WS RI 2.1.6 in JDK 6 * Generated source version: 2.1 *  */@WebService(name = "ICheckUserService", targetNamespace = "http://www.example.org/check/")@XmlSeeAlso({    ObjectFactory.class})public interface ICheckUserService {    /**     *      * @param userName     * @return     *     returns boolean     */    @WebMethod    @WebResult(name = "checkUserResult", targetNamespace = "")    @RequestWrapper(localName = "checkUser", targetNamespace = "http://www.example.org/check/", className = "org.example.check.CheckUserType")    @ResponseWrapper(localName = "checkUserResponse", targetNamespace = "http://www.example.org/check/", className = "org.example.check.CheckUserResponseType")    public boolean checkUser(        @WebParam(name = "userName", targetNamespace = "")        String userName);}

编写这个接口的实现类,并指定wsdl文件,如下
package qlj.service.impl;import java.util.ArrayList;import java.util.List;import javax.jws.WebService;import org.example.check.ICheckUserService;@WebService(endpointInterface="org.example.check.ICheckUserService",            targetNamespace="http://www.example.org/check/",            wsdlLocation="META-INF/wsdl/check.wsdl")public class CheckUser implements ICheckUserService {private static List<String> users = new ArrayList<String>();{users.add("aa");users.add("bb");users.add("cc");users.add("dd");System.out.println("add complete");}@Overridepublic boolean checkUser(String userName) {System.out.println(userName);return users.contains(userName);//模拟用户是否存在}}
这个实现类的类名必须是CheckUser(wsdl文件定义的服务name属性为CheckUserService,把后缀Service去掉),否则发布服务时会报错
编写测试类手动发布服务
package qlj.service.main;import javax.xml.ws.Endpoint;import qlj.service.impl.CheckUser;public class ServicePublish {public static void main(String[] args) {Endpoint.publish("http://127.0.0.1:9090/cu/", new CheckUser());}}
这里的发布地址就是wsdl文件里soap:address中定义的location的属性值

用浏览器访问http://127.0.0.1:9090/cu/?wsdl结果如下
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/check/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CheckUserService" targetNamespace="http://www.example.org/check/"><!--  定义类型  --><wsdl:types><xsd:schema targetNamespace="http://www.example.org/check/"><xsd:element name="checkUser" type="tns:checkUserType"/><xsd:element name="checkUserResponse" type="tns:checkUserResponseType"/><xsd:complexType name="checkUserType"><xsd:sequence><xsd:element name="userName" type="xsd:string"/></xsd:sequence></xsd:complexType><xsd:complexType name="checkUserResponseType"><xsd:sequence><xsd:element name="checkUserResult" type="xsd:boolean"/></xsd:sequence></xsd:complexType></xsd:schema></wsdl:types><!--  定义消息  --><wsdl:message name="checkUserRequest"><wsdl:part element="tns:checkUser" name="parameters"/></wsdl:message><wsdl:message name="checkUserResponse"><wsdl:part element="tns:checkUserResponse" name="parameters"/></wsdl:message><wsdl:portType name="ICheckUserService"><wsdl:operation name="checkUser"><wsdl:input message="tns:checkUserRequest"/><wsdl:output message="tns:checkUserResponse"/></wsdl:operation></wsdl:portType><wsdl:binding name="checkUserSOAP" type="tns:ICheckUserService"><soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="checkUser"><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="CheckUserService"><wsdl:port binding="tns:checkUserSOAP" name="CheckUserPort"><soap:address location="http://127.0.0.1:9090/cu/"/></wsdl:port></wsdl:service></wsdl:definitions>

服务发布成功!

客户端

新建java工程MyWebservice_client,在cmd下使用wsimport命令,如下
wsimport -d G:\workspace\EclipseWorkspaceNew\MyWebservice_client\src -keep -verbose http://127.0.0.1:9090/cu/?wsdl

把生成的文件保存到工程的src目录下,刷新工程即可看到这些java源码
生成的接口跟上面说的接口ICheckUserService一样
另外有一个CheckUserService类继承了javax.xml.ws.Service,这个类提供了获取ICheckUserService的方法,如下
package org.example.check;import java.net.MalformedURLException;import java.net.URL;import java.util.logging.Logger;import javax.xml.namespace.QName;import javax.xml.ws.Service;import javax.xml.ws.WebEndpoint;import javax.xml.ws.WebServiceClient;import javax.xml.ws.WebServiceFeature;/** * This class was generated by the JAX-WS RI. * JAX-WS RI 2.1.6 in JDK 6 * Generated source version: 2.1 *  */@WebServiceClient(name = "CheckUserService", targetNamespace = "http://www.example.org/check/", wsdlLocation = "http://127.0.0.1:9090/cu/?wsdl")public class CheckUserService    extends Service{    private final static URL CHECKUSERSERVICE_WSDL_LOCATION;    private final static Logger logger = Logger.getLogger(org.example.check.CheckUserService.class.getName());    static {        URL url = null;        try {            URL baseUrl;            baseUrl = org.example.check.CheckUserService.class.getResource(".");            url = new URL(baseUrl, "http://127.0.0.1:9090/cu/?wsdl");        } catch (MalformedURLException e) {            logger.warning("Failed to create URL for the wsdl Location: 'http://127.0.0.1:9090/cu/?wsdl', retrying as a local file");            logger.warning(e.getMessage());        }        CHECKUSERSERVICE_WSDL_LOCATION = url;    }    public CheckUserService(URL wsdlLocation, QName serviceName) {        super(wsdlLocation, serviceName);    }    public CheckUserService() {        super(CHECKUSERSERVICE_WSDL_LOCATION, new QName("http://www.example.org/check/", "CheckUserService"));    }    /**     *      * @return     *     returns ICheckUserService     */    @WebEndpoint(name = "CheckUserPort")    public ICheckUserService getCheckUserPort() {        return super.getPort(new QName("http://www.example.org/check/", "CheckUserPort"), ICheckUserService.class);    }    /**     *      * @param features     *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.     * @return     *     returns ICheckUserService     */    @WebEndpoint(name = "CheckUserPort")    public ICheckUserService getCheckUserPort(WebServiceFeature... features) {        return super.getPort(new QName("http://www.example.org/check/", "CheckUserPort"), ICheckUserService.class, features);    }}

编写客户端测试类
package qlj.service.test;import java.net.URL;import javax.xml.namespace.QName;import org.example.check.CheckUserService;import org.example.check.ICheckUserService;public class Test_client {public static void main(String[] args) throws Exception {String namespace = "http://www.example.org/check/";QName qName = new QName(namespace, "CheckUserService");URL url = new URL("http://127.0.0.1:9090/cu/?wsdl");CheckUserService checkUserService = new CheckUserService(url,qName);ICheckUserService iCheckUserService = checkUserService.getCheckUserPort();boolean isExist = iCheckUserService.checkUser("aa");System.out.println(isExist);}}

运行结果如下
客户端输出结果true
服务端运行结果aa

结论:正确。

0 0
原创粉丝点击