webService——学习(3):使用JDK开发webService
Web Service,即“Web 服务”,简写为 WS,从字面上理解,它其实就是“基于 Web 的服务”。而服务却是双方的,有服务需求方,就有服务提供方。服务提供方对外发布服务,服务需求方调用服务提供方所发布的服务。其实也就是这些了,没有多少高大上的东西。
如果说得再专业一点,WS 其实就是建立在 HTTP 协议上实现异构系统通讯的工具。没错!WS 说白了还是基于 HTTP 协议的,也就是说,数据是通过 HTTP 进行传输的。 自从有了 WS,异构系统之间的通讯不再是遥不可及的梦想。比如:可在 PHP 系统中调用 Java 系统对外发布的 WS,获取 Java 系统中的数据,或者把数据推送到 Java 系统中。 如果您想了解更多关于 WS 的那些概念与术语,可以看看下面的百度百科: http://baike.baidu.com/view/67105.htm 今天我想与大家分享的主题是,如何在 Java 中发布与调用 WS?希望本文能够对您有所帮助! 1. 使用 JDK 发布 WS第一步:您要做的第一件事情就是,写一个服务接口。 package?demo.ws.soap_jdk;import?javax.jws.WebService;@WebServicepublic?interface?HelloService?{????String?say(String?name); } 在接口上放一个? 第二步:实现这个 WS 接口,在实现类中完成具体业务逻辑,为了简单,我们还是写一个 Hello World 意思一下吧。 package?demo.ws.soap_jdk;import?javax.jws.WebService;@WebService( ????serviceName?=?"HelloService",????portName?=?"HelloServicePort",????endpointInterface?=?"demo.ws.soap_jdk.HelloService" )public?class?HelloServiceImpl?implements?HelloService?{????public?String?say(String?name)?{????????return?"hello?"?+?name; ????} } 第三步:写一个 Server 类,用于发布 WS,直接使用 JDK 提供的工具即可实现。 package?demo.ws.soap_jdk;import?javax.xml.ws.Endpoint;public?class?Server?{????public?static?void?main(String[]?args)?{ ????????String?address?=?"http://localhost:8080/ws/soap/hello"; ????????HelloService?helloService?=?new?HelloServiceImpl(); ????????Endpoint.publish(address,?helloService); ????????System.out.println("ws?is?published"); ????} } 只需使用 JDK 提供的? 现在您就可以运行 Server 类的 main 方法了,会在控制台里看到“ws is published”的提示,此时恭喜您,WS 已成功发布了! 第四步:打开您的浏览器,在地址栏中输入以下地址: http://localhost:8080/ws/soap/hello?wsdl 注意:以上地址后面有一个? 当看到这份 WSDL 文档时,也就意味着,您发布的 WS 服务现在可以被别人使用了。 2. 通过客户端调用 WS第一步:使用 JDK 提供的命令行工具生成 WS 客户端 jar 包。 JDK 安装目录下有个 bin 目录,里面存放了大量的命令行工具,只要您的? 其中,有一个名为? wsimport?http://localhost:8080/ws/soap/hello?wsdl jar?-cf?client.jar?. rmdir?/s/q?demo 对以上三行命令解释如下:
最终您将会得到一份名为? 技巧:可以将以上三行命令放入一个 bat 文件中,在 Windows 中双击即可运行。 第二步:写一个 Client 类,用于调用 WS,需要使用上一步生成的 WS 客户端 jar 包。 package?demo.ws.soap_jdk; public?class?Client?{ ????public?static?void?main(String[]?args)?{????????HelloService_Service?service?=?new?HelloService_Service();????????HelloService?helloService?=?service.getHelloServicePort();????????String?result?=?helloService.say("world");????????System.out.println(result); ????} } 以上这段代码稍微有点怪异,其中? 运行 Client 类的 main 方法,就会看到您所期望的结果“hello world”了,不妨亲自尝试一下吧。 可见,这是一个典型的“代理模式”应用场景,您实际是面向代理对象来调用 WS 的,并且这是一种“静态代理”,下面我们来谈谈,如何使用“动态代理”的方式来调用 WS? 其实 JDK 已经具备了动态代理的功能,对于 WS 而言,JDK 同样也提供了很好的工具,就像下面这段代码那样: package?demo.ws.soap_jdk;import?java.net.URL;import?javax.xml.namespace.QName;import?javax.xml.ws.Service; public?class?DynamicClient?{ ????public?static?void?main(String[]?args)?{????????try?{????????????URL?wsdl?=?new?URL("http://localhost:8080/ws/soap/hello?wsdl");????????????QName?serviceName?=?new?QName("http://soap_jdk.ws.demo/",?"HelloService");????????????QName?portName?=?new?QName("http://soap_jdk.ws.demo/",?"HelloServicePort");????????????Service?service?=?Service.create(wsdl,?serviceName);????????????HelloService?helloService?=?service.getPort(portName,?HelloService.class);????????????String?result?=?helloService.say("world");????????????System.out.println(result); ????????}?catch?(Exception?e)?{ ????????????e.printStackTrace(); ????????} ????} } 此时,只需在本地提供一个 HelloService 的接口,无需 client.jar,直接面向 WSDL 编程,只不过您需要分别定义出? 3. 总结通过本文,您可以了解到,不仅可以使用 JDK 发布 WS,也可以使用 JDK 调用 WS,这一切都是那么的简单而自然。但需要注意的是,这个特性是从 JDK 6 才开始提供的,如果您还在使用 JDK 5 或更低的版本,那就很遗憾了,您不得不使用以下工具来发布与调用 WS,它们分别是:
当然,发布与调用 WS 的工具不仅仅只有以上这些,而是它们是 Java 世界中最优秀的 WS 开源项目。 本文讲述的 WS 其实是一种 Java 规范,名为? JAX-WS 有一个官方实现,就是上面提到的 JAX-WS RI,它是 Oracle 公司提供的实现,而 Apache 旗下的 Axis 与 CXF 也同样实现了该规范。Axis 相对而言更加老牌一些,而 CXF 的前世就是 XFire,它是一款著名的 WS 框架,擅长与 Spring 集成。 从本质上讲,JAX-WS 是基于 SOAP 的,而 SOAP 的全称是 Simple Object Access Protocol(简单对象访问协议),虽然名称里带有“简单”二字,其实并不简单,不相信您可以百度一下。 为了让 WS 的开发与使用变得更加简单、更加轻量级,于是出现了另一种风格的 WS,名为?
其中,Jersey 是 Oracle 官方提供的实现,Restlet 是最老牌的实现,RESTEasy 是 JBoss 公司提供的实现,CXF 是 Apache 提供的实现(上文已做介绍)。 可见,CXF 不仅用于开发基于 SOAP 的 WS,同样也适用于开发基于 REST 的 WS,这么好的框架我们怎能错过? 如何使用 CXF 简化我们的 WS 开发?我们下期再见! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |