JDK里的WSDL使用



WSDL(WebService)能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。(以上来自百度的介绍)

网络上有很多这样的接口调用,比如51CTO的这篇汇总文章:http://developer.51cto.com/art/200908/147125.htmc6F思考者日记网-束洋洋个人博客

不同的语言平台对WebService都有实现,Java的WebService实现,比较流行的有Axis2、Jaxws、XFire等等,本文介绍Java6以后自带的API里的知识,有了它,我们就不需要一些额外的jar来实现了,因为集成了JAX-WS,这非常方便。c6F思考者日记网-束洋洋个人博客

一、我们先来建一个查询城市的接口类c6F思考者日记网-束洋洋个人博客

package com.wilcom.service;  
  
import javax.jws.WebMethod;  
import javax.jws.WebParam;  
import javax.jws.WebResult;  
import javax.jws.WebService;  
import javax.jws.soap.SOAPBinding;  
  
/** 
 * 调用Sap提供的城市信息查询接口,重新将此功能定义成WSDL接口 将一个类发布出去,JDK必须是1.6.0_21及以上 
 *  
 * @author shuYangYang 
 * @email:shuyangyang@aliyun.com 
 * @website:www.shuyangyang.com.cn 
 */  
@WebService(name = "QueryService", portName = "QueryService", serviceName = "QueryServiceService", targetNamespace = "com.wilcom.service")  
@SOAPBinding(style = SOAPBinding.Style.RPC)  
public class QueryCityWSDL {  
  
    @WebMethod(operationName = "queryCity")  
    @WebResult(name = "status")  
    public String queryCity(@WebParam(name = "calld") String callId,  
            @WebParam(name = "phoneNO") String phoneNO) {  
        if (callId != "" && callId.length()>0 && phoneNO != "" && phoneNO.length()>0) {  
            return "success";  
        } else {  
            return "failure";  
        }  
    }  
  
}

 c6F思考者日记网-束洋洋个人博客

将 Java 类标记为实现 Web Service,或者将 Java 接口标记为定义 Web Service接口。必须要有此注解,才能发布,否则会抛出异常 java.lang.IllegalArgumentException: class com.wilcom.service.QueryCityWSDL has neither @WebSerivce nor @WebServiceProviderc6F思考者日记网-束洋洋个人博客

name:自定义的服务的名字;c6F思考者日记网-束洋洋个人博客

serviceName:获取自定义服务的服务的名字;c6F思考者日记网-束洋洋个人博客

targetNamespace:名称空间,默认值是包结构的反义 。c6F思考者日记网-束洋洋个人博客

二、定义成web项目发布c6F思考者日记网-束洋洋个人博客

写一个servlet初始调用此方法c6F思考者日记网-束洋洋个人博客

package com.wilcom.service;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.xml.ws.Endpoint;  
  
/** 
 * 初始化WSDL接口servlet 
 * @author shuYangYang 
 * @email:shuyangyang@aliyun.com 
 * @website:www.shuyangyang.com.cn 
 */  
public class QueryCityInit extends HttpServlet {  
    private static final long serialVersionUID = 1L;  
         
    public QueryCityInit() {  
        super();  
    }  
      
    @Override  
    public void destroy() {  
        super.destroy();  
    }  
  
    @Override  
    public void init() throws ServletException {  
        Endpoint.publish("http://localhost:3333/queryCity", new QueryCityWSDL());  
    }  
}

 c6F思考者日记网-束洋洋个人博客

三、调用wsdlc6F思考者日记网-束洋洋个人博客

package com.wilcom.test;  
  
import javax.jws.WebMethod;  
import javax.jws.WebParam;  
import javax.jws.WebResult;  
import javax.jws.WebService;  
import javax.jws.soap.SOAPBinding;  
import javax.xml.ws.Endpoint;  
  
/** 
 * 测试WSDL 
 * 将一个类发布出去,JDK必须是1.6.0_21及以上  
 * 将 Java 类标记为实现 Web Service,或者将 Java 接口标记为定义 Web Service  
 * 接口。必须要有此注解,才能发布,否则会抛出异常 java.lang.IllegalArgumentException: class  
 * com.pyy.ws.HelloService has neither @WebSerivce nor @WebServiceProvider  
 * annotation wsdl: name:自定义的服务的名字,serviceName:获取自定义服务的服务的名字,  
 * targetNamespace:名称空间,默认值是包结构的反义  
 * @author shuYangYang 
 * @email:shuyangyang@aliyun.com 
 * @website:www.shuyangyang.com.cn 
 */  
@WebService(name = "MyHelloService", portName = "MyHelloService",   
serviceName = "MyHelloServiceService", targetNamespace = "com.wilcom.test")  
@SOAPBinding(style = SOAPBinding.Style.RPC)  
public class Hello {  
      
    // 对外发布服务的网络地址    
    private final static String address = "http://localhost:3333/queryCity";    
    
