第一种使用JDK中的wsimport:
在JDK的bin文件夹中,有一个wsimport.exe,这个工具依据wsdl文件生成相应的类文件,然后用这些类文件,就可以像调用本地的类一样调用WebService提供的方法。
在命令提示符中使用如下命令:wsimport -keep -p com.demo.client http://localhost:8080/Demo/services/MyService?wsdl
命令参数说明: -d:生成客户端执行类的class文件的存放目录 -s:生成客户端执行类的源文件的存放目录 -p:定义生成类的包名
使用wsimport命令后,可以得到代码,然后可以将代码拷贝到工程里面,也可以将其编译,打包成jar。 比如 jar cvf dest.jar com/
第二种使用第三方框架,以cxf为例:
使用一下webservice的框架自带的一下wsdl4j生成,由于众所周知的原因,java的webservice的框架很多,经常由于版本和实现的不同,会出现一下莫名奇妙的问题,所以这个地方还是推荐使用你所使用的框架的wsdl4j工具生成相应的stub。
- 下载apache-cxf-2.5.11.zip并解压到D:\apache-cxf-2.5.11,下载地址:http://mirror.bjtu.edu.cn/apache/cxf/2.5.11/apache-cxf-2.5.11.tar.gz
- 在D:\apache-cxf-2.5.11\bin目录下面执行命令:wsdl2java http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl
- 命令执行完成后在相关文件夹中会生成相应的代码,将代码全部引入接入系统,与wsimport是相同的
使用过程中遇到的问题:
- 在使用的过程中发现一个问题,由于jdk6最高只支持ws2.1规范版本,所以在jdk6下面生成的时候,要加上-frontend jaxws21
wsdl2java -frontend jaxws21 http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl
- 发现可以根据wsdl生成java类,java类中的注释有可能是中文,所以要加上encoding参数,例如:-encoding utf-8
wsdl2java -ecoding utf-8 http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl
使用第三方ws框架,以cxf为例:
使用一下webservice的框架自带的一下wsdl4j生成,由于众所周知的原因,java的webservice的框架很多,经常由于版本和实现的不同,会出现一下莫名奇妙的问题,所以这个地方还是推荐使用你所使用的框架的wsdl4j工具生成相应的stub。
- 下载apache-cxf-2.5.11.zip并解压到D:\apache-cxf-2.5.11,下载地址:http://mirror.bjtu.edu.cn/apache/cxf/2.5.11/apache-cxf-2.5.11.tar.gz
- 在D:\apache-cxf-2.5.11\bin目录下面执行命令:wsdl2java http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl
- 命令执行完成后在相关文件夹中会生成相应的代码,将代码全部引入接入系统,与wsimport是相同的
使用过程中遇到的问题:
- 在使用的过程中发现一个问题,由于jdk6最高只支持ws2.1规范版本,所以在jdk6下面生成的时候,要加上-frontend jaxws21
wsdl2java -frontend jaxws21 http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl
- 发现可以根据wsdl生成java类,java类中的注释有可能是中文,所以要加上encoding参数,例如:-encoding utf-8
wsdl2java -ecoding utf-8 http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl
WEBSERVICE快速入门的示例:
首先定义接口:
package com.whaty.platform.ws.server;  
  
import javax.jws.WebService;  
  
/** 
 * @className:IMyservice.java 
 * @Desc:定义:SEI service endpoint interface 
 * @author:lizhuang 
 * @createTime:2012-12-21 上午12:57:18 
 */  
//JAX-WS注解,表示java api xml for webservice。JDK自带API的XML格式的webservice  
@WebService  
public interface IMyservice {  
      
    int add(int a, int b);  
  
    int minus(int a, int b);  
} 
 其次编写实现类:
package com.whaty.platform.ws.server; import javax.jws.WebService; /** * @className:MyServiceImpl.java * @Desc:定义:SIB service implemention bean * @author:lizhuang * @createTime:2012-12-21 上午01:01:22 */
//endpointInterface指定接入点接口:接口必须存在  
@WebService(endpointInterface="com.whaty.platform.ws.server.IMyservice")  
public class MyServiceImpl implements IMyservice {  
  
    public int add(int a, int b) {  
        System.out.println("a+b="+(a+b));  
        return a+b;  
    }  
  
    public int minus(int a, int b) {  
        System.out.println("a-b="+(a-b));  
        return a-b;  
    }  
  
} 
 最后发布我们的服务,直接右键运行main方法,如果控制台没报错,多半是发布成功了,否则检查你的代码:
package com.whaty.platform.ws.server;  
  
import javax.xml.ws.Endpoint;  
  
/** 
 * @className:MyServer.java 
 * @Desc:发布服务 
 * @author:lizhuang 
 * @createTime:2012-12-21 上午01:02:39 
 */  
public class MyServer {  
    public static void main(String[] args) {  
        //访问方式:http://localhost:7777/tudou?wsdl  
        String address="http://localhost:7777/tudou";  
        Endpoint.publish(address, new MyServiceImpl());  
    }  
} 
 浏览器地址栏输入:访问webservice看看是否发布成功【地址后面加上"?wsdl"】:
http://localhost:7777/tudou?wsdl
浏览器显示如下:
This XML file does not appear to have any style information associated with it. The document tree is shown below. <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --> <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://server.ws.platform.whaty.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://server.ws.platform.whaty.com/" name="MyServiceImplService"> <types> <xsd:schema> <xsd:import namespace="http://server.ws.platform.whaty.com/" schemaLocation="http://localhost:7777/tudou?xsd=1"/> </xsd:schema> </types> <message name="minus"> <part name="parameters" element="tns:minus"/> </message> <message name="minusResponse"> <part name="parameters" element="tns:minusResponse"/> </message> <message name="add"> <part name="parameters" element="tns:add"/> </message> <message name="addResponse"> <part name="parameters" element="tns:addResponse"/> </message> <portType name="IMyservice"> <operation name="minus"> <input message="tns:minus"/> <output message="tns:minusResponse"/> </operation> <operation name="add"> <input message="tns:add"/> <output message="tns:addResponse"/> </operation> </portType> <binding name="MyServiceImplPortBinding" type="tns:IMyservice"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="minus"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="add"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="MyServiceImplService"> <port name="MyServiceImplPort" binding="tns:MyServiceImplPortBinding"> <soap:address location="http://localhost:7777/tudou"/> </port> </service> </definitions>
下面我们创建客户端访问:
package com.whaty.platform.ws.client;  
  
import java.net.MalformedURLException;  
import java.net.URL;  
  
import javax.xml.namespace.QName;  
import javax.xml.ws.Service;  
  
import com.whaty.platform.ws.server.IMyservice;  
  
/** 
 * @className:MyClient.java 
 * @Desc:访问发布的服务 
 * @author:lizhuang 
 * @createTime:2012-12-21 上午01:23:57 
 */  
public class MyClient {  
    public static void main(String[] args) {  
  
        try {  
            //服务WSDL Document的地址  
            URL url = new URL("http://localhost:7777/tudou?wsdl");  
            //Qnameqname是qualified name 的简写  
            //2.构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成  
            //由发布的wsdl可知namespace为http://server.ws.platform.whaty.com/,  
            QName qname=new QName("http://server.ws.platform.whaty.com/","MyServiceImplService");  
            Service service=Service.create(url, qname);  
            IMyservice ms=service.getPort(IMyservice.class);  
            ms.add(1, 4);  
            ms.minus(1, 4);  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        }  
    }  
} 
 控制台打印如下:
a+b=5a-b=-3
