在JAVA EE应用程序中实现Web Service服务(一)基础理论
前言
本系列主要讲解面向服务的架构(SOA)和Web服务的必要性。同时介绍基于XML和RESTful这两种类型的Web服务。同时涵盖了如何创建和具体的使用。
技术使用背景
随着通过Web进行商业交易的急剧增长和被越来越多的人接受,越来越多的企业正在实现Web服务解决方案。Web服务是根据现有的行业标准(例如WSDL、SOAP和HTTP)构建的,它们使得完全不同的是应用程序能够集成在一起作为一个大型软件系统的组成部分来协同工作。
情景模拟
例如,我们现在想要开发一个大型线上图书交易平台,想具备以下功能:
- 在线提供各出版社的图书
- 支持图书的在线订购和付款
- 向客户交付图书
针对以上的功能需求,我们可以分析出,当前的图书交易平台是无法独立完整这种功能实现的。比如需求1,想要提供各出版社的图书,就需要从有合作关系的出版社那里获取到所有图书的信息(书名、作者、类型、出版日期、更新版本、出版社等),这些信息完全可以由具体的出版社来为我们提供。对于需求2,我们在确定用户购买以后,需要给出在线支付工具来收款,至于这个功能,已经由各大银行或则第三方支付平台为我们实现了,我们只需要向他们请求使用即可,没有必要自己开发一套支付系统,因为我们的核心业务是在图书交易。关于需求3,当用户完成交易后,我们需要将图书发送给客户,那一定需要快递,目前市面上的快递公司多种多样,我们需要与几家靠谱的快递公司建立合作关系,并长期依赖它们为我们送达图书到客户手上,那么客户的图书收取地址、联系电话、个人信息等配送信息,我们就需要提供给快递公司,同时快递公司也需要将客户的快递状态反馈给我们,以便于用户在我们的平台上查看自己的图书送到了哪里。
定义SOA
SOA代表Service-Oriented Architecture(面向服务的架构)。它是有利于在不同应用程序间实现松散耦合继承的软件架构。此外,此架构还提供在软件及其网络组件中进行更改的灵活性。这些更改不会英雄体统的其他现有组件的使用。换句话说,该架构具有可重用性,恰恰源于可重用性的功能,可以帮助我们的开发减少成本支出,合理的使用其他组织的系统的组件来为我们服务。
介绍Web Service(服务)
SOA的概念是通过使用Web Service来实现的。Web Service可以让我们轻松有效的构建现有Web应用程序,它允许应用程序之间跨平台通信。同时,允许一个应用程序使用其他的应用程序的功能。
举一些简单的生活例子,我们在购物网站购物时的支付系统,其实并不是网站本身自己开发,而是间接使用了银行或者第三方支付平台来帮助自己完成收款的功能需求;当我们在某个页面上看到气象预报的时候,并不是那个平台自己每天派人盯着蓝天白云,分析近期有没有雨,也不是手拿温度计,自己实时的记录当前的温度,而是有专门的气象局的专业人士进行统计和预测,那些页面只是间接使用了气象局提供的数据展示在了自己的页面上;又比如,我们每次注册账号,都需要手机验证,手机验证就需要发送短信,每个平台在用户注册发送手机验证码时,并不是自己的团队开发了一套发送短信的系统,而是间接使用了通信公司的短信发送功能,来实现自己的业务需求。
这样的例子数不胜数,其实就是我们在自己的软件系统开发过程中,有一些业务可能与我们的核心业务不太沾边,但是又不得不用,那这时,就有专门的团队事先已经为我们开发好了具体的功能模块,我们只需要按照它们的要求,借用他们的系统进行处理即可。
Web Service 的功能
Web Service是执行特定任务或一组任务的一种应用程序功能。同时,Web Service可以通过网络发布、查找或调用。具有如下功能:
-
支持数据交换: Web服务使用XML数据格式完成Web服务间的信息交换,信息交换基于XML消息的形式完成。XML是独立于供应商和平台的语言,可以用在企业内甚至跨企业提供跨平台数据集成。
通俗的来说,就是我们想要使用别人开发的软件系统,就需要访问到别人的系统,别人的系统可能也是用Java写的,但还可能是C# / .net / C / Python等其他编程语言写的,那这直接导致我们的语言无法沟通,使用XML便解决了这种问题。 - 支持文档交换: Web服务通过将文档附加在业务之间交换的XML消息上来支持大型非XML文档的交换。此类非XML文档可以是PDF文件、视频文件或者图像文件。
- 支持同步和异步客户端: Web服务支持与客户端进行同步和异步通信。同步客户端是指等待当前的服务完成后,再直接接下来的其他操作。异步客户端始值调用服务,然后继续执行接下来的其他函数,而不是等待着这个服务的完成。
Web Service 的好处
- 支持应用程序和数据集成。Web服务使用独立于供应商平台和语言的XML技术以及通信协议(如HTTP)作为传输方式。
- 多功能。可将多个Web服务的数据组合在一起,以执行特定任务或者显示不同的内容给用户。
- 代码可重用性。不用多解释,一个服务可用于多个客户端,比如一个支付功能,写一遍,所有的调用者都是执行同样的代码。不需要针对每一个调用者,创建新的代码。
- 节约成本。这个也是显而易见的,我们的开发过程中,不再需要自己去完成一些基础而与核心业务关联性低的功能,直接使用供应商提供的功能系统。
Web Service 应用编程接口(API)
Java Web Service是使用JWSDP工具包开发的。主要提供以下API:
- 用于XML Web服务的Java API(JAX-WS) :JAX-WS用于开发基于XML的Web服务。它是用于构建通过使用XML进行通信的Web服务和客户端的技术。
- 用于XML处理的Java API(JAXP):JAXP用于处理来自Java应用程序的XML数据。例如:我们的Web服务接收到了一条XML的消息,其中包含了用户的个人信息和消息报头信息。我们可以使用JAXP API来从消息中抽取出用户的个人详细信息。
- 用于XML绑定的Java架构(JAXB):JAXB允许我们将XML文档映射到Java对象,反之亦然。
- SOAP with Attachments API for Java(SAAJ): SAAJ用于将大型文件作为SOAP消息的附件通过因特网来传输。例如:我们需要向客户端发送非XML数据的大型文档,那么就需要使用SAAJ API来将文档附加到SOAP消息中。
- 用于XML注册表的Java API(JAXP):JAXP提供了标准的Java API以访问不同的Web服务注册表。它使得Web服务客户端能够通过网络来访问这些标准注册表以获取已发布的Web服务。例如:我们需要查询最新的天气预报,那么我需要通过使用JAXR API访问那个提供天气预报供应商的系统注册表来查找提供天气预报的Web服务。
Web 服务的类型
Web服务就两种类型:
- 基于XML的Web服务
- RESTful Web服务
基于XML的Web服务的组件
基于XML的Web服务是向使用者公开其功能的自我描述Web组件。要访问此类公开功能,需要通过某些开放标准描述、注册基于XML的Web服务并与之通信。此类开放标准也称为基于XML的Web服务组件,包括:
-
WSDL:基于XML的文档,用于描述基于XML的Web服务的功能
用来描述Web服务(Web Service)和说明如何与Web服务通信的XML语言。由于是 基于XML的,所以WSDL具有非常好的可阅读性。 -
UDDI:基于XML的目录服务,用于注册基于XML的Web服务
通用描述、发现及整合,用来管理、分发、查询webService;用户自己可以按UDDI 标准搭建UDDI服务器,来管理,分发,查询WebService ,其他用户可以自己注册发布 WebService; -
SOAP:基于XML的协议,用于在应用程序间交换信息。它使用HTTP协议进行数据传输,优点如下:
- 一种轻量级通信协议;
- 用于应用程序之间的通信;
- 使用HTTP协议通信;
- SOAP独立于平台、独立于编程语言、基于XML,简单并可扩展;
Java的web service规范
JAX-WS规范
- JAX-WS的全称为Java API for XML-Based Webservices。
- 早期的基于SOAP的JAVA的Web服务规范JAX-RPC(Java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代。
- 从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持 2.2版本。
- 采用标准SOAP(Simple Object Access Protocol) 协议传输,SOAP协议是基于http的 应用层协议,SOAP协议传输的是xml数据。
- 采用wsdl作为描述语言即webservice使用说明书。
- 采用wsdl作为描述语言(WSDL可以认为是web service使用说明书)。
基本介绍
JAX-WS库是为程序员提供批注(注解)集合和工具包来发开基于XML的Web服务。批注和工具包隐藏构建Web服务的复杂性,还减少jar文件的大小。JAX-WS API支持多种协议,例如 SOAP 1.1 、SOAP 1.2、 XML 和 HTTP。此外,消息传输优化机制(MTOM)支持已在JAX-WS API中启用。MTOM是一种新型附件规范,能够以压缩格式将大二进制数据作为附件随SOAP消息发送。
通过使用JAX-WS API,Web服务和客户端通过交换SOAP消息以进行通信。JAX-WS API 自己生成或者解析SOAP消息。JAX-WS的运行系统将API调用和响应转换成SOAP消息或者从SOAP消息进行转换。
下图显示了JAX-WS Web服务和客户端之间使用SOAP消息进行的通信。
JAX-WS API
JAX-WS API通过提供批注支持简化了Web服务的开发。批注是可应用于以下Java元素的一类修饰符:
- 诸如Java类或接口值类的类型
- 方法
- 表示Java类中的本地实例变量的字段
- Java方法内的参数
JAX-WS API支持批注以提供带有元素数据的Java类,从而限定其行为并指示Java类是Web服务。
JAX-WS API提供的一些批注(注解)
批注 | 描述 |
---|---|
@WebService | 此批注将类定义为Web服务接口的实现类。在此类中定义的方法对客户端公开。 |
@WebMethod | 此批注定义该方法是Web服务方法。此批注应用到类中的方法。@WebMethod批注仅受具有@WebService批注的那些类支持。 |
@OneWay | 此批注定义Web方法具有输入但没有输出。仅可对没有返回类型的方法指定它。 |
@WebParam | 此批注定义Web服务中所使用方法的参数。 |
@WebServiceRef | 此批注定义Web服务的引用。 |
JAX-WS API 在 javax.xml.ws 包中定义。下表描述了 javax.xml.ws 包中支持基于 SOAP的应用程序开发的包。
包 | 描述 |
---|---|
javax.xml.ws.handler | 它为消息处理程序定义API |
javax.xml.ws.handler.soap | 它为SOAP消息处理程序定义API |
javax.xml.ws.http | 它定义特定于HTTP绑定的API |
javax.xml.ws.soap | 它定义特定于SOAP绑定的API |
javax.xml.ws.spi | 它为JAX-WS定义服务提供程序接口 |
javax.xml.ws.wsaddressing | 它定义与WS寻址相关的API |
JAX-RS规范
JAX-RS是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务 规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一 起发行。
支持JAX-RS服务规范的框架有:
- CXF—XFire和Celtix的合并。
- Jersey—Sun公司的JAX-RS参考实现。
- RESTEasy—JBoss的JAX-RS项目。
- Restlet—也许是最早的REST框架了,它JAX-RS之前就有了。
JAX-RS API
JAX-RS API 提供基于REST样式架构创建Web服务的支持。此API与简单的Java对象一起使用,以通过使用URI模式和HTTP方法提供对齐方法的访问。