-1-第5章WebService开发第5章WebService开发WebService的开发方法和传统的OOAD有很大的不同,这主要是因为WebService考虑问题的粒度是服务级,而面向对象方法通常是对象级的。本章介绍了主流的WebService开发和运行支持环境,并且介绍了WebService的几种开发方法。最后介绍了AXIS环境下WebService的开发实践。本章导读本章目标:完成本章内容之后我们将能够:具有WebService开发的概念性认识认识主流的WebService开发工具和-2-2G——internet应用解决方案5.1J2EEWebService构架J2EE1.4起提供了WebService总框架,在这个总的框架下,包含了以下的技术和框架:WebServiceforJ2EEJAX-RPCSAAJJAXREJB2.1ConnectorArchitecture下面分别介绍这些技术或框架。5.1.1WebServiceforJ2EEWebServiceforJ2EE是J2EE平台下WebService总的构架规范,它义了在J2EEJ2EE应用程序服务器中如何支持WebService。具体地说,WebServiceforJ2EE定义了客户端模型、服务端模型、部署模型WSDL绑定和安全相关规范,从而使WebService客户机和实现可以从一个J2EE供应商实现移植到另一个J2EE供应商实现。WebServiceforJ2EE基于JAX-RPC(JSR101)进行构建,以提供客户机编程模型。该客户机模型允许WebService客户机(Java的或非Java的,在J2EE之中或在J2EE之外)访问部署在支持JSR109的J2EE应用程序服务器中的WebService。它还允许J2EE组件通过使用J2EE编程模型调用WebService(Java的或非Java的,在J2EE之中或在J2EE之外)。在此框架下,服务端可以有两种选择:基于Servlet的服务端点:通过JAX-RPC实现,由Servlet容器提供运行环境;基于无状态会话Bean的服务端点:必须遵循EJB2.1规范,由EJB容器提供运行环境。-3-第5章WebService开发5.1.2JAX-RPCJAX-RPC是J2EE1.4平台中WebService的核心技术,其特点是:JAX-RPC是一种远程调用,类似于RMI;规定了JAX-RPC的运行环境;定义了XML数据类型到Java类型的映射方法;定义了WSDL到Java之间的映射;定义了JAX-RPC客户端编程模型(Stub接口、动态代理、动态调用);定义了基于Servlet的服务端点模型;定义了SOAP消息Handler框架;提供了复杂Java数据库类型映射的扩展框架。JAX-RPC的客户端可以是基于J2SE、J2EE或者J2ME的运行环境,服务端是Servlet或者EJB容器。WSDL不仅描述了WebService,同时在JAX-RPC客户端调用服务端的端点时起了重要的作用。JAX-RPC的互操作性如图所示。服务端和客户端通过SOAP来进行通信,SOAP以HTTP作为底层的传输协议。5.1.3SAAJSAAJ从JAXM1.0划分出来,原JAXM1.0被划分为JAXM1.1和SAAJ1.1。SAAJ包含了创建和读取遵循SOAP1.1规范的以及带附件的SOAP消息的API,也包含了发送和接收请求/响应模型的SOAP消息。SAAJ不仅可以被JAX-RPC使用,也可以被JAXM等WebService技术使用。它是一组通用的、处理SOAP消息的API。5.1.4JAXRJAXR是和服务注册、发布相关的标准API。由于当前WebService注册提供者比较多,要想在J2EE平台中使用这些注册服务,为每个注册服务都开发一个单独的API,显然是不现实的,JAXR为注册服务进行了多层抽象,使得在J2EE平台中操作当今的-4-2G——internet应用解决方案或者将来的WebService注册中心成为可能。JAXR支持三种注册服务类型:JAXRPluggableProvider、Registry-specificJAXRProvider、JAXRBridgeProvider(支持UDDIRegistry和ebXMLRegistry/Repository等)。JAXR规范为JAXR的实现定义了有两种级别的支持,分别是:Level0:用于支持UDDI注册;Level1:用于支持ebXML注册。图5.1JAXR的互操作性示意图通过JAXRAPI,注册浏览器、J2EE组件和桌面应用可以访问UDDI、ebXML等注册服务中心。需要注意的是,JAXR并不是一个新的注册规范,它只是访问原有的注册中心的一个编程接口。5.1.5EJB2.1EJB2.1规范对WebService提供了支持,定义了无状态会话Bean可以作为WebService端点模型。这样,在J2EE平台中,有两种WebService端点:基于Servlet的和基于无状态会话Bean的。用EJB作为WebService端点,同样可以像Servlet作为服务端点一样使用消息Handler。在EJB2.1规范下,消息驱动Bean不是必须实现javax.jms.MessageListener接口。这样,除了开发JMS的消息驱动Bean外,还可以开发出自定义的消息驱动Bean,如com.mycompany.EmailListener。结合连接器的支持,可以开发出-5-第5章WebService开发javax.xml.messaging.OnewayListener之类的消息驱动Bean来提供WebService支持。ConnectorArchitecture1.5在旧有的连接器结构中,只支持从J2EE组件内部到企业资源层(EIS)单向的调用,而资源层无法直接调用J2EE组件。在新的连接器规范中,可以从企业资源层中直接调用J2EE组件。这样,我们可以通过连接器来把EJB等组件向外暴露为WebService端点,从而支持WebService。5.1.6JAXMJAXM不是J2EE平台中的一部分,它只是一个可选的开发包。通过JAXM发送和接收基于SOAP的消息,它定义了两种发送和接收消息的模型:请求-响应(request-resposne),它是一种点对点的消息发送模型,消息发送端发送了消息后将阻塞等待服务端的相应,这种方式的好处是编程简单,缺点是无法取保消息到达服务端。单向(one-way),这种方式需要使用JAXM消息提供者,一端发送的消息通过消息提供者再转发到接收端;当接收端对消息响应时,同样首先通过JAXM消息提供者,再由消息提供者发送到原来的发送端。这种方式是消息通信是异步的,优点是可以保证消息被可靠发送到服务端,缺点是编程变得复杂。在J2EE1.4平台中,EJB2.1消息驱动Bean可以接收JMS消息或者JAXMSOAP消息。在以下的情况下,可以优先考虑使用JAXM,而不是JAX-RPC:要发送面向文档的数据;要发送大量的、粗粒度的、复杂的流数据;需要使用异步数据交换模型;需要确保每个发送的数据都在对方接收。5.1.7WebService的JAVAAPI下面介绍在JAVA环境下开发WebService要使用的API,这里只列出了J2EE标准-6-2G——internet应用解决方案的开发包和可选的开发包。J2EEWebService框架中核心API:J2EE1.4(JSR151)JAX-RPC(JSR101)JAXRSAAJEJB2.1和处理SOAP消息相关的API:JAXM:发送接收异步的SOAP消息;SAAJ:处理带附件的SOAP消息;JAX-RPC:是J2EEWebService关键API,它定义了SOAP消息HandlerAPI,;JMS:JAVA消息服务API也可以发送SOAP消息。和WSDL相关的API:JavaAPIforWSDL:见JSR110;JAX-RPC:定义了java和WSDL之间的映射。和UDDI相关的API:JAXR:WebService注册的高层API。和ebXML相关的API:ebXML消息服务:提供ebXML消息支持的JAXM(JSR67);ebXML注册:JAXRCPP/CPA:JavaAPIforebXMLCPP/CPA(JSR157)和XML文档管理相关的API:JAXP(JavaAPIforXMLprocessing,JSR05),用于解析XML文档,可以在这个API下使用可插入的解析器,如DOM;JAXB(JavaAPIforXMLdata-binding,JSR31),XML文档处理的高层API,用于XML文档模型和Java对象之间的绑定;StreamingAPIforXML(JSR173),基于迭代器(Iterator)的Pull-parsingAPI。-7-第5章WebService开发和XML安全相关的API:XMLDigitalSignature(JSR105)XMLEncryption(JSR106)XMLTrustService(JSR104)SecureAssertionMarkupLanguage,(SAML,JSR155)WS-Security(JSR183)其它和WebService相关的API:XMLTransactioningAPIforJava(JSR156),JavaAPIforOASISBTP;JavaProcessComponentAPI(JSR159);WebServiceforJ2ME(JSR172),为J2ME设备提供发送、接收SOAP消息的支持;WebServiceMetadataforJ2EE(JSR181),基于WebService的Metadata。除了上面列举的API外,还有其它一些组织公司开发的API,比如Apache、IBM、BEA、Oracle等组织和公司,都为WebService开发提供了许多API,在这里就不再列举了。5.2WebService开发和支持环境5.2.1SUN公司Sun提供了JavaWebServicesDeveloperPack(JavaWSDP),它JWSDP最新的版本是JWSDP1.2,包含了:JAXP、JAXB、JAXP、SAAJ、JAX-RPC、JAXR运行库、开发实例,它上支持最新的WebService标准;JavaWSDPRegistryServer(UDDIserver),一个用于发布和查询WebService的工具。JWSDP1.2既是开发工具,也是WebService运行环境。另外,J2EE1.4开始对WebService进行全面支持,在J2EE1.4平台下,允许J2EE应用组件暴露为基于SOAP/HTTP的WebService;和原有的WebService进行整合;J2EE1.4平台升级的新增加的技术大部分和WebService相关。在J2EE1.4平台下,开发、-8-2G——internet应用解决方案部署、发现WebService变得非常方便。尽管J2EE1.4平台对WebService方便提供了升级,但是:WebService仅仅是J2EE平台中一种使用服务的通道,所以不需要改变J2EE的构架,并且原有的J2EE组件可以非常容易地暴露为WebService;J2EE平台的优点仍然对WebService适用:可扩展性、可靠性、开放性。5.2.2IBM公司提供的工具IBM公司提供了大量的WebService开发工具和运行环境。最常使用的有WSDK,它带有一个轻量级的Websphere服务器,通过它可以方便地创建和Websphere服务器兼容的WebService。WSDK可以与EclipseIDE一起使用。Eclipse提供了图形化交互开发环境,在这种环境中,可以用工具来构建和测试Java应用程序。WSDK加到标准的