1.什么是Web Service

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。

2.Web Service解决什么问题

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。

3.术语

Web Service的三要素:SOAP、WSDL、UDDI,soap用来描述传递信息的格式,WSDL 用来描述如何访问具体的接口,uddi用来管理,分发,查询Web Service。

WSDL

Web Service描述语言WSDL(Seb Service Desciption Language)就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。

SOAP

SOAP即简单对象访问协议(SimpleObject Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。

SEI

SEI(Web ServiceEndPoint Interface)是Web Service服务器端用来处理请求的接口。

UDDI

UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

4.优劣点

优点

采用XML,支持跨平台远程调用;基于http的soap协议,可以跨越防火墙;支持面向对象开发;有利于软件和数据重用,实现松耦合。

缺点

由于soap是基于xml传输,本身使用xml传输会传输一些无关内容从而影响效率,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap去完成简单的数据传输而携带的信息更多效率再受影响;

Web Service作为web跨平台访问的标准技术,很多公司都限定要求使用Web Service,但如果是简单的接口可以直接使用http传输自定义数据格式,开发更快捷。

适用场景:

1.跨越防火墙

2.应用程序集成

3.B2B集成

4.软件重用

不适用场景:

         1.单机应用程序

2.局域网上的同构应用程序

5.JAX-WS

JAX-WS(Java APIfor XML Web Services)规范是一组XML Web Services的JAVA API;即JDK内置的Web Service实现,用来开发和发布Web Service服务。

在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对应的SOAP消息。

在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(serviceendpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。

在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。

当然 JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch 直接使用SOAP消息或XML消息发送请求或者使用Provider处理SOAP或XML消息。

5.1.JAX-RPC 和 JAX-WS

Sun最开始的web services的实现是JAX-RPC 1.1 (JSR 101)。这个实现是基于Java的RPC,并不完全支持schema规范,同时没有对Binding和Parsing定义标准的实现。

JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层,使用的是the Java Architecture for XML Binding (JAXB, JSR 222),在parsing层,使用的是theStreaming API for XML (StAX, JSR 173),同时它还完全支持schema规范。

5.2.Apache-CXF和JAX-WS

ApacheCXF = Celtix + XFire,开始叫 ApacheCeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。

ApacheCXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。

官网:http://cxf.apache.org/
百度百科:https://baike.baidu.com/item/CXF/9622340?fr=aladdin

6.JAX-WS开发Web Service接口

6.1.导包

由于JAX-WS是JDK提供的对Web Service支持的API所以不用导入包,直接使用JDK1.6以上就可以开发。

6.2.发布WebService服务

6.2.1.接口

package com.rabbit.jaxws;/*** Created by vip on 2018/1/17.*/
public interface Calculator {public int computeSumOf(int ...x);}

6.2.2.实现

package com.rabbit.jaxws;import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;/*** Created by vip on 2018/1/17.*/
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class CalculatorImpl implements Calculator {public int computeSumOf(int... x) {int result = 0;for (int index = 0; index < x.length; index++) {result += x[index];}return result;}}

6.2.3.发布接口

package com.rabbit.jaxws;import javax.xml.ws.Endpoint;/*** Created by vip on 2018/1/17.*/
public class WebServiceExample {public static void main(String[] args) {Endpoint endpoint = Endpoint.publish("http://localhost:8080/calculator", new CalculatorImpl());System.out.println("WebService接口服务已经启动......");}}

6.2.4.查看发布的接口

首先要启动main方法对接口实行发布,再浏览器中输入:http://localhost:8080/calculator?wsdl。查看任何的WebService接口的WSDL说明文档只需要在地址后面加上?wsdl即可。下面就是接口的说明包括了方法和参数返回值等信息。

  <definitions targetnamespace="http://jaxws.rabbit.com/" name="CalculatorImplService"><types><xsd:schema><xsd:import namespace="http://jaxb.dev.java.net/array" schemalocation="http://localhost:8080/calculator?xsd=1" /></xsd:schema></types><message name="computeSumOf"><part name="arg0" type="ns1:intArray" /></message><message name="computeSumOfResponse"><part name="return" type="xsd:int" /></message><porttype name="CalculatorImpl"><operation name="computeSumOf"><input wsam:action="http://jaxws.rabbit.com/CalculatorImpl/computeSumOfRequest" message="tns:computeSumOf" /><output wsam:action="http://jaxws.rabbit.com/CalculatorImpl/computeSumOfResponse" message="tns:computeSumOfResponse"></output></operation></porttype><binding name="CalculatorImplPortBinding" type="tns:CalculatorImpl"><soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" /><operation name="computeSumOf"><soap:operation soapaction="" /><input /><soap:body use="literal" namespace="http://jaxws.rabbit.com/" /><output><soap:body use="literal" namespace="http://jaxws.rabbit.com/" /></output></operation></binding><service name="CalculatorImplService"><port name="CalculatorImplPort" binding="tns:CalculatorImplPortBinding"><soap:address location="http://localhost:8080/calculator" /></port></service></definitions>

6.2.5.总结

发布一个简单的Web Service服务并提供对外的wsdl文档:

1)编写服务器类,并添加@WebService注解

2)调用EndPoint.publish启动并发布服务

