转载自http://wuhongyu.iteye.com/blog/808922

要了解WebService,光能写代码不行啊,这说说WebService最基本的概念。

首先WebService要知道几个最基本的概念:

 

1、XML以及XML Schema

XML 是Web Service表示数据的基本格式。XML是一套通用的数据表示格式,与平台无关,这就使不同语言构建的系统之间相互传递数据成为可能。

XML Schema-XSD 拥有一套标准的、可扩展的数据类型系统,Web Service即是用XSD来作为数据类型系统的。由于不同语言之间数据类型也不尽相同,因此,数据传输过程中,必须将其转化为一种通用的数据类型,即XSD的数据类型。

2、SOAP

SOAP(Simple Object Access Protocol),简单对象访问协议,它是基于XML格式的消息交换协议。SOAP定义了一个envelope对象,使用envelope来包装要传递的消息,而消息本身可以采用自身特定的词汇,使用namespace来区分彼此。简单的说,在WebService中传递的东西是一封信,SOAP就是信的通用格式,他定义了一封信应该有信封,信封里装着信的内容,信封(envlope)的格式是固定的,而信的内容(要传递的数据)你可以自己定义。

3、WSDL

WSDL(Web Service Description Language),Web Service描述语言,使用XML语言对Web Service及其函数、参数、返回值、数据类型等信息进行描述。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。

4、UDDI

UDDI(Universal Description Discovery and Integration),统一描述、发现和集成协议。UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。UDDI是一个分布式的互联网服务注册机制,他实现了一组可公开访问的接 口,通过这些接口,网络服务可以向服务信息库注册其服务信息、服务需求者可以找到分散在世界各地的网络服务。UDDI 并不像 WSDL 和 SOAP 一样深入人心,因为很多时候,使用者知道 Web 服务的位置(通常位于公司的企业内部网中)。

5、远程过程调用(RPC)与消息传递

Web service本身实际是在实现应用程序间的通信,实现通信的方式有两种:远程过程调用(RPC)和消息传递(DOCUMENT)。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。消息传递的概念是,客户端向服务器发送消息,然后等待服务器的回应。消息传递系统强调的是消息的发送和回应,而不是远程对象的界面。他们最大不同就是RPC不能通过Schema 来校验,而Document 类型是可以的。因此document 类型webservice成为主流 ,Document也是JAX-WS默认的实现方式。

有一种说法是,Web Service = SOAP + WSDL + HTTP。其中,SOAP协议是web service的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系统间的服务处理。这里的WSDL(Web Services Description Language)web 服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的 Web service服务的URL信息、方法的命名,参数,返回值等。

SOAP协议简介

上面说了,SOAP是一种基于XML的消息通讯格式,用于网络上,不同平台,不同语言的应用程序间的通讯。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: 
Envelope    标识XML 文档一条 SOAP 消息 
Header       包含头部信息的XML标签 
Body          包含所有的调用和响应的主体信息的标签 
Fault           错误信息标签。

SOAP 消息的基本结构是

soap:Envelope是SOAP中根元素元素。Envelope元素中可以包含多个可选的Header元素,必须同时包含一个Body元素。Header元素必须是Envelope元素的直接子元素,并且要位于Body元素之前。

soap:Header与HTTP请求中的Headers类似,用于传送一些基础的通用的数据,例如安全、事务等方面的信息。Header不是SOAP消息中的必需元素,但他是扩展SOAP协议的一个功能非常强大的功能。Header有两个非常重要的属性

soap:Body是SOAP消息中必需的元素,用于传送实际的业务数据或错误信息。

soap:Fault是soap:Body的子元素,用于传送错误信息,当有错误发生时才需要次标签。

可参考:http://askcuix.iteye.com/blog/211005

WSDL简介

WSDL是WebService的描述语言,也是使用xml编写,用于描述、也可定位WebService,还不属于W3C标准。WSDL主要包含以下几个元素:

definitions   WSDL的根节点,主要包括:name属性,WebService服务名,可通过@WebService注解的serviceName更改;

                   targetNamespace属性,命名空间,可通过@WebService注解的targetNamespace更改。

types          web service 使用的数据类型,他是独立与机器和语言的类型定义,这些类型被message标签所引用。

message     web service 使用的消息,他定义了WebService函数的参数。在WSDL中,输入输出参数要分开定义,使用不同的message标签体标识。message定义的输入输出参数被portType标签所引用。

portType    web service 执行的操作。引用message标签定义的内容来描述函数信息(函数名,输入输出参数等)。
binding       web service 使用的通信协议。将portType中定义的服务绑定到SOAP协议,这部分XML 指定最终发布的WebService的SOAP 消息封装格式、发布地址等。

service        这个元素的name 属性指定服务名称(这里与根元素的name 属性相同),子元素port的name 属性指定port名称,子元素address的location 属性指定Web 服务的地址。

WSDL的基本结构是:

可参考:http://www.w3school.com.cn/wsdl/index.asp

