本文将从实战的角度,描述利用 Java 开拓 WS 的工具及其利用过程。
如果说得再专业一点,WS 实在便是建立在 HTTP 协议上实现异构系统通讯的工具。没错!
WS 说白了还是基于 HTTP 协议的,也便是说,数据是通过 HTTP 进行传输的。
自从有了 WS,异构系统之间的通讯不再是遥不可及的梦想。比如:可在 PHP 系统中调用 Java 系统对外发布的 WS,获取 Java 系统中的数据,或者把数据推送到 Java 系统中。
如果您想理解更多关于 WS 的那些观点与术语,可以看看下面的百度百科:
http://baike.baidu.com/view/67105.htm
本日我想与大家分享的主题是,如何在 Java 中发布与调用 WS?希望本文能够对您有所帮助!
1. 利用 JDK 发布 WS
第一步:您要做的第一件事情便是,写一个做事接口。
在接口上放一个 WebService 表明,解释该接口是一个 WS 接口(称为“Endpoint,端点”),个中的方法是 WS 方法(称为“Operation,操作”)。
第二步:实现这个 WS 接口,在实现类中完成详细业务逻辑,为了大略,我们还是写一个 Hello World 意思一下吧。
第三步:写一个 Server 类,用于发布 WS,直策应用 JDK 供应的工具即可实现。
只需利用 JDK 供应的 javax.xml.ws.Endpoint 即可发布 WS,只需供应一个 WS 的地址(address),还需供应一个做事实例(helloService)。
现在您就可以运行 Server 类的 main 方法了,会在掌握台里看到“ws is published”的提示,此时恭喜您,WS 已成功发布了!
第四步:打开您的浏览器,在地址栏中输入以下地址:
http://localhost:8080/ws/soap/hello?wsdl
把稳:以上地址后面有一个 ?wsdl 后缀,在 Server 类中的 address 里却没有这个后缀。此时,在浏览器中会看到如下 XML 文档:
当看到这份 WSDL 文档时,也就意味着,您发布的 WS 做事现在可以被别人利用了。
2. 通过客户端调用 WS
第一步:利用 JDK 供应的命令行工具天生 WS 客户端 jar 包。
JDK 安装目录下有个 bin 目录,里面存放了大量的命令行工具,只要您的 Path 环境变量指向了该路径,就能在命令掌握台上利用 JDK 供应的干系命令。
个中,有一个名为 wsimport 的命令行工具,正是用来通过 WSDL 天生 WS 客户端代码的,您只须要输入以下命令即可:
对以上三行命令阐明如下:
第一行:通过 WSDL 地址天生 class 文件第二行:通过 jar 命令将多少 class 文件压缩为一个 jar 包第三行:删除天生的 class 文件(删除根目录即可)终极您将会得到一份名为 client.jar 的 jar 包,将这个 jar 包配置到您的 classpath 中,方便不才面的代码中利用个中的类。
技巧:可以将以上三行命令放入一个 bat 文件中,在 Windows 中双击即可运行。
第二步:写一个 Client 类,用于调用 WS,须要利用上一步天生的 WS 客户端 jar 包。
以上这段代码轻微有点怪异,个中 HelloService_Service 是 jar 包中类,可以将其理解为 WS 的工厂类,通过它可以天生详细的 WS 接口,比如,调用 service.getHelloServicePort() 方法,就获取了一个 HelloService 实例,正是通过这个实例来调用个中的方法。
运行 Client 类的 main 方法,就会看到您所期望的结果“hello world”了,不妨亲自考试测验一下吧。
可见,这是一个范例的“代理模式”运用处景,您实际是面向代理工具来调用 WS 的,并且这是一种“静态代理”,下面我们来谈谈,如何利用“动态代理”的办法来调用 WS?
实在 JDK 已经具备了动态代理的功能,对付 WS 而言,JDK 同样也供应了很好的工具,就像下面这段代码那样:
此时,只需在本地供应一个 HelloService 的接口,无需 client.jar,直接面向 WSDL 编程,只不过您须要分别定义出 serviceName 与 portName 这两个东西,末了才能调用 JDK 供应的 javax.xml.ws.Service 类天生 service 工具,它同样是一个工厂工具,通过该工厂工具获取我们须要的 HelloService 实例。貌似这种办法也不是特殊动态,毕竟 HelloService 接口还是须要自行供应的。
3. 总结
通过本文,您可以理解到,不仅可以利用 JDK 发布 WS,也可以利用 JDK 调用 WS,这统统都是那么的大略而自然。但须要把稳的是,这个特性是从 JDK 6 才开始供应的,如果您还在利用 JDK 5 或更低的版本,那就很遗憾了,您不得不该用以下工具来发布与调用 WS,它们分别是:
JAX-WS RI:https://jax-ws.java.net/Axis:http://axis.apache.org/CXF:http://cxf.apache.org/当然,发布与调用 WS 的工具不仅仅只有以上这些,而是它们是 Java 天下中最精良的 WS 开源项目。
本文讲述的 WS 实在是一种 Java 规范,名为 JAX-WS(JSR-224),全称 Java API for XML-Based Web Services,可以将规范理解为官方定义的一系列接口。
JAX-WS 有一个官方实现,便是上面提到的 JAX-WS RI,它是 Oracle 公司供应的实现,而 Apache 旗下的 Axis 与 CXF 也同样实现了该规范。Axis 相对而言更加老牌一些,而 CXF 的前世便是 XFire,它是一款著名的 WS 框架,善于与 Spring 集成。
从实质上讲,JAX-WS 是基于 SOAP 的,而 SOAP 的全称是 Simple Object Access Protocol(大略工具访问协议),虽然名称里带有“大略”二字,实在并不大略,不相信您可以百度一下。
为了让 WS 的开拓与利用变得更加大略、更加轻量级,于是涌现了另一种风格的 WS,名为 JAX-RS(JSR-339),全称 Java API for RESTful Web Services,同样也是一种规范,同样也有多少实现,它们分别是:
Jersey:https://jersey.java.net/Restlet:http://restlet.com/RESTEasy:http://resteasy.jboss.org/CXF:http://cxf.apache.org/个中,Jersey 是 Oracle 官方供应的实现,Restlet 是最老牌的实现,RESTEasy 是 JBoss 公司供应的实现,CXF 是 Apache 供应的实现(上文已做先容)。
可见,CXF 不仅用于开拓基于 SOAP 的 WS,同样也适用于开拓基于 REST 的 WS,这么好的框架我们怎能错过?