6.3.创建客户端

SEI是用于在消费者和服务者之间共享代码的。创建方式有两种:1)使用命令根据WSDL去生成。2)通过Java由开发人员创建。

6.3.1.wsimport

wsimport是JDK自带的工具,在JDK的bin文件夹中;主要功能是根据服务端生成的WSDL文件生成客户端代码。生成java客户端代码常使用的命令参数说明:

参数

说明

-p

指定客户端生成类的包路径;值如:cn.abc

-s

指定客户端执行类的源文件存放目录

-d

指定客户端执行类的class文件的存放目录

-keep

表示保留源文件

-b

指定jaxws/jaxb绑定文件或额外的schemas

-extension

扩展来支持SOAP1.2

6.3.2.命令生成客户端

注意:1)先启动服务,否则无法逆向生成客户端代码。2)如果电脑环境变量已经配置好了JDK和JRE直接win+R -> cmd输入wsimport的命令信息即可,如果没有配置好请进入控制台界面后进入到安装好的JDK环境的bin目录下。

生成的客户端代码:

注意:生成的客户端代码已经编写好了调用服务端的代码,就好比帮我们写好了接口一样,我们只要调用即可。不清楚的可以简单看下生成的几个文件。不同的代码生成的文件会不一样,但是用法是一样的。

6.3.3.利用客户端调用服务

package com.rabbit.jaxws.service;import java.util.List;/*** Created by vip on 2018/1/17.*/
public class ClientMain {public static void main(String[] args) {CalculatorImplService cis = new CalculatorImplService();CalculatorImpl cip = cis.getCalculatorImplPort();//里面有可以调用的方法/** 封装请求参数 */IntArray array = new IntArray();List<Integer> item = array.getItem();for (int index = 1; index < 10; index++) {item.add(index * index);}int result = cip.computeSumOf(array);System.out.println(result);}}

6.3.4.总结

调用Web Service应用:

1)使用JDK自带的wsimport工具根据别人提供的WSDL生成客户端代码。

2)根据生成的Java类调用服务提供的方法。

6.4.开发效率

这种方式开发接口是非常方便的,而且开发人员也不需要花费额外的时间去调试接口等。特别是对于开发文档是有误的情况下,花费大量的时间就非常的不划算。对于别人提供的接口方法只需要看文档参考名字就可以知道作用。

7.注解

7.1.@WebService

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface WebService {String name() default "";String targetNamespace() default "";String serviceName() default "";String portName() default "";String wsdlLocation() default "";String endpointInterface() default "";
}

属性名称

说明

name

此属性的值包含XML Web Service的名称。在默认情况下,该值是实现XML Web Service的类的名称,wsdl:portType 的名称。缺省值为 Java 类或接口的非限定名称。

targetNamespace

指定命名空间,默认是使用接口实现类的包名的反缀。

serviceName

对外发布的服务名,指定 Web Service 的服务名称:wsdl:service。缺省值为 Java 类的简单名称 + Service。

portName

缺省值为 WebService.name + Port。

wsdlLocation

指定用于定义 Web Service 的 WSDL 文档的 Web 地址。Web 地址可以是相对路径或绝对路径。

endpointInterface

服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口。

7.2.@WebMethod

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface WebMethod {String operationName() default "";String action() default "";boolean exclude() default false;
}

属性名称

说明

operationName

指定与此方法相匹配的wsdl:operation 的名称。缺省值为 Java 方法的名称。

action

定义此操作的行为。对于 SOAP 绑定,此值将确定 SOAPAction 头的值。缺省值为 Java 方法的名称。

exclude

指定是否从 Web Service 中排除某一方法。缺省值为 false。

7.3.@WebResult

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface WebResult {String name() default "";String partName() default "";String targetNamespace() default "";boolean header() default false;
}

属性名称

说明

name

当返回值列示在 WSDL 文件中并且在连接上的消息中找到该返回值时,指定该返回值的名称。对于 RPC 绑定,这是用于表示返回值的 wsdl:part属性的名称。对于文档绑定,-name参数是用于表示返回值的 XML 元素的局部名。对于 RPC 和 DOCUMENT/WRAPPED 绑定,缺省值为 return。对于 DOCUMENT/BARE 绑定,缺省值为方法名 + Response。

partName

指定返回值的 XML 名称空间。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为 BARE 时才使用此参数。

targetNamespace

指定头中是否附带结果。缺省值为false。

header

指定 RPC 或 DOCUMENT/BARE 操作的结果的部件名称。缺省值为@WebResult.name。