我就不浪费资源粘一大段WSDL和SOAP的实例过来了,上一篇写了个小例子,发布后在浏览器输入“服务地址”+ “?wsdl”就可以查看(如那个例子的WSDL地址是http://127.0.0.1:8080/helloService?wsdl)。SOAP可以使用一个HTTP监听工具查看(我使用的是HTTPAnalyzerFullV5),或者通过CXF的实现发布程序,使用CXF的拦截器可以看到SOAP消息内容。

将上一篇的代码更改为CXF实现:

首先下载CXF的包,我下的是apache-cxf-2.3.0.zip,将lib下的jar包引入工程路径,将发布服务的代码更改为:

这样,就可以在控制台看到SOAP的消息内容了,信息: Inbound Message是服务器端接受到的内容,信息: Outbound Message是服务器返回给客户端的内容。当然,使用CXF的实现方式时,客户端调用也可以使用CXF的特有方式:

        //1、使用标准的JAX-WS 的API 完成客户端调用
// QName qName = new QName("http://service.why.com/","HelloService");
// HelloService helloService = new HelloService(new URL("http://127.0.0.1:8080/helloService?wsdl"),qName);
// Hello hello = (Hello) helloService.getPort(Hello.class); //2、使用了CXF 的JaxWsProxyFactoryBean 来访问Web 服务
JaxWsProxyFactoryBean soapFactoryBean = new JaxWsProxyFactoryBean();
soapFactoryBean.setAddress("http://127.0.0.1:8080/helloService");
soapFactoryBean.setServiceClass(Hello.class);
Object o = soapFactoryBean.create();
Hello hello = (Hello) o;

注意,当使用不同的WebService实现时,其生成的WSDL内容可能会稍有差异,但总体上都是一样的。

Apache CXF下载地址 :http://cxf.apache.org/download.html

附件是上一篇中例子的工程,有一点点修改,我把lib里的CXF的jar包删了,太大了,不让上传,想看的同学可以到上面的地址下载CXF相应的包,解压后将lib里的东东拷到我工程的lib目录里就OK了,当然还得先在C盘建立几个测试文件c1.jpg、c2.jpg、origin.jpg和why.jpg。

JAVA6开发WebService (三)——几个概念的更多相关文章

  1. JAVA6开发WebService (四)——SAAJ调用WebService

    转载自http://wuhongyu.iteye.com/blog/810571 前面写了个JAX-WS的小例子,看到用JAVA6开发WebService确实很简单,也很方便,不过前面也说了,JAVA ...

  2. JAVA6开发WebService (二)——JAX-WS例子

    转载自http://wuhongyu.iteye.com/blog/807836 上一篇写了个最简单的小例子,只是为了说明JAVA6开发Web Service很方便,这一篇稍微深入一点,写个稍微有点代 ...

  3. JAVA6开发WebService (一)

    转载自http://wuhongyu.iteye.com/blog/807470 WebService是SOA的一种较好的实现方式,它将应用程序的不同功能单元通过中立的契约(独立于硬件平台.操作系统和 ...

  4. WebService学习总结(三)——使用JDK开发WebService

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  5. WebService学习--(三)使用JDK开发WebService

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  6. (三)使用CXF开发WebService客户端

    前面一讲开发了webservice服务器端接口,今天的话,我们来开发webservice客户端,让大家来体验下过程: 首先建一个Maven项目,项目名字,WS_Client: 然后我们要用CXF给我们 ...

  7. WebService学习总结(三)——使用JDK开发WebService(转)

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  8. C# 开发XML Web Service与Java开发WebService

    一.web service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量 ...

  9. Axis1.4开发webservice个人笔记

    Axis1.4开发webservice SOAP 是基于 XML 的简易协议,SOAP 即Simple Object Access Protocol(简单对象访问协议),可使应用程序在 HTTP 之上 ...

随机推荐

  1. Hibernate一对一映射关联

    Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...

  2. 【Filter 页面重定向循环】写一个过滤器造成的页面重定向循环的问题

    今天做一个过滤器,碰上页面重定向循环的情况: 浏览器的访问路径是:http://192.168.16.104:8080/biologyInfo/login/login/login/login/logi ...

  3. Liferay 6.2 改造系列之二十一:修改WebSphare下JSONWS服务不生效的BUG

    问题原因是WebSphare下,servletContext.getContextPath()获取到的值为“/”而非空字符串. 在/portal-master/portal-impl/src/com/ ...

  4. 编译报错dereferencing pointer to incomplete type

    关于编译报错“dereferencing pointer to incomplete type... 多是没找到结构体的定义,可以在本地复制其定义试试. 参考: http://my.oschina.n ...

  5. 网页打印A4纸-----表格在跨页时自动换页打印的实现 (转)

    在最近所做的一个项目中,需要通过网页来打印不少的表单,但是又不想每个打印页签各占用一个页面,这样就需要生存很多不同的冗余页面,为了减少冗余,所有的表单通过jquery的页签tab来实现的. 一 :基本 ...

  6. 2016.9.14 JavaScript入门之七面向对象和函数

    1.JavaScript中的变量,可以是对象,具有相应的属性: 2.我们也能够使用构造函数创建对象.构造函数的函数给出了一个大写的名称,以使它清楚地表明它是一个构造函数. 在构造函数中,这个变量是指由 ...

  7. POJ 3294 后缀数组

    题目链接:http://poj.org/problem?id=3294 题意:给定n个字符串,求一个最长子串要求在超过一半的字符串中出现过. 如果多解按字典序输出 思路:根据<<后缀数组— ...

  8. node.js整理 03文件操作-遍历目录和文本编码

    遍历目录 递归算法 遍历目录时一般使用递归算法,否则就难以编写出简洁的代码. 递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题 function factorial(n) { if (n = ...

  9. ajax上传

    使用FormData,进行Ajax请求并上传文件:具体代码如下: html代码: <!DOCTYPE html><html lang="en"><he ...

  10. 阻止Ajax多次提交

    1.Ajax的abort() xhr = $.ajax({}) if (xhr){ xhr.abort(); } 2.通过在Ajax的beforeSend()方法以及complete()方法添加删除类 ...