JAVA的WebService支持

  • 格式:pdf
  • 大小:431.70 KB
  • 文档页数:55

19-JAVA的WebService支持 李海峰李海峰((QQ:61673110)-Andrew830314@163.com SOA(Service-Oriented Architecture)面向服务架构是一种思想,它将应用程序的不同功能单元通过中立的契约(独立于硬件平台、操作系统和编程语言)联系起来,使得各种形式的功能单元更好的集成。目前来说,WebService是SOA的一种较好的实现方式,WebService采用HTTP作为传输协议,SOAP(Simple Object Access Protocol)作为传输消息的格式。但WebService并不是完全符合SOA的概念,因为SOAP协议是WebService的特有协议,并未符合SOA的传输协议透明化的要求。SOAP是一种应用协议,早期应用于RPC的实现,传输协议可以依赖于HTTP、SMTP等。 SOA的产生共经历了如下过程:

通常采用SOA的系统叫做服务总线(BUS),结果如下图所示: ------------------------------------------------------------------------------------ 1.JAVA的WebService规范JAX-WS: JAVA中的WebService规范叫做JAX-WS(Java API For XML-WebService),JDK1.6自带的版本为JAX-WS2.1,其底层支持为JAXB。早期的基于SOAP的JAVA的Web服务规范JAX-RPC(Java API For XML-Remote Procedure Call)目前已经被JAX-WS规范取代,JAX-WS是JAX-RPC的演进版本,但JAX-WS并不完全向后兼容JAX-RPC,二者最大的区别(通常会影响到使用)就是RPC/encoded样式的WSDL, JAX-WS已经不提供这种支持。 JAX-WS(JSR 224)规范的API位于javax.xml.ws.*包,其中大部分都是注解,提供API操作Web服务(通常在客户端使用的较多,由于客户端可以借助SDK生成,因此这个包中的API我们较少会直接使用)。WS-MetaData(JSR 181)是JAX-WS的依赖规范,其API位于javax.jws.*包,使用注解配置公开的Web服务的相关信息和配置SOAP消息的相关信息。这里还要提到的是SAAJ(SOAP With Attachment API For Java,JSR 67)规范,其API位于javax.xml.soap.*包,提供操作SOAP消息的API,支持附件传输,但你不要被Attachment这个单词欺骗,认为这是一个为了辅助JAX-WS支持附件传输的规范,其实两者均可以独立工作,只不过SAAJ暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS更加抽象,隐藏了更多的细节,实现起来你基本上不需要关心SOAP的任何细节,也就是如果你想控制SOAP消息的更多细节,可以使用SAAJ,目前版本为1.3。

这里我们采用Apache CXF作为JAX-WS的实现,CXF是Objectweb Celtix和Codehaus XFire合并而成,不仅支持JAX-WS(一般称之为SOAP方式的Web服务),也支持目前流行的JAX-RS(一般称之为REST风格的Web服务)。CXF的核心是org.apache.cxf.Bus(总线),类似于Spring的ApplicationContext,Bus由BusFactory创建,默认是SpringBusFactory类,可见默认CXF是依赖于Spring的,Bus都有一个ID,默认的BUS的ID是cxf。 你要注意的是Apache CXF 2.2的发行包中的jar你如果直接全部放到lib目录,那么你必须使用JDK1.6,否则会报JAX-WS版本不一致的问题。

Web服务从前面的图中不难看出自然分为Server、Client两部分,Server公开Web服务,Client调用Web服务,双方传输数据使用的SOAP消息格式封装数据,在后面我们会看到其实SOAP信封内包装的就是一段XML代码。

------------------------------------------------------------------------------------ I.服务端示例服务端示例:: 我们先看一个服务器端示例: (1.)公开Web服务的接口IHelloService: package net.ilkj.soap.server;

import javax.jws.WebService; @WebService public interface IHelloService {

Customer selectMaxAgeStudent(Customer c1, Customer c2); Customer selectMaxLongNameStudent(Customer c1, Customer c2); } 我们看到这个接口很简单,仅仅是使用类级别注解@WebService就标注了这个接口的方法将公开为Web服务,使用了这个注解的接口的所有方法都将公开为Web服务的操作,如果你想屏蔽某个方法,可以使用方法注解@Method的exclude=true。我们也通常把公开为Web服务的接口叫做SEI(Service EndPoint Interface)服务端点接口。 (2.)实现类HelloServiceImpl: package net.ilkj.soap.server;

public class HelloServiceImpl implements IHelloService { @Override public Customer selectMaxAgeStudent(Customer c1, Customer c2) { if (c1.getBirthday().getTime() > c2.getBirthday().getTime()) return c2; else return c1; }

@Override public Customer selectMaxLongNameStudent(Customer c1, Customer c2) { if (c1.getName().length() > c2.getName().length()) return c1; else return c2; }

} 这个实现类没有任何特殊之处,但是如果你的实现类还实现了其他的接口,那么你需要在实现类上使用@WebService注解的endpointInterface属性指定那个接口是SEI(全类名)。

(3.)Customer类: package net.ilkj.soap.server;

import java.util.Date; import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Customer") public class Customer { private long id; private String name; private Date birthday;

public long getId() { return id; }

public void setId(long id) { this.id = id; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public Date getBirthday() { return birthday; }

public void setBirthday(Date birthday) { this.birthday = birthday; } } 这个类是公开为Web服务的接口中的参数类型和返回值,因此你需要使用JAXB注解告诉CXF如何在XML和Java Object之间处理,因为前面说过SOAP消息格式包装的是一段XML代码,那么无论是服务器端还是客户端在接收到SOAP消息时都需要将XML转化为Java Object,在发送SOAP消息时需要将Java Object转化为XML。 (4.)发布Web服务: package net.ilkj.soap.server;

import javax.xml.ws.Endpoint; public class SoapServer { public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:8080/helloService", new HelloServiceImpl()); }

} 注意我们发布Web服务使用的是javax.xml.ws.*包中的EndPoint的静态方法publish()。

(5.)查看WSDL: 我们访问http://127.0.0.1:8080/helloService?wsdl地址,您会看到很长的XML文件(由于浏览器的问题,如果你看到的是空白页面,请查看源代码),这就是WSDL(WebService Definition Language),对于你要访问的Web服务,只要在其地址后加上,就可以在浏览器中查看用于描述Web服务的WSDL,这也是一种XML,Web服务能够被各种编程语言书写的程序访问就是通过WSDL这种通用的契约来完成的。