    // wsdl:修改方法的名字    
    @WebMethod(operationName = "mySayHello")  
    // wsdl:修改return 的名字   
    @WebResult(name = "myReturn")  
    // wsdl:修改参数的名字   
    public String sayHello(@WebParam(name = "str") String str,   
            @WebParam(name = "age") int age) {   
        String info = "你的名字:" + str+"t你的年龄:"+age;  
        return info;    
    }    
    
    @WebMethod(exclude = true)    
    public void exclude() {    
        System.out.println("此注解表示方法不对外提供服务");    
    }  
    
    public static void staticMethod() {  
        System.out.println("static 方法不对外提供服务");  
    }  
    
    public final void finalMethod() {    
        System.out.println("final 方法不对外提供服务");    
    }    
    
    /**  
     * @param args  
     */    
    public static void main(String[] args) {    
        /**  
         * 参数一:终端服务所在网络路径 ,参数二:被发布的实现者,当前实例对象 将该类作为服务对外发布出去。  
         */    
        Endpoint.publish(address, new QueryCityWSDL());    
    }    
  
}

 c6F思考者日记网-束洋洋个人博客

运行此main方法,它会自带一个web容器,我们只要在地址栏里敲入发布地址就可以了,成功了之后会看到下图效果:c6F思考者日记网-束洋洋个人博客

wsdl01.jpgc6F思考者日记网-束洋洋个人博客

四、根据wsimport命令生成客户端代码来调用WebService服务 c6F思考者日记网-束洋洋个人博客

刚那main方法不要停,我们用cmd命令来编译客户端调用的代码c6F思考者日记网-束洋洋个人博客

cmd命令:wsimport -s E: -p com.client.jdk.wsimport http://localhost:3333/queryCity?wsdl

 OK了之后,将E盘的com文件夹copy到项目中,我们写测试类c6F思考者日记网-束洋洋个人博客

package com.wilcom.client;  
  
import com.client.jdk.wsimport.QueryService;  
import com.client.jdk.wsimport.QueryServiceService;  
  
/** 
 * 根据wsimport命令生成客户端代码来调用WebService服务  
 * cmd命令:wsimport -s E: -p com.client.jdk.wsimport http://localhost:3333/queryCity?wsdl 
 * @author shuYangYang 
 * @email:shuyangyang@aliyun.com 
 * @website:www.shuyangyang.com.cn 
 */  
public class QueryCityClient {  
  
    public static void main(String[] args) {  
        // 获取WebService提供的服务    
        QueryServiceService service = new QueryServiceService();    
        // 获得自己提供的服务    
        QueryService helloService = service.getQueryService();   
        // 调用服务中的方法    
        String str = helloService.queryCity("382376282i8233u3he", "13665642548");  
        System.out.println("服务器返回:" + str);  
    }  
  
}

 c6F思考者日记网-束洋洋个人博客

 

结果如下:c6F思考者日记网-束洋洋个人博客

wsdl02.jpgc6F思考者日记网-束洋洋个人博客

五、我们最后包装下,建一个servlet类,初始化这个方法,前面已经完成了,现在在web.xml里配置下。c6F思考者日记网-束洋洋个人博客

<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  <display-name>RestfulWSDL</display-name>  
  <welcome-file-list>  
    <welcome-file>index.html</welcome-file>  
    <welcome-file>index.htm</welcome-file>  
    <welcome-file>index.jsp</welcome-file>  
    <welcome-file>default.html</welcome-file>  
    <welcome-file>default.htm</welcome-file>  
    <welcome-file>default.jsp</welcome-file>  
  </welcome-file-list>  
  <servlet>  
    <servlet-name>QueryCityInit</servlet-name>  
    <servlet-class>com.wilcom.service.QueryCityInit</servlet-class>  
    <load-on-startup>1</load-on-startup>  
  </servlet>  
</web-app>

 c6F思考者日记网-束洋洋个人博客

 c6F思考者日记网-束洋洋个人博客

ok,现在启动web容器,敲入地址就可以了。c6F思考者日记网-束洋洋个人博客

 

(转载本站文章请注明作者和出处 思考者日记网|束洋洋个人博客 ,请勿用于任何商业用途)

『访问 思考者日记网404页面 寻找遗失儿童』

告知
  •     本站90%以上文章均属原创,部分转载已加上原作者出处。 如需转载本站文章请您务必保留本站出处!
  •     打广告评论者请自重,请为广大网友提供一个健康干净的网络空间。
  •  感谢主机屋提供网站空间;
  •  感谢万网阿里云提供域名解析;
  •  感谢EmpireCMS提供CMS系统;
  •  感谢bootstrap展示本站前端页面;
  •  感谢Glyphicons Halflings提供字体;
  •  感谢大家一直以来对本站的喜爱,感谢大家!
近期文章 建议与反馈