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. }  


    你会发现结果是一样的。

  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/Struts-pring/p/5025866.html
Copyright © 2011-2022 走看看