在Java6中实现Web服务

第三章 实现Web服务

 

在第二章中,我们演示了如何使用基本的POX-over-HTTP方法来实现Web服务,同时,我们也介绍了SOAPSOAP现在已经成为业界不可或缺的技术和标准,因为当今大多数跨越合作伙伴的B2B的消息传输都是基于SOAP协议的。但SOAP(简单对象访问协议)是否象它的名字喻示的那样简单,人们仍有争议。但有一点是毋庸置疑的,SOAP是一种开放的标准,业界提供了支持SOAP开发的工具和框架,对SOAP进行了广泛的支持。几乎所有的Web服务堆栈都采用了SOAP作为网络传输协议,基于JavaWeb服务框架更是如此。为了使用Java实现您自己的Web服务,或者在Java代码中访问第三方提供的Web服务,您需要了解,您有多种方法来实现Web服务。本章就来向您介绍在Java/J2EE环境下,实现Web服务的主要方法,它们分别是:

(1)  使用JAX-WS 2.0来实现Web服务
(2)  使用Apache Axis来实现Web服务
(3)  使用Spring来实现Web服务
(4)  使用XFire来实现Web服务

我们将通过代码实例,从头开始演示如何使用上面的四种技术框架来创建Web服务,以及如何在代码中访问已有的Web服务。

使用JAX-WS 2.0来实现Web服务

JAX-WSJava API for XML Web Service(XML Web服务的Java编程接口)的缩写,JAX-WS2.0规范替代了以前的JAX-RPC1.0规范,它是基于JSR224规范的下一代Web服务开发的编程接口。

JAX-WS2.0基础

JAX-WS2.0项目是在JAX-WS规范参考实现的代码基的基础上进行开发和演变的,您可以通过https://jax-ws.dev.java.net/ 了解这个项目。现在,该项目既支持JAX-WS2.0规范,也支持JAX-WS2.1规范。

下面列出了JAX-WS2.0实现中的一些新特性:

(1) 直接支持基于JAXB2.0的数据绑定
(2) 支持最新的W3C和WS-I标准(如SOAP 1.2、WSDL 1.2和SAAJ 1.3等标准)
(3) 对Java和WSDL之间映射的元素据进行了标准化
(4) 易于开发
(5) 使Web服务的升级变得简单
(6) 对Web服务的处理器框架进行了升级
(7) 支持异步RPC和非HTTP传输

JAX-WS2.0另一个令人振奋的特点是,它已经包含在Java6标准版内,这意味着基于JAX-WS2.0的代码和组件能在任何与J2EE兼容的服务器(GlassFish服务器)上运行,同时,也可以在Java6标准版的环境下运行,这对Java开发者来说确实是一个很大的优势。而此前只有.Net的开发者享有这项权利(.Net栈支持轻量级的Web服务开发)

Java6平台下,JAX-WS2.0提供了以下全新的API,用于创建Web应用和Web服务。

API

API所在的包

JAX-WS

javax.xml.ws

SAAJ

javax.xml.soap

WS Metadata

javax.jws


Java6标准版中实现Web服务

下面我们先从最简单的Web服务入手,不使用任何应用服务器和第三方Web服务器,而只是用Java6标准版及其自带的工具,来开发并部署一个简单的Web服务。

服务器及客户端代码

