• 1. WebService 基于Web的服务王健北京传智播客教育 www.itcast.cn
  • 2. 主要内容:何为web服务? Wsimport生成本地代码 Wsimport –s .(源代码生成目录) -d . (.class文件生成的目录) -p 新的包名 wsdl文件的地址?wsdl SOAP1.1和SOAP1.2协议 Namespace命名空间不一样。 @WebService注解 (targetNamespace=http://itcast.cn) @WebMethod @WebParam @WebResult Endpoint发布类。 Publish(string url,Object 实现者); 动态调用网络上的服务 生成本地代码。 使用纯ajax。 请求头设置:text/xml;charset=UTF-8 SOAP1.1 Application/soap+xml;charset=UTF-8 soap1.2
  • 3. 先理解什么是服务:现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。 大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库本身并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议。 目前的云计算、云查杀都是一种服务,现在比较流行的说法是SOA(面向服务的框架)。 既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢? 只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!
  • 4. WebService:什么是WebService? 简说:如果说Java是跨平台的语言,那么WebService就是跨语言的技术。 WebService可以让多个进程之间实现数据交换,即进程间通讯。 无论某个进程运行要互联网的任何地点,无论进程是有什么语言写成的,都可以互相访问并传输数据。 最后,WebService是基于HTTP和XML的技术。 WebService的商业应用: 网上支付-支付宝。 银联-提供统一的WebService,实现银行之间的转账付款。 在种不同的终端设备上如手机、iPad实时查询天气预报、股票行情。 演示通过Java代码,调用互联网上服务的过程。
  • 5. WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用. 我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单了调用了一下服务器上的一段代码而已。 学习WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样.。
  • 6. 简单的网络应用:Java应用程序 ViewControl/ServiceDAO/ModelDB-Socket 127.0.0.1:3306简单的网络应用使用单一语言写成,它的 唯一外部程序就是它所依赖的数据库。 大家想想是不是这样呢?
  • 7. 复杂的网络应用:Java应用程序 ViewControl/ServiceDAO/ModelDB手机终端PDAC#.NET应用更为复杂的应用除了自己内部 调用之外有可能还会对外部 程序提供服务,更或是调用其他 应用。C#应用
  • 8. WebService的远程调用的原理
  • 9. WebService的相关术语:名词1:XML. Extensible Markup Language -扩展性标记语言 XML,用于传输格式化的数据,是Web服务的基础。 namespace-命名空间。 xmlns=“http://itcast.cn” 使用默认命名空间。 xmlns:itcast=“http://itcast.cn”使用指定名称的命名空间。 名词2:WSDL – WebService Description Language – Web服务描述语言。 - 如何调用webservice的说明书。 通过XML形式说明服务在什么地方-地址。 通过XML形式说明服务提供什么样的方法 – 如何调用。 名词3:SOAP-Simple Object Access Protocol(简单对象访问协议) SOAP作为一个基于XML语言的协议用于有网上传输数据。 SOAP = 在HTTP的基础上+XML数据。 - soap=HTTP+XML SOAP是基于HTTP的。 SOAP的组成如下: Envelope – 必须的部分。以XML的根元素出现。 Headers – 可选的。 Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。 以下简单了解一下WSDL文件和SOAP协议
  • 10. 在Java项目中开发第一个WS服务:快速上手:那么如何才可以发布一个WebService呢? 在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。 JAX-WS是指Java Api for XML – WebService. (见SUN公司发布的JAX-WS白皮书) 用Jdk1.6.0_21以后的版本发布一个WebService服务. 与Web服务相关的类,都位于javax.ws.*包中。 主要类有: @WebService - 它是一个注解,用在类上指定将此类发布成一个ws. Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
  • 11. 在Java项目中开发第一个WS服务:1、在类上添加@WebService注解。 这是jdk1.6提供的一个注解。它位于:javax.jws.*包中。 2、通过EndPoint(端点服务)发布一个webService。 Endpoint也是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。 static Endpoint.publish(String address, Object implementor)           在给定地址处针对指定的实现者对象创建并发布端点。 stop方法用于停止服务。 EndPoint发布完成服务以后,将会独立的线程运行。所以,publish之后的代码,可以正常执行,但整个程序不会终止。 其他注意事项: 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。 不支持静态方法,final方法。- 如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。
  • 12. 第一个WebService服务//1、添加注解 @WebService public class OneService { //2、至少包含一个可以对外公开的服务 public String sayHello(String name){ System.err.println("invoke "+name); return "Hello "+name; } public static void main(String[] args) { //3、第一个参数称为Binding即绑定地址, //第二个参数是实现者,即谁提供服务 Endpoint.publish("http://localhost:9999/one", new OneService()); } }1、给类添加注解2、声明实例方法3、使用端点服务,将对象 绑定到一个地址和端口。 同时必须要在端口后面 给服务取一个名称4、在IE地址栏输入以下地址访问: http://localhost:9999/one?wsdl
  • 13. 服务发布成功了,如何调用呢?WSDL:在地址栏输入以下地址获取使用说明书:(注意后面的参数?wsdl) http://127.0.0.1:9999/helloworld?wsdl 在地址栏输入上面的URL之后,即会显示一个XML文件 ,此文件称为WSDL.因为此文件主要描述了WebService的调用、使用方法 。 目前不是访问webService,只是获取一个用于描述WebService的说明文件,即:wsdl文件. wsdl- WebService Description Language,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.
  • 14. WSDL-说明服务在哪里,如何调用,其实就是一个使用说明书:1、WS的地址2、WS的名称3、ws所提供的方法-即服务
  • 15. 使用wsimport生成本地调用代码:说明书看不懂怎么办?别急JDK能看懂: wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要. wsimport.exe位于JAVA_HOME\bin目录下. 常用参数为: -d<目录> - 将生成.class文件。默认参数。 -s<目录> - 将生成.java文件。 -p<生成的新包名> -将生成的类,放于指定的包下。 (wsdlurl) - http://server:port/service?wsdl,必须的参数。 示例: C:/> wsimport –s . http://192.168.0.100/one?wsdl 注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。 如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。 .class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行。
  • 16. 生成以后代码如下图所示:生成两份代码只拷贝Java代码。还必须要对照WSDL文件找到应该如何调用!
  • 17. 看懂使用说明书WSDL:上面箭头所指的就是应该调用的 类及方法 。
  • 18. 稍微复杂一点的应用: 请用生成代码的方式完成以下WebService的发布和调用:
  • 19. WebService通过HTTP协议完成远程调用:WebService只采用HTTP POST方式传输数据,不使用GET方式; (仅获取WSDL文件是GET方式) 普通http post的contentType为 application/x-www-form-urlencoded WebService的contentType为-即在Http的基础上发SOAP协议 text/xml 这是基于soap1.1协议。 application/soap+xml 这是基于soap1.2协议。 WebService从数据传输格式上作了限定。WebService所使用的数据均是基于XML格式的。目前标准的WebService在数据格式上主要采用SOAP协议。SOAP协议实际上就是一种基于XML编码规范的文本协议。 SOAP – Simple Object Access protocol 简单对像访问协议。是运行在HTTP协议基础之上的协议。其实就是在HTTP协议是传输XML文件,就变成了SOAP协议。 SOAP1.1和SOAP1.2的 namespace不一样。可以通过查看类 javax.xml.ws.soap.SOAPBinding来查看里面的常量 默认情况下,Jdk1.6只支持soap1.1 即:@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING)
  • 20. WebService和Web服务器的区别WebService和Web服务器有什么区别呢?我们可以把WebService看作是Web服务器上应用;反过来说,Web服务器是WebService运行时所必需的容器。这就是它们的区别和联系。 使用JDK1.6发布的简单Web服务,其内部其实是使用Socket实现。可以查看:SUN公司未对外公布的API类com.sun.xml.internal.ws.transport.http.server. ServerMgr获知,请使用反编译工具。 WebService的特点 WebService通过HTTP POST方式接受客户的请求 WebService与客户端之间一般使用SOAP协议传输XML数据. 它本身就是为了跨平台或跨语言而设计的。
  • 21. 关于对webService的定义,各有不同,以下是w3c的定义:
  • 22. SOAP协议:SOAP协议与HTTP协议一样,是一种格式化的文本。 也包含请求协议和响应协议。 普通的HTTP协议是指通过GET或是POST方式发送文本串。 而SOAP协议则是指通过POST方式发送XML文本。 所以:SOAP = HTTP + XML。 简单的说:SOAP就是一段XML文件,在XML中定义了调用什么方法及传递什么参数。 那么,我们应该如何公布我们自己开发的SOAP协议文本呢?
  • 23. SOAP协议的范本:-请求示例:以下发出HTTP请求,但不同的是向服务器发送的是XML数据!2、XML部分即SOAP协议,必须包含 Envelope元素和Body元素。1、因为是在HTTP上发数据, 所以必须先遵循HTTP协议
  • 24. 使用MyEclipse的WsExplorer Tcp/Ip Monitor来监控WebService的调用过程 从而快捷的获取SOAP协议文本王健北京传智播客教育 www.itcast.cn
  • 25. WebService监听工具:之前我们使用过HttpWatch获取的HTTP的调用过程,并获得了HTTP的请求头及其他请求的详细信息。 既然WebServie也是通过HTTP进行通信的,能不使用HTTPWatch来获取它的请求过程呢? 我们的代码不仅仅是向服务器发送的HTTP协议,更具体的说应该叫SOAP协议,它是WebService进行通信的基础。 为了获取SOAP数据发送和接收的格式。我们有必要使用一个工具来深入的了解WebService. 为了监控拦截请求头和响应头的具体数据,我们使用TCP/IP Monitor来拦截请求和响应的完整过程。
  • 26. WS Explorer工具的使用:- web服务浏览器 使用此工具可以获取请求协议的格式和响应协议的格式。 在MyEclipse的调用WebService并查看发出和收到的数据格式!
  • 27. 选择使用WSDL地址:选择WSDL并输入地址确定以后显示的服务信息
  • 28. 输入正确的WSDL地址后,点确定,将显示所的对外暴露的方法:
  • 29. 选择其中的一个方法,并向服务器发起请求:
  • 30. 通过HTTP发出和接收到的XML数据:使用WebServiceExplorer只可以看到SOAP的XML数据,并看不到HTTP协议的头。 既然是用HTTP发XML数据,就一定会有HTTP头,为了获取HTTP头,我们使用TCP/IP Monitor.
  • 31. 请求的数据:响应的数据
  • 32. 使用TCP/IP Monitor-拦截HTTP请求头和响应头及Body部分:前面的WSExplorer只参获取 消息体部分。为了获取HTTP 请求的具体信息,我们可以 使用monitor;; 因为SOAP是在HTTP的 基础上发XML数据,前 面的XML数据已经可以 获取到了,那么,既然 是在HTTP上收发消息, 就一定会有HTTP的头信 息,那HTTP头信息又 是怎么样的呢?示例配置拦截本机到百度的请求:此工具位于:window>show view>other>MyEclipse Common(常用工具)>TCP/IP Monitor
  • 33. Tcp/IP Montinor的原理
  • 34. SOAP请求过程分析:第一步:使用get方式获取wsdl文件,称为握手。 对于JDK1.6生成的ws服务,由于内部有一两个配置文件,所以会发出两次get请求。 其他的一般为一次。 第二步:用户发出请求将使用post方式。 第三步:服务器响应成功。客户端WS服务1、Get请求-握手2、post请求-数据
  • 35. 获取wsdl文件-握手的请求与响应:
  • 36. 以下是拦截到的请求/响应信息:注意Content-Type头信息
  • 37. 发出去的XML文本: //SOAP协议必须拥有body元素 //SOAP协议必须通过第一个节点指明需要调用的方法 aaa 第二行:http://schemas.xmlsoap.org/soap/envelope/ 是soap1.1的schema
  • 38. 拦截到的返回信息: HelloWorld 虽然修改了前缀,但用的是同一个命名空间。
  • 39. 深入分析说明书WSDL:wsdl – WebService Description Language(WS描述语言) 通过对发布的程序添加注解可以修改WSDL文件。 它主要定义了三个方面的问题: What?即服务是什么? (portType,types,message) How?如何调用服务? 通过binding元素说明调用服务的方式:soap,soap12,post,get. Where?在哪儿调用服务? Service元素,soap:address.
  • 40. WSDL说明:WSDL各元素含义
  • 41. WSDL各元素调用方法
  • 42. 通过图示更好的来理解WSDL:绑定服务的接口
  • 43. 修改wsdl文件的内容: - 以达到更好的格式化SOAP协议文本目的 1、保护我们的数据。 2、更好的格式化SOAP协议文本。 WSDL文件的内容,一般由服务默认生成,但为了更好的向开发人员提供使用说明书,一般应做一些简单的修改。至少不应该暴露我们的包结构。而targetNamespace默认情况下为倒置的包名,这已经暴露了我们的包结构。 通过在类文件上添加以下注解,可以修改wsdl生成的各元素,而不是直接去修改wsdl文件,直接去修改wsdl文件是无效的。 WebService的注解包括: @WebService-定义服务 @WebMethod-定义方法 @WebResult-定义返回值 @WebParam-定义参数
  • 44. 注解的作用通过WebService的注解,可以更加形像的描述Web服务。从而生成WSDL文档。 当修改了WebService注解之后,同时会影响客户端生成的代码。 调用的方法名和参数名也发生了变化。 即使是没有修改源代码,只修改了注解,客户端的代码也必须要重新生成(注意是生成而不是下载)。否则调用将会失败。 生成本地调用代码,依然使用wsimport工具。
  • 45. @WebService注解:@WebService注解,作用在具体类上。而不是接口。 一个类只有添加了此注解才可以通过Endpoint发布为一个web服务。 一个添加了此注解的类,必须要至少包含一个实例方法。静态方法和final方法不能被发布为服务方法。 WebService注解包含以下参数:
  • 46. @WebMethod此注解用在方法上,用于修改对外暴露的方法。
  • 47. @WebResult用于定制返回值到WSDL的映射:
  • 48. @WebParam用于定义WSDL中的参数映射:
  • 49. 续:根据添加了很多注解生成的WSDL做下面的两个工作: 1、将上面的程序对外发布以后,我们通过MyEclipse的WebService Explorer来访问你会发现和以前不一样的提示信息,但其实,仍然还是调用的那同一个方法。 2、根据新的WSDL文件,生成新的客户端代码,并调用测试。发现类是不是都已经变化了呢!
  • 50. 从wsdl中分析出类的关系:
  • 51. 客户端通过编程的方式访问服务:使用javax.xml.ws.Service类用于访问web服务。 关键类Service 方法create – 用户创建Service对像,提供wsdlurl和服务名。 getPort-用于通过指定namespace,portName和接口的范型。 在客户端需要一个与服务器接口完全相同的类。(仍然使用工具生成。但只需要一个接口。并需要简单修改。如果返回的是复杂数据类型如POJO,还需要将POJO一并放到项目中)-不要试图通过-p来修改包名,会出错的。 关键类QName – 被称为完全限定名即:Qualified Name的缩写。 QName 的值包含名称空间 URI、本地部分和前缀。
  • 52. 客户端编程:-让我们知道生成代码的奥密:
  • 53. 综合示例-1:发布Web服务返回复杂数据类型-JavaBean。使用wsimport生成本地代码,调用。
  • 54. 综合示例-2:返回List类型:使用wsimport生成本地代码,调用。
  • 55. 使用原生的ajax调用web服务:由于使用ajax – js调用web服务完成不同于使用java代码调用。所以,必须要对SOAP文件非常的了解。 一般使用ajax调用,应该是在已经获知了以下信息以后才去调用: 获知请求(request)的soap文本。 获知响应(response)的soap文本。请求文件和响应文本格式,一般会随web服务的发布一同发布。 我们可以通过WSExplorer获取上面两段文本。
  • 56. Ajax调用获取所有用户:
  • 57. 使用HttpUrlConnection访问WebService: 建议将SOAP定义到一个XML文件中,读取不[容易出错:
  • 58. 说明:使用JDK发布WS时,其内部通过JAXB (JavaApi for XML Builder),将服务转成以XML形式表示的WSDL文件。 由于Map类型的不确定性,不能将Map转成XML文件所以返回的复杂类型不支持Map类型。如果必须要什么Map必须要使用JAXB的转换器。这不是我们的重点。关于如果将Map转成一个JavaBean见本目录下的jaxb.ppt课件。