利用Java技术实现基于XML的Web服务
摘要: XML解决了数据表示的问题,将数据显示与数据表示分离开,W3C制定的XML Schema(XSD)定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web 服务平台利用XSD来作为其数据类型系统,Web服务描述语言(WSDL)就是基于XML的语言,用于描述Web 服务及其函数、参数和返回值。Web服务可以实现跨防火墙的通信,有利于应用程序集成 ,软件和数据重用。本文介绍了如何利用Java(主要是Java Web服务开发包)及相关技术来实现Web服务。
关键词:Web服务;Java;XML
引言
随着互联网的影响逐步扩大,网上交易、电子商务的逐渐繁荣,企业内部、企业间的信息交流越来越依赖于Internet。然而,目前大多数电子商务的应用和基于Web的商业服务,由于开发语言、部署平台、采用的通信协议的不同,以及对外交换数据格式的差异,系统的集成将花费高昂的代价。WEB 服务的主要目标,就是在现有的各种异构不台的基础上构筑一个通用的与平台无关、语言无关的技术层,从而实现各种平台之上的应用彼此连接和集成。
1 XML与Java
Web服务的实现,离不开XML。XML,是Web服务实现的一个关键技术,它满足了Web服务在不同信息系统之间实现数据间交流的需要。XML是一种标准标记语言,通过采用XML,可以成为受到大量标准和产品支持的一个正在迅速发展的社团的一员。这意味着在创建、操作、存储和交换XML文档时,很容易找到以各种形式提供的支持。特别是在W3C推出了一系列的标准来完善XML之后,XML更是得到了广泛的应用。迄今为止,XML已经成为了Web上最理想的数据表达方式和Web上数据表示和交换的事实标准,是应用之间或者机器之间共享数据的一种有效方式。
Java技术。Java天然的跨平台能力,一次编写到处运行的通用代码,使之成为Web服务编程语言的自然选择。同时,J2EE平台的可扩展性,安全性,高效性,也为Web服务的开发提供方便,部分解决了Web服务的安全问题,扩展问题。另外,Java新增的专门用于XML处理的APIs,为处理XML数据提供了更大的方便。Java强大的处理XML数据的能力与跨平台特性,为Web服务的开发提供了便利,开发者可以利用J2EE 的标准API 以及各种组件来开发系统。
2 Web 服务体系结构
在Web 服务的体系结构中包括三个角色:服务提供者(Service Provider)、服务请求者(Service Requestor)、服务注册器(Service Registry)。角色间主要有三个操作:发布(Publish)、查找(Find)、绑定(Bind)。Web服务体系结构图如1 所示。具体来说,Web 服务体系结构中的角色如下:
(1) 服务提供者(Service Provider) 。从企业的角度看,这是服务的所有者;从体系结构的角度看,这是托管访问服务的平台。
(2) 服务请求者(Service Requester) 。从企业的角度看,这是要求满足特定功能的企业;从体系结构的角度看,这是寻找并调用服务,或启动与服务的交互的应用程序。服务请求者角色可以由浏览器来担当,由人或无用户界面的程序(例如另外一个Web 服务) 来控制它。
(3) 服务注册中心(Service Broker) 。这是可搜索的服务描述注册中心,服务提供者在此发布他们的服务描述。在静态绑定开发或动态绑定执行期间,服务请求者查找服务并获得服务的绑定信息(在服务描述中) 。对于静态绑定的服务请求者,服务注册中心是体系结构中的可选角色,因为服务提供者可以把描述直接发送给服务请求者。
Web 服务体系结构中的操作如下:
(1) 发布(Publish) 。为了使服务可访问,需要发布服务描述以使服务请求者可以查找它。发布服务描述的位置可以根据应用程序的要求而变化。
(2) 查找(Find) 。在查找操作中,服务请求者直接检索服务描述或在服务注册中心中查询所要求的服务类型。
(3) 绑定(Bind) 。在绑定操作中,服务请求者使用服务描述中的绑定细节来定位、联系和调用服务,从而在运行时调用或启动与服务的交互。
3 Web 服务中的核心协议
1 SOAP
简单对象访问协议(Simple Object Access Protocol ,SOAP) 是在分散或分布式的环境中通过XML 交换信息的一种简单协议。它包括四个部分: ①SOAP 封装(Envelop) ,封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架; ②SOAP 编码规则( Encoding Rules) ,用于表示应用程序需要使用的数据类型的实例; ③SOAP RPC
表示(RPC Representation) ,表示远程过程调用和应答的协定; ④SOAP 绑定(Binding) ,使用底层协议交换信息。SOAP 作为一个开放协议,可以简单的理解为SOAP = RPC + HTTP + XML :采用HTTP 作为底层通信协议;RPC 作为一致性的调用途径;XML 作为数据传送的格式,允许服务提供者和服务客户经过防火墙在Internet 进行通信交互。当然,SOAP 也可以使用SMTP ,FTP 等作为底层通信协议。
2 WSDL
Web 服务描述语言(Web Services Definition Language ,WSDL)定义了一套基于XML 的语法,将Web 服务描述为能够进行消息交换的服务访问点的集合。在WSDL 中,由于服务访问点和
消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;端口类型,指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web 访问地址与可再次使用的绑定相关联,可以定义一个端口,而端口的集合则定义为服务。在Web服务实现中,WSDL等文件的生成通常是利用厂商提供的工具来完成。
3 UDDI
统一描述、发现和集成协议(UDDI) 是一套基于Web 的、分布式的、为Web 服务提供的信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web 服务注册以使别的企业能够发现的访问协议的实现标准。UDDI 提供了一种基于分布式的商业注册中心的方法,该商业注册中心维护了一个企业和企业提供的Web 服务的全球目录,而且其中的信息描述格式是基于通用的XML 格式的。UDDI 同时也是一组基于Web 的注册中心的名字,这些注册中心存储了商业或其他实体的信息及其提供的服务的相关技术调用界面(或API) 。这些注册中心通过多个UDDI 操作入口站点(Operator Site) 运作,通过访问任意一个公共的UDDI 操作入口站点,任何人都可以查询商业实体提供的或代表商业实体的Web 服务。
4 Web服务的实现
1 Java Web 服务开发包
Java Web Services Developer Pack 是SUN 为Web服务提供的一个开发包, 它将Java 和XML 技术集成到一个包中,让开发人员可以更快捷、容易地将XML 技术集成到开发的项目中去。可以将Java XML APIs分成二类:用于文档处理APIs和过程处理APIs。
l 面向XML文档处理的APIs
(1)JAXP(Java API for XML Processing )。这类APIs使用各种解析器来转换和处理XML文档。支持二种方式处理XML文档:一种是基于SAX技术的,一种是基于DOM技术的。同时,最新的JAXP也支持XSLT标准。
(2)JAXB(the Java Architecture for XML Binding)。XML 绑定技术可以从XML Schema实现到Java类的转换。用JAXB ,你可以在后台的EJB 层,把XML 文档转换成Java 对象;同样你也可以把从EJB 中取出的Java对象转换成XML文档返回给用户。JAXB接口提供了比SAX和DOM更高级的方法来处理XML 文档。
(3)SAAJ(the SOAP with Attachments API for Java)。SAAJ为Java平台通过Internet发送XML文档提供了一种标准方式。它基于SOAP1.1和带附件的SOAP规范,为XML消息的交换提供了基本框架。
l 面向过程处理的APIs
(1)JAX-RPC(the Java API for XML-based RPC) 。它支持基于XML的远程过程调用,定义了WSDL/XML和Java 之间的映射,让开发者可以快速开发基于SOAP的Web服务。RPC机制常用于分布式client/server模型中。
(2) JAXR(the Java API for XML Registries)。JAXR是在服务注册中使用的一种Java XML API ,它提供统一的接口实现商业注册,支持ebXML ,UDDI以及其他的一些注册规范。
2 Web服务的具体实现
Web服务的实现,主要包括逻辑层的实现,服务的部署,生成客户访问代码以及部署客户应用四个基本步骤。使用JAX-RPC开发Web服务需要处理服务器端和客户端二个部分。
2.1 服务器端
在服务器端,首先依据所应提供的服务编写逻辑实现所需的功能,编译成class文件,然后使用工具生成所需要文件,打包为WAR文件,最后部署服务。具体实现包括以下几个步骤:
(1) 编写服务端接口及继承接口实现所需要功能的逻辑类。一个服务的end-point有一些规定:必须实现java.rmi.Remot接口,每个方法需要抛出RemoteException异常。在继承接口的类中,实现提供服务所要实现的逻辑功能。
(2) 编译服务所需的类文件。这个过程是指将java文件编译为class文件,是整个过程的基础。
(3)生成服务所需文件。使用wscompile工具生成model.gz文件,它包含了描述服务的内部数据结构。具体命令如下:
wscompile -define -d build -nd build -classpath build config.xml -model build/model.gz
其中:define标志告诉工具读取服务的 endpoint接口并且创建WSDL文件。-d和-nd标志告诉工具将输出文件写入指定的目录build,config.xml表示工具需要从该文件中读取信息,model.gz为生成的所需文件。
(4)将服务打包为WAR文件。将类文件、model.gz、Web应用程序描述信息的Web.xml文件、以及调用Web服务说明信息的jaxrpc-ri.xml等这些文件复制到WEB-INF目录,并使用jar命令打包为WAR文件。
(5)处理WAR文件。使用wsdeploy命令生成可部署的WAR文件。具体命令如下:
wsdeploy -o outputfile.war inputfile.war
其中:inputfile.war是输入信息文件,即(4)打包生成的WAR文件,outputfile为新生成的可部署文件,里面包含tie classes和wsdl文件。
(6)在服务器上部署服务。使用SOAP服务器提供的deploy命令部署打包好的WEB服务。如果使用的是TOMCAT,直接将WAR文件拷贝到webapps目录即可。然后可以从提供部署的SOAP服务中查看是否配置成功。对于TOMCAT,可以在<http://localhost:8080/[context]/[servi
cename>上查看。
2.2 客户端
通常有三种类型的客户:Static Stub、Dynamic Proxy和Dynamic Invocation Interface(DII)
(1) Static Stub。Static Stub类型的实现主要涉及步骤有:产生Stub、编写静态客
户代码、编译代码、运行客户端。wscompile工具读取服务器上的WSDL文件并生成stub:
wscompile -gen:client -d build -classpath build config-wsdl.xml
(2) Dynamic Proxy。Dynamic Proxy类型的实现主要涉及步骤有:生成接口、编写动态客户代码、编译代码、运行客户端。wscompile工具读取服务器上的WSDL文件,可以生成客户所需的接口:
wscompile -import -d build -classpath build config-wsdl.xml
(3) Dynamic Invocation Interface(DII)。DII方法提供了更有弹性的客户调用方式,客户代码不在需要由wscompile工具生成的运行时类。但这种代码更加复杂。具体步骤如下:
·创建ServiceFactory实例
·创建Service(利用服务名的Qname)
·创建Call对象(使用端点接口的Qname)
·设置端点的地址和一些Call对象属性
·设置远程调用的返回类型、操作名和参数
·调用call的invoke方法
·编译代码并对Main方法设置
采用Static Stub和Dynamic Proxy类型的客户端实现方式,必须知道WSDL描述信息,通过输入WSDL文档来产生运行时需要的类文件,才能编译源文件。而对于DII方法,并不需要使用wscompile工具来产生相应的类文件,只要求在运行时知道相应的信息,相对更加灵活,但在编写客户端代码时相对复杂一些。
3 注册Web 服务和查找注册
客户可以将自己的服务注册到UDDI 服务器,也可以从注册中心查找自己所需的其它客户提供的服务。可以使用JAXR 技术实现这些操作。
在注册过程中,首先要与注册中心建立连接,然后用add 方法将注册信息包括服务的名称、描述和便于查找的分类概念等加入到服务的组织中,最后将组织用add 方法和saveOragnization 方法加入并保存到注册中心。
在查找注册时,可以激活findOrganizations 方法来完成。在客户端和注册中心交互过程中,使用者能在底层不可见的情况下顺利完成操作。
5 结束语
本文主要讨论了如何利用Java技术实现基于XML的Web服务。利用Java Web Service Developer Pack和XML标准,我们可以开发出功能强大、具有良好的灵活性和可扩展性的Web服务系统。Java由于其跨平台性,安全性等网络开发优势,与XML相关标准的结合,是开发Web服务程序的优秀语言。目前,开发Web服务的技术包括Servlets、JSP、JavaServer Faces、EJB等等。随着Java API 更高版本的出现,Web 服务的开发将变得更加简单,各种标准和技术的改进将有利于提供一个更加强大和完善的解决方案。
参考文献:
1 JWSDP-1.3 Tutorial,http://java.sun.com
2 柴晓路,梁宇奇,Web Services 技术、架构和应用,电子工业出版社,2003.
3 Jasnowski,M. Java ,XML 和Web 服务宝典[M],北京:电子工业出版社,2003.
4 David Chappel,Tyler Jewell,Java Web Services[M] ,O’Reilly Press ,2002