7.4.@WebParam

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface WebParam {String name() default "";String partName() default "";String targetNamespace() default "";WebParam.Mode mode() default WebParam.Mode.IN;boolean header() default false;public static enum Mode {IN,OUT,INOUT;private Mode() {}}
}

属性名称

说明

name

指定方法的参数名称在WSDL中显示

partName

指定参数是在消息头还是消息体中。缺省值为 false。

targetNamespace

指定参数的 XML 元素的 XML 名称空间。当属性映射至 XML 元素时,仅应用于文档绑定。缺省值为 Web Service 的 targetNamespace。

header

指定参数是在消息头还是消息体中。缺省值为 false。

mode

此值表示此方法的参数流的方向。有效值为 IN、INOUT 和 OUT。

Web Service应用之JAX-WS开发相关推荐

  1. 利用IDEA部署过的Tomcat开发Web Service

    (1)使用idea开发一个Web Service: (2)开发一个客户端来调用该Web Service并展现出相应j结果: (3)编程调用网络上提供的天气预报Web Service并显示结果. (1) ...

  2. 使用JAX-RS创建RESTful Web Service

    guice resteasy http://www.cnblogs.com/ydxblog/p/7891224.html http://blog.csdn.net/withiter/article/d ...

  3. 使用XFire+Spring构建Web Service(一)——helloWorld篇

    来源:http://www.blogjava.net/amigoxie/archive/2007/09/26/148207.html XFire 是与Axis 2并列的新一代Web Service框架 ...

  4. 【SAP】ABAP——Web Service简介与配置方法

      本文转载  https://www.cnblogs.com/zohoo/p/7295920.html. 一. SAP Web Service简介 二. SAP Web Service配置准备工作 ...

  5. SAP Web Service简介与配置方法

    [版权声明]本文为博主原创文章,转载请在明显位置注明出处. 一. SAP Web Service简介 二. SAP Web Service配置准备工作 1. 通过RZ10配置服务器名称和其他参数 2. ...

  6. Web Service 附件技术的发展及演变

    Web Service 通常将业务数据封装在 SOAP 主体或者 SOAP 消息附件中进行传输,这些附件往往采用 Base64 编码二进制方式进行封装,这将大大增加待传输的数据量,消耗比较长的编码时间 ...

  7. Web Service 开发系列文章之三(一个较小的契约优先的Web Service例子,用JavaApplication发布)...

    Web Service 学习第三期 1.编写纯WSDL的web服务 1.1.新建目录及WSDL文件 1.2.编写WSDL 1.2.1.编写type <wsdl:types> <xsd ...

  8. 基于Tomcat5.0和Axis2开发Web Service代码详解

    本文将详细介绍HelloWorld中使用的server和client端代码.阅读之前,你应该首先了解SOAP1.1协议.<?xml:namespace prefix = o ns = " ...

  9. 基于Tomcat5.0和Axis2开发Web Service应用实例

    本文将介绍如何使用Tomcat5.0和Apache Axis2开发.部署及测试一个简单的Web Service应用.<?xml:namespace prefix = o ns = "u ...

最新文章

  1. cpu渲染测试软件,CineBench渲染能力测试_CPUCPU评测-中关村在线
  2. 系统需要联网吗_气体灭火系统储气瓶上的保险销需要拔掉吗?
  3. hdfs web_ui深入讲解、服务启动日志分析、NN SNN关系
  4. Spring在web中的使用
  5. 【HTML】 HTML基础知识 表单
  6. Android之ndk之用arm-linux-androideabi工具通过地址找到具体哪里崩溃
  7. java如何实现缩略图,Java实现缩略图的步骤
  8. linux两个数字正则,正则表达式-Linux readelf显示具有不同数字系...
  9. ubuntu16.04安装搜狗拼音2.0.0.0072
  10. 【问题汇总】Ubuntu使用常见问题
  11. 《算法导论》第十四章----数据结构的扩张(动态顺序统计)
  12. 【Spark】Spark安装详解
  13. 苹果主题商店_看厌了官方皮肤,快试试微信QQ半透明主题!不仅会动还有声音!...
  14. MySQL 集群Cluster
  15. 利用分析仪测量二极管的伏安特性
  16. oracle 根据出生日期计算年龄
  17. 北京驾驶证到期了怎么换证?
  18. Polygon与以太坊通信机制研究
  19. volatile关键字
  20. 计算机面试工作计划,信息技术部面试自我介绍

热门文章

  1. 单片机原理及应用流水灯实验
  2. 想知道哪个音频翻译成文字的软件好用?这篇文章能够给你答案
  3. matlab一阶振型图,[工学]多自由度系统的振动响应.ppt
  4. Git中submodule的使用
  5. java mysql 分布式事务_java事务(三)——自己实现分布式事务
  6. modbus c语言校验算法,Modbus CRC校验算法
  7. java构造函数调用构造函数
  8. 超详细Linux -- nginx负载均衡配置
  9. windows下使用winpcap-1.环境安装
  10. C#中mvc模式在线预览Office(word 可编辑、txt)文件