关于Web 服务
本模块将为你介绍Web 服务和实现Web 服务所用到的标准,并且概述了创建此类服务的过程。
本模块讲述了以下主题:
什么是Web 服务?
Web
服务就是可以通过web描述、发布、定位和调用的模块化应用。Web 服务可以执行任何功能,从简单的请求到复杂的业务过程。一旦Web
服务被部署,其他的应用程序或是Web 服务就能够发现并且调用这个部署的服务。
Web 服务通过简单对象访问协议 (Simple Object Access Protocol,SOAP)来调用。SOAP是一种轻量级的消息协议,它允许用任何语言编写的任何类型的对象在任何平台之上相互通信。SOAP消息采用可扩展标记语言(XML)进行编码,一般通过HTTP进行传输。与其它的分布式计算技术不同,Web
服务是松耦合的,而且能够动态地定位其他在internet上提供服务的组件,并且与它们交互。
Web 服务使用诸如SOAP消息这样的XML消息,通过一种良好定义的消息交换模式来调用。通过描述调用服务所必需的数据,Web服务描述语言
(WSDL)文档定义了消息交换模式。
Web服务中使用的消息模型
本节讲述Web服务用到的两种主要消息模型。它们的主要区别在于请求-响应操作的处理方式不同。
本节讲述了以下Web 服务模型:
同步模型
同步是指每当客户端访问Web 服务应用程序的时候,它会接收到一个SOAP响应。同步是一种请求-响应操作。同步服务是为客户端应用程序需要请求立即被响应的情况而设计的。依靠同步通讯的Web
服务通常是面向远程过程调用的(RPC-oriented)。用于基于XML的远程过程调用的Java API(JavaTM
API for XML-based RPC ,JAX-RPC)以及用于 Java 的带有附件的 SOAP API(SOAP
with Attachments API for JavaTM ,SAAJ)利用同步模型进行通讯。
异步模型
异步意味着调用Web 服务的客户端,不等待或者不能等待一个响应。就是说,异步是一种单向(one-way)操作。客户端以XML消息的方式发送一个请求。Web
服务接收这个请求并且对它进行处理,当处理完成的时候会发送结果。异步发送需要一个不被Sun ONE Application
Server支持的消息传输提供者。异步接收可以被采用了用于消息传输的JavaTM API
(JAXM)的应用服务器所支持。
Web 服务的标准和互操作性
Web
服务建立在一系列的标准协议和技术之上,所以,所有的Web 服务组件都知道如何进行通信。本节将会讲述以下标准:
SOAP
简单对象访问协议是一个支持分布环境下信息交换的轻量级协议。它在Web 服务的通信机制中扮演了重要的角色。它为利用包括SMTP、HTTP和FTP在内的标准internet技术传输XML文件提供了标准打包结构。
想要了解关于SOAP1.1规范的更多信息,请访问http://www.w3.org/TR/soap。
WSDL
Web 服务描述语言(WSDL)是一种用来描述Web 服务的基于XML的规范模式(schema)。WSDL把Web
服务定义为消息上的一组端点或端口操作。端口通过将一个网络地址与一个可重用的网络地址关联来定义,并且端口的一个集合就定义了一个服务。消息可以是消息类型的(message-style)也可以是RPC类型的(RPC-style)。WSDL是可以扩展的,它允许对端点以及与其相关联的消息进行描述,不论消息是什么格式或者采用何种网络协议进行通信。
想要了解关于WSDL规范的更多信息,请访问
http://www.w3.org/TR/wsdl
UDDI
通用描述、发现和集成(UDDI)标准为企业描述它们本身以及它们所提供的服务提供了一种机制,并且允许它们在UDDI注册中心注册自己。使用SOAP消息,其他企业能够查找、查询、或者发现已经注册的企业。发现了其它适于合作的企业之后,该企业就能够把自己的服务与合作伙伴进行整合,并且为它们的客户提供服务。
想要了解关于UDDI 2.0规范的更多信息,请访问
http://www.uddi.org
ebXML
电子商务可扩展标记语言(ebXML)定义了核心组件、业务过程、注册中心和存储库、消息服务、贸易伙伴协议、和安全性。通过扩展早先的全部三个为e-business伙伴之间能够以文件交换的方式获得互操作性而定义的标准,ebXML定义了自己的标准。ebXML的消息服务以带有附件的SOAP
1.1 作为它的基本消息协议,并且对其进行扩展,从而获得可靠性和其他服务质量。
ebXML协作伙伴规范和协作协议协定(CPP 和CPA)以全局的方式为e-business场景描述了合作伙伴交互。
一个ebXML注册中心和存储库使得能够存储并且在合作伙伴之间共享信息,从而允许e-business合作。Sun
ONE Application Server支持客户端通过第三方提供者访问ebXML注册中心。
想要了解关于ebXML的更多信息,请访问
http://www.ebxml.org
一个简单的Web 服务场景
下图展示了一个简单的Web
服务在Sun ONE Application Server中的工作方式。
Sun ONE Application Server环境中的Web 服务
一个典型的Web 服务工作方式可以由下面几个步骤来解释:
- 一旦Web 服务应用程序做好了接收请求的准备,Web 服务就被注册在注册中心里面,比如一个UDDI注册中心或是一个ebXML注册中心及存储库。使用WSDL对Web
服务进行描述。
- 另外一个服务或是用户定位到这个已注册的服务,并且通过查询注册中心来请求它。
- 发送请求的服务或者是用户编写一个应用程序,从而通过SOAP来绑定已注册的服务。
- 客户端发现在注册中心已注册的服务。
- 客户端发出的对Web 服务的请求以XML文件的形式到达。
- Web 服务接收请求并且对它进行处理。
- Web 服务调用一个或是多个企业JavaBean(EJBs)组件执行业务数据处理。
- EJB组件通过调用外部系统执行它们的处理过程。
- EJB组件返回数据给服务。
- 然后,Web 服务将这些返回值编组(marshals)到一个XML文件中。
- Web 服务通过响应把XML文件返回给客户端。
Sun ONE Application Server对Web
services的支持
Sun
ONE Application Server对Web服务的支持主要是通过对不同JAX* API的实现达到的。Sun
ONE Application Server提供了运行环境、开发部署工具、主机RPC、以及面向文档的Web 服务。Sun
ONE Application Server提供了用来发布Web服务到一个UDDI注册中心以及发现已注册的服务的工具。除此之外,Sun
ONE应用服务器还允许使用Sun ONE MQ 3.0.1 (消息队列)集成可靠的消息传输到Web服务中。
想要了解关于Java APIs的更多信息,请访问"用于XML和Web 服务的Java API"。
Sun ONE应用服务器包含了以下特性:
- Sun ONE应用服务器包含了命令行工具,可以执行以下任务:
- 生成客户端的stub和服务器端的tie类,它们能够在运行时与应用服务器交互。你可以使用Sun ONE应用服务器提供的wscompile
和 wsdeploy工具来生成stub和tie类。如果想了解关于使用这些工具的更多信息,请查看"JAX-RPC工具"。
- 把Java interface转换为WSDL,反之亦可。
- 用来开发和部署Web服务到Sun ONE应用服务器的Ant 任务。
- 提供了Sun ONE Studio 4这样一个图形化的用户界面,它可以帮助开发和部署Web服务以及客户端。
关于使用Sun ONE Studio建立Web服务和客户端的例子,请参见Sun ONE Studio 创建Web服务文档。Sun
ONE Studio文档可以从以下网址得到:
http://docs.sun.com/source/816-7862/index.html
Sun ONE应用服务器不支持的特性
Sun ONE应用服务器不支持以下特性:
不包括任何注册服务器,但是针对Sun ONE 注册服务器进行了认证,也针对其他UDDI注册中心进行了测试。
不支持任何Web服务安全协议,作为替代的是它依赖web container的安全性。
不包含任何可以保证在客户端与服务器之间进行可靠的消息传输的消息传输提供者。
用于XML和Web 服务的Java
API
Sun
ONE服务器对Web服务开发的支持主要建立在对用于XML和Web 服务的Java API的实现上。这些API提供了从Java平台访问或者传递Web服务所需的特定的XML和/或SOAP功能。本节讲述包含在Sun
ONE应用服务器中的每一种API。
http://java.sun.com/webservices/docs/1.0/tutorial/index.html
下面的表格中列出了Sun ONE Application Server支持的Java API。第一列列出的是Java
API,第二列列出的是Java API的版本号。
Sun ONE Application Server支持的针对XML and Web服务的Java
API
JAXP
用于XML处理的Java API (JAXP)支持利用用于XML的简单API (SAX)和文档对象模型(DOM),结合可插入到XML
样式标语言转换(XSLT) 引擎的接口,对XML文件进行处理。JAXP使应用程序能够独立于特定的XML处理实现,解析和转换XML文件。根据应用的需要,开发人员享有在XML处理器之间进行切换的自由,比如在高性能和节约内存的解析器之间进行选择,而且不会造成应用程序代码的任何改变。因此,应用程序和工具开发人员能够使快速并且容易地使他们的Java应用程序具备XML能力,从而满足电子商务、应用集成、以及动态web发布等要求。Sun
ONE Application Server中的JAXP 1.2 实现包含了对XML schema和一个XML编译器(XSLTC)的支持。
Sun ONE应用服务器中其它的用于XML 和 Web 服务的Java API也要用到JAXP 1.2。JDK
1.4包含了对JAXP 1.1的实现。Sun ONE应用服务器包含了JAXP 1.2的实现。为了覆盖JDK 1.4中的JAXP
1.1实现类,请参见"覆盖JAXP实现"。
想要了解的关于JAXP的更多信息,请访问以下网址:http://java.sun.com/xml/tutorial_intro.html
http://java.sun.com/xml/xml_jaxp.html。
JAX-RPC
用于基于XML的远程过程调用的Java API (JAX-RPC)允许开发人员建立基于SOAP的、可互操作的、轻便的Web
服务。JAX-RPC提供了一种容易的方式来为基于SOAP的同步Web 服务开发建立编程模型。开发人员使用RPC编程模型来开发客户端和终端。在典型的情况下,底层运行机制的复杂性对开发人员是隐藏的,比如SOAP协议级机制、编组(marshalling)和反编组(unmarshalling)。
JAX-RPC运行时系统或运行库为Web 服务编程抽象了这些运行时机制。一个JAX-RPC客户端能够使用基于stub的动态代理,或是动态调用接口(dynamic
invocation interface ,DII)编程模型去调用一个不同种类的Web 服务应用。JAX-RPC为基于文件的消息传输提供了支持。使用JAX-RPC,任何MIME编码的内容都能够作为持有附件的SOAP
消息的一部分被携带。这支持了在Web服务之间交换XML文件、图像、以及其他的MIME类型。JAX-RPC支持HTTP级的会话管理和基于安全机制的SSL。这些可以在开发安全的Web服务的过程中实现。
Sun ONE应用服务器为开发和部署JAX-RPC Web服务和客户端提供了支持,而且提供了JAX-RPC API的实现。应用服务器为从Java
到 WSDL,和从WSDL到Java的映射提供了工具支持,这种映射是客户端及服务开发的一部分。
想要了解JAX-RPC的详细信息,请访问下面的网址:
http://java.sun.com/xml/jaxrpc/index.html
JAXR
支持XML注册的Java API,为了可以用统一的方式访问各种XML注册中心,提供了标准的API。XML注册中心是一个用来创建、部署和发现web服务的支撑(enabling)基础结构。
目前存在着各种各样的XML注册中心规范,其中包含了非常优秀的,由OASIS和U.N./CEFACT开发的ebXML注册中心及存储库标准,以及由供应商联盟开发的UDDI规范。
JAXR使Java软件程序员能够仅使用一种简单易用的抽象API访问各种各样的XML注册中心。统一的JAXR信息模型促进了JAXR的简单和易用,该模型描述了XML注册中心的内容和元数据。
JAXR为分类和联合提供了丰富的元数据功能和查询功能。就像基于抽象的API,JAXR使开发人员能够编写可以移植到不同目标注册中心的注册中心客户端程序。
Sun ONE应用服务器提供了JAXR 1.0版本的实现。该版本的JAXR规范包含了JAXR信息模型与ebXML注册中心及UDDI注册中心v2.0规范之间的绑定。
想要了解JAXR的详细信息,请访问下面的网址:
http://java.sun.com/xml/jaxr/index.html
SAAJ
用于 Java 的带有附件的 SOAP API(SAAJ)使开发人员能够生产和消费符合SOAP 1.1规范及带有附件的
SOAP规范的消息。这些API从最初定义于JAXM 1.0规范的java.xml.soap 程序包发展而来。
Sun ONE应用服务器支持SAAJ API 1.1。想要了解JAXR的详细信息,请访问下面的网址:
http://java.sun.com/xml/downloads/saaj.html
JAXM
用于XML消息传递的Java API(JAXM)利用消息传输提供者,定义了用于XML消息传递的API。JAXM
API使应用程序可以发送和接收面向文件的XML消息。JAXM实现了带有附件的SOAP1.1,从而使开发人员能够专注于创建、发送、接收、和检索消息,避免了编写低层通信常规程序。
Sun ONE应用服务器实现了JAXM 1.1 API,使得通过消息传输提供者可以发送和接收异步消息。
想要了解JAXM的详细信息,请访问下面的网址:
http://java.sun.com/xml/jaxm/index.html
使用Java API实现Web服务
下图显示了Java
API在Web服务实现中扮演的角色。
使用Java API实现Web服务
SOAP消息传输是针对Web服务的协议。JAXP API允许你访问并解析XML数据。JAXP的主要目标是提供一个接口,允许你不必参考底层实现,就能创建、操纵、和使用XML解析器,允许你创建解析器无关的代码,并且把解析器的选择推迟到运行时。
JAX-RPC帮助你创建基于XML的请求,比如SOAP请求,它被用来发送和接收基于XML的协议的方法调用。JAX-RPC
API提供了高层的框架来把Java功能暴露为Web服务,这些服务能够被SOAP客户端消费,或者作为消费SOAP服务和客户端的方式。在典型的JAX-RPC使用案例中,开发人员没必要进行XML和SOAP编程,这样就能够快速开发应用。这不仅完成了XML和Java的互相映射,而且避免了直接与调用的XML表示进行交互。
JAXM提供了使这样的XML数据能够在两个应用之间互操作的框架。就是说,JAXM允许在两个独立的Web服务之间完成全部XML文件的传输。SOAP提供了在两个应用之间传输的消息的底层格式。JAXM作为轻量级的API,抽象了底层的消息基础结构。因此,开发
利用SOAP包装的JAXM消息是容易的,SOAP使你能够快速而且容易地访问SOAP消息。
SAAJ API使你能够操纵简单SOAP消息。它可以与JAX-RPC结合使用,JAX-RPC是用来接收和发送SOAP消息的J2EE标准API,用来表示字面上的XML文件片断。SAAJ是JAX-RPC的主要部分,但你也可以把它和其他API,比如JAXM,一起使用。
JAXM和JAX-RPC之间的区别在于,JAXM支持面向消息的中间件类型的应用开发,它允许你专注于消息的发送和接收。但是,JAX-RPC支持应用的RPC行为。如同SOAP
中定义的一样,JAX-RPC为XML RPC调用提供了Java接口。
咖啡厅的例子
咖啡厅例子示范了如何使用每个用于XML 和Web服务的Java API。
使用Java API的咖啡厅Web服务
下面的步骤描述了咖啡厅Web服务的工作方式。
- 咖啡厅服务器通过在“开始”,“运行”处查询批发商,从而获得它所销售的各种咖啡的类型及其对应的价格信息。
- 咖啡厅服务器使用JAXM消息与一个批发商建立联系。它已经和这个批发商作过几次交易,而且以前就已经为执行请求-响应JAXM消息传输制定了必要的协定。双方已经同意交换四种类型的XML消息,并且创建了这些消息必须遵守的DTD。
- 咖啡厅服务器使用JAXR发送查询,查找那些支持JAX-RPC到注册中心服务器的批发商。
- 咖啡厅服务器从每个咖啡批发商处请求价格清单。服务器执行适当的远程过程调用,并且等待代表价格清单的JavaBean组件的响应。JAXM批发商以XML文件的形式返回价格清单。
- 一旦得到相应,咖啡厅服务器处理由对批发商的调用返回的JavaBean组件里的价格清单。
- 咖啡厅服务器创建一个本地批发商数据库。
- 下订单的时候,使用批发商的首选协议,子条目被发给一个或是多个批发商。
咖啡厅服务器的例子代码安装在install_dir/samples/webservices/cb目录下。想要得到更多关于如何使用该示例的信息,请察看示例应用程序文档。
为开发Web服务和客户端作准备
本节讲述了开发Web服务及客户端的前提。本节介绍了以下主题:
使用Ant任务
你可以通过Ant使用自动化的装配特性,Ant是一个可以从Apache软件基金会获得的基于Java的编译工具:
http://jakarta.apache.org/ant/
Ant是一个基于Java的,利用Java类进行了扩展的编译工具。不同于使用外壳命令,配置文件是基于XML的,它调用一个任务执行与其上的目标树。每个任务由一个实现了特定任务接口的对象来执行。为了在你的客户端环境中使用ant任务,请执行以下任务:
在PATH环境变量中包含install_dir/appserver7/bin。随Sun ONE应用服务器一同提供的ant脚本,asant,被存放在该目录下。关于如何使用asant的详细信息,请察看下面位置的示例应用程序文档。
install_dir/appserver7/samples/docs/ant.html
想要了解在Sun ONE应用服务器环境下使用Ant任务的更多信息,请参见Sun ONE应用服务器开发人员指南。
创建build.xml文件
Ant命令被一个编译文件控制,通常该文件叫做build.xml,它定义了需要的处理步骤。
build.xml文件提供了支持可选开发行为的几个目标。这个编译文件包括了编译应用、部署应用到应用服务器、重新部署修改后的应用到应用服务器,以及删除应用的原有拷贝重新生成内容的目标。
关于创建ant编译文件的详细信息,请参见Apache Ant手册,它位于:
http://jakarta.apache.org/ant/manual/index.html
配置客户端环境
客户端用到了多个捆绑在Sun ONE应用服务器中的jar文件。本节讲述如何配置你的客户端环境。
如果在一个安装了Sun ONE应用服务器的系统中开发客户端应用程序,需要包括必要的jar文件来帮助客户端开发。
如果客户端环境不同于安装了Sun ONE应用服务器的系统,必须执行以下步骤:
如果使用1.3版本的Java 2 SDK,执行以下步骤:
1.拷贝以下的jar文件到你的客户端开发环境中。
- mail.jar – Java邮件API. 安装在install_dir/share/lib
- activation.jar – JavaBeans激活框架. 安装在install_dir/share/lib.
- fscontext.jar – 含有文件系统服务提供者。安装在install_dir/share/lib.
- jaxm-api.jar – 用于XML消息传递的Java API。安装在install_dir/share/lib.
- jaxrpc-api.jar -用于基于XML的远程过程调用的Java API。安装在install_dir/share/lib.
- jaxrpc-impl.jar - 用于基于XML的远程过程调用实现的Java API。安装在 install_dir/share/lib.
- jaxr-api.jar – 用于XML注册中心的Java API。安装在install_dir/share/lib.
- jaxr-impl.jar -用于XML注册中心实现的Java API。安装在install_dir/share/lib.
- saaj.-api.jar – SOAP运行时API。安装在install_dir/share/lib.
- saaj-impl.jar – SOAP实现。安装在install_dir/share/lib.
- commons-logging.jar –含有一个日志库程序包。安装在install_dir/share/lib.
- jaxp-api.jar – JAXP的javax.xml.parsers和javax.xml.transform组件。这些程序包包含的API为应用程序提供了获取XML处理实现实例的一致方法。
- sax.jar – 用于处理XML的简单API(SAX)的API以及帮助类,用于串行访问XML数据。
- dom.jar –用于文件对象模型(DOM)的API以及帮助类,用来从XML数据创建驻留内存的树状结构。
- xercesImpl.jar – SAX和DOM解析器的实现类,也是JAXP API的xerces特殊实现。
- xalan.jar - "一流的" (解释) XSLT处理器。
- xsltc.jar – XSLT编译处理器。
2.添加以下jar文件到classpath的前面。这些jar文件必须出现在classpath的前面,以免使用任何其他的解释器:
- jaxp-api.jar
- dom.jar
- sax.jar
- xercesImpl.jar
- xalan.jar
- xsltc.jar
3.把余下的jar文件也添加到classpath。
如果使用1.4版本的Java 2 SDK来开发客户端,请执行下面的步骤:
拷贝所有步骤1中的jar文件到你的客户端开发环境并且添加它们到classpath中,除了以下文件:
- jaxp-api.jar
- dom.jar
- sax.jar
- xercesImpl.jar
- xalan.jar
- xsltc.jar
J2SE 1.4是第一个捆绑了JAXP 1.1实现的JDK版本。这允许开发人员不必为他们的应用程序提供解析器和XSLT处理器,就能够编写应用程序。然而,用一个新版本覆盖这个JDK实现,你需要采用“授权标准覆盖机制(Endorsed
Standards Override Mechanism)”。
覆盖JAXP实现
为了使用JAXP 1.2实现,请拷贝以下jar文件到Java_home/jre/lib/endorsed/目录下:
- dom.jar
- sax.jar
- xercesImpl.jar
- xalan.jar
- xsltc.jar
如果/endorsed目录不存在,必须创建它。
注意:jaxp-api.jar文件不应该被拷贝,因为它包含了不能改变的高层API。
Jar文件必须存在于Java_home/jre/lib/endorsed/目录下,从而覆盖以前版本的、作为1.4
平台一部分的Xalan类库。因为这个特殊要求,所以在java/javac命令行中利用-classpath 选项指定这些类库是不可能的。
或者,你可以在开始客户端开发的时候,使用java.endorsed.dirs系统属性动态地添加这些jar文件到JVM。使用系统属性给了你为不同应用使用不同实现的自由。关于如何使用“授权标准覆盖机制”的更多信息,请访问以下网址:
http://java.sun.com/j2se/1.4/docs/guide/standards
|