如前所述,我们现在就开始开发这个简单的Web服务,这是我们的第一个示例,具体代码请参见“ch03/01_JaxWS/JavaStandAlone”目录。(译者注:本书代码请从http://www.packtpub.com/files/code/3216_Code.zip处下载。)

服务器端代码由三个Java文件构成,位于/ch03/01_JaxWS/JavaStandAlone/Server/src目录,下面是对代码的详细解释:

IHello.java

IHello是一个Java接口,其源代码如下:

  1. public interface IHello{ 
  2.  String sayHello (String name);
  3. }

 

HelloImpl.java

HelloImpl 实现了IHello接口中定义的业务逻辑方法,该方法将暴露出来作为Web服务。

  1. import javax.jws.WebService; 
  2. import javax.jws.soap.SOAPBinding; 
  3. import javax.jws.WebMethod; 
  4. @WebService(name="IHello", serviceName="HelloService"
  5. @SOAPBinding(style=SOAPBinding.Style.RPC) 
  6. public class HelloImpl implements IHello{ 
  7. @WebMethod(operationName = "sayHello"
  8. public String sayHello(String name){ 
  9.   System.out.println("HelloImpl.sayHello..."); 
  10.   return "/nHello From Server !! : " + name; 

在上面的HelloImpl的实现代码中,我们可以看到一个叫javax.jws.WebServiceJava注解,这个@WebService注解是将一个普通类定义为Web服务发布对象(亦称终端,endpoint)javax.jws.soap.SOAPBinding这个注解指明了如何将Web服务绑定到SOAP消息上。HelloImpl只声明了一个方法sayHello,该方法带@WebMethod的注解,这个注解将会把该方法暴露给客户端。其实,要创建一个JAX-WS服务并不需要IHello接口,我们这里只是让大家保持良好的编程习惯而已。

HelloServer.java
HelloServer是服务器端的主类,它利用javax.xml.ws.Endpoint来发布Web服务,其代码如下:

  1. import javax.xml.ws.Endpoint;
  2. public class HelloServer {
  3. public static void main(String args[]) {
  4. log("HelloServer.main : Creating HelloImpl...");
  5. IHello iHello = new HelloImpl();
  6. try{
  7.   // Create and publish the endpoint at the given address
  8.   log("HelloServer.main : Publishing HelloImpl...");
  9.   Endpoint endpoint1 =
  10.   Endpoint.publish("http://localhost:8080/Hello", iHello);
  11.   log("HelloServer.main : Published Implementor...");
  12. }
  13. catch (Exception e) {
  14.   System.err.println("ERROR: " + e);
  15.   e.printStackTrace(System.out);
  16. }
  17. System.out.println("HelloServer Exiting ...");
  18. }
  19. }

HelloClient.java

Web服务客户端代码只有一个Java源文件,位于ch03/01_JaxWS/JavaStandAlone/Client/src目录。HelloClient依赖于HelloServiceIHello这两个类,在我们后面对客户端代码进行编译时,这两个类可以自动生成。客户端的源代码非常简单明了:

  1. public class HelloClient {
  2. public static void main(String args[]) {
  3. log("HelloClient.main : Creating HelloImpl...");
  4. HelloService helloService = null;
  5. IHello helloImpl = null;
  6. String gotFromServer = null;
  7. try {
  8.   log("HelloClient.main : Creating HelloImplService...");
  9.   if (args.length != 0) {
  10.   helloService = new HelloService(new URL(args[0]), new QName(
  11.     args[1], args[2]));
  12.   } else {
  13.   helloService = new HelloService();
  14.   }
  15.   log("HelloClient.main : Retreiving HelloImpl...");
  16.   helloImpl = helloService.getIHelloPort();
  17.   log("HelloClient.main : Invoking helloImpl.sayHello(/"Binil/")...");
  18.   gotFromServer = helloImpl.sayHello("Binil");
  19.   log("HelloClient.main : gotFromServer : " + gotFromServer);
  20. catch (Exception e) {
  21.   System.err.println("ERROR: " + e);
  22.   e.printStackTrace(System.out);
  23. }
  24. }
  25. }

首先,您得实例化HelloServer接口,该实例中含有连接到Web服务所必须的管道;然后,您将会得到Web服务的端口引用,这样,您就可以通过端口引用调用远程的Web服务。

运行服务器和客户端

如果您没有修改过本章下载代码中的examples.PROPERTIES文件,请先修改这个文件,将其中的路径指向您的开发环境。另外,在本章的下载的代码中,您也会看到一个README文件,这个文件给出了如何编译和运行示例程序的具体说明。

为了编译并启动服务器,您只需键入一个命令,请在命令行中切换到ch03/01_JaxWS/JavaStandAlone目录,并执行下面的命令:

cd ch03/01_JaxWS/JavaStandAlone
ant server


 

一旦服务器起来并运行,您就可以在另一个命令行窗口中执行ant client命令。当我们编译客户端代码时,我们还需要使用下面的ant任务,从发布的Web服务中生成几个客户端类:

  1. <target name="GenSrc">
  2. <exec executable="${env.JAVA_HOME}/bin/wsimport">
  3. <arg
  4.   line="-keep
  5.   -d build
  6.   -p com.binildas.ws.javastandalone.simple
  7.   -s ${gensrc} http://localhost:8080/Hello?WSDL" />
  8. </exec>
  9. </target>

客户端代码将依赖于上面这几个自动生成的类文件。运行完GenSrc任务后,我们就可以开始编译客户端代码,并向服务器发送Web请求,并把从服务器接收到的应答打印在控制台上,下面的命令将同时编译和运行客户端:

cd ch03/01_JaxWS/JavaStandAlone
ant client

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值