zoukankan      html  css  js  c++  java
  • webservice wsdl 生成服务

    由于之前的示例是在当前项目下发布的server,也是在当前项目下访问的server发布的webservice。但在实际应用中,我们的服务端往往是和客户諯分离的,甚至它们是不同的项目中不同的人写的。而像之前的在当前项目中使用服务端的接口类:IMyService就不太现实了。因为此时你只有服务端的wsdl,怎么可以直接用服务端的接口类接收并测试呢。如何解决这个问题?

    JDK的bin目录下自带就有一个工具,wsimport。一个用来导出webservice的东东,服务端可以导其导出后生成jar文件,然后客户端引用不就行了?

    好的,我们下面来看下怎么使用它。

    它有几个很重要的参数,

    -d 表示输出的目录,目录必须事先存在,否则导出失败。

     -keep表示导出webservice的class文件时是否也导出源代码java文件。

    -verbose表示详细信息。

    看我们的导出命令。我们直接导在d盘中。

    1. wsimport -d d: -keep -verbose http://localhost:7777/tudou?wsdl  

    我们导出的文件目录是D:comwhatyplatformwsserver这个目录大家有没有发现,正好和我们之前的服务器端目录是一样的,但实际上在wsdl中namespace是相反的http://server.ws.platform.whaty.com/。也就是说服务端生成wsdl时反过来生成了namespace,而wsimport根据wsdl生成时又反过来给还原了去。

    我们直接把生成的目录放在第2个建好的项目中去。这样我们客户端的项目就可以直接使用服务端的接口IMyservice了。顺便我们把前一章的client访问类也拷过来测试一下。目录结构如下【注意这是一个新的项目】:

    直接运行MyClient测试一下。

    1. package com.whaty.platform.ws.client;  
    2.   
    3. import java.net.MalformedURLException;  
    4. import java.net.URL;  
    5.   
    6. import javax.xml.namespace.QName;  
    7. import javax.xml.ws.Service;  
    8.   
    9. import com.whaty.platform.ws.server.IMyservice;  
    10.   
    11. /** 
    12.  * @className:MyClient.java 
    13.  * @Desc:访问发布的服务 
    14.  * @author:lizhuang 
    15.  * @createTime:2012-12-21 上午01:23:57 
    16.  */  
    17. public class MyClient {  
    18.     public static void main(String[] args) {  
    19.   
    20.         try {  
    21.             //服务WSDL Document的地址  
    22.             URL url = new URL("http://localhost:7777/tudou?wsdl");  
    23.             //1.Qnameqname是qualified name 的简写  
    24.             //2.构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成  
    25.             //由发布的wsdl可知namespace为http://server.ws.platform.whaty.com/,  
    26.             QName qname=new QName("http://server.ws.platform.whaty.com/","MyServiceImplService");  
    27.             Service service=Service.create(url, qname);  
    28.             IMyservice ms=service.getPort(IMyservice.class);  
    29.             ms.add(1, 4);  
    30.             ms.minus(1, 4);  
    31.         } catch (MalformedURLException e) {  
    32.             e.printStackTrace();  
    33.         }  
    34.     }  
    35. }  


    控制台打印:

    a+b=5
    a-b=-3

    看到没有,和之前我们在服务端测试的效果是一样的,不同的是文件不一样。wsimport生成的文件将服务端的webservice折成若干文件了。每一个方法和请求分别对应2个文件。你会发现其中有个类MyServiceImplService:

    1. @WebServiceClient(name = "MyServiceImplService", targetNamespace = "http://server.ws.platform.whaty.com/", wsdlLocation = "http://localhost:7777/tudou?wsdl")  
    2. public class MyServiceImplService  


    这个类是注解好的客户端程序,它里面有个方法:

    1. /**  
    2.     *   
    3.     * @return  
    4.     *     returns IMyservice  
    5.     */  
    6.    @WebEndpoint(name = "MyServiceImplPort")  
    7.    public IMyservice getMyServiceImplPort() {  
    8.        return super.getPort(new QName("http://server.ws.platform.whaty.com/", "MyServiceImplPort"), IMyservice.class);  
    9.    }  


    直接帮我们生成了一个qname访问程序。既然如何,我们就不用自己写qname了,直接拿来用测试岂不更好?

    简化后的客户端测试方法如下:

    1. package com.whaty.platform.ws.client;  
    2.   
    3. import com.whaty.platform.ws.server.IMyservice;  
    4. import com.whaty.platform.ws.server.MyServiceImplService;  
    5.   
    6. /** 
    7.  * @className:MyClient2.java 
    8.  * @Desc:使用JDK wsimport生成的MyServiceImplService快速访问我们的服务。 
    9.  * @author:lizhuang 
    10.  * @createTime:2012-12-22 上午12:24:37 
    11.  */  
    12. public class MyClient2 {  
    13.     public static void main(String[] args) {  
    14.         MyServiceImplService myServiceImplService=new MyServiceImplService();  
    15.         IMyservice msis= myServiceImplService.getMyServiceImplPort();  
    16.         msis.add(1, 4);  
    17.         msis.minus(1, 4);  
    18.     }  
    19. }  


    你会发现结果是一样的。

  • 相关阅读:
    [LeetCode] 286. Walls and Gates 墙和门
    [LeetCode] Sparse Matrix Multiplication 稀疏矩阵相乘
    [LeetCode] 314. Binary Tree Vertical Order Traversal 二叉树的竖直遍历
    [LeetCode] 337. House Robber III 打家劫舍之三
    [LeetCode] Palindrome Pairs 回文对
    [LeetCode] 302. Smallest Rectangle Enclosing Black Pixels 包含黑像素的最小矩阵
    Nginx安装及配置详解
    Spring Boot项目属性配置
    maven仓库阿里云镜像配置
    maven仓库阿里云镜像配置
  • 原文地址:https://www.cnblogs.com/Struts-pring/p/5025866.html
Copyright © 2011-2022 走看看