JAX-WS(JWS):Java WebService
2016-04-21 16:40
519 查看
Java 的 WebService概述
本文主要介绍java6以后的JAX-WS(JWS),Java 的 WebService框架有JWS、Axis2、XFire、CXF、Spring WS,简单介绍:
1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的。但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。
2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。
3、XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。但是对Java之外的语言,没有提供相关的代码工具。XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。
4、CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分。
基于以上的认识,我们可以得知,虽然有了Java6,但是我们还可以选择Axis2、XFire、CXF等。我们不能指望有了Java6 JWS,就能异想天开去实施SOA。如果要与别的语言交互,也许我们还有赖于Axis2等等,当然这不是唯一选择,仅仅是一种可供选择的方案。
还有,目前很多企业的应用还是基于Java5的,而Java5的项目不会瞬间都升级到Java6,如果要在老项目上做扩展,我们还有赖于其他开源的WS引擎。
WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷。知名的XFile(新的如CXF)、Axis1、Axis2等。
而Sun公司也不甘落后,从早期的JAX-RPC到现在成熟的、支持RPC调用与消息传递的JAX-WS都经过了市场的考验,十分成熟,而且使用JAX-WS开发WebService的收益是很大的,它是轻量级的。
我们使用JAX-WS开发WebService只需要很简单的几个步骤:写接口和实现=>发布=>生成客户端(测试或使用)。
而在开发阶段我们也不需要导入外部jar包,因为这些api都是现成的。首先是接口的编写(接口中只需要把类注明为@WebService,把 要暴露给客户端的方法注明为@WebMethod即可,其余如@WebResult、@WebParam等都不是必要的,而客户端和服务端的通信用RPC 和Message-Oriented两种,其他请查资料)
示例
import javax.jws.WebParam; import javax.jws.WebService; @WebService //@SOAPBinding(style = SOAPBinding.Style.RPC) public interface HelloWorld { String sayHi(@WebParam(name = "who") String who); String sayHello(@WebParam(name = "who") String who); }
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; @WebService //@WebService(endpointInterface = "com.conquer.comutils.core.jws.HelloWorld") public class HelloWorldImpl implements HelloWorld { @WebMethod// 默认的,可省略 @Override public String sayHi(String who) { return "hi, " + who; } // 排除的方法 @WebMethod(exclude = true) @Override public String sayHello(@WebParam(name = "who") String who) { return "hello, " + who; } }
import javax.xml.ws.Endpoint; public class Main { static final String ADDRESS = "http://localhost:8080/test/jaxws/services/HelloWorld"; public static void main(String[] args) { HelloWorld helloWorld = new HelloWorldImpl(); Endpoint.publish(ADDRESS, helloWorld); System.out.println("JAX-WS WebService 服务已启动"); } }
运行main就可以发布一个webservice了。
由于通信走的webservice协议,客户端不受语言限制,java或其它语言均可以,这里不详述了。
最后是客户端使用,由于WebService是平台和语言无关的基于xml的,所以我们完全可以使用不同语言来编写或生成客户端。以下是在Windows平台下使用jdk自带工具wsimport生成客户端的方式:
jdk自带的wsimport工具生成,上图我是把客户端文件生成到了桌面src文件中(-d),并保留了源文件(-keep),指定了包名(-p)。
然后我们就可以使用生成的文件来调用服务器暴露的方法了
值得一提的是你生成使用的jdk和你客户端的jre需要配套!
从上面的目录结构我们可以发现:服务端的每个webmethod都被单独解析成为了一个类(如果使用了实体,实体也会被解析到客户端,并且是源码,所以建议使用实体时慎重)。
相关文章推荐
- RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
- [改善Java代码]break万万不可忘
- Eclipse中引用了lint工具,打包时报错
- java要注意的问题2
- Java实验3 类的多态性和接口
- xml与javaBean的互相转化
- 接上一篇 word2vec调用demo
- weblogic服务器部署web代理修复weblogic的JAVA反序列化漏洞
- JAVA--浅谈线程
- [改善Java代码]易变业务使用脚本语言编写
- java IO 一 (读写字符串)
- JAVA守护线程
- spring整合消息队列rabbitmq
- JavaMail类
- Java类代码块执行顺序
- java要注意的问题1
- Java反射机制Class类的用法详解
- SpringMvc、Maven整合FreeMarker--访问不到js、css
- JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
- 启动报错: org.springframework.web.context.ContextLoaderListener