1、WebService学习笔记学习笔记 WebService WebService学习笔记 学习笔记WebService2013-3-31第1 页 总共10 页李海全学习笔记 WebService1.WebService 能做什么?1.1 简单的网络应用1.2 什么是服务现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP 协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据
2、库本身并不知道,它只知道接收到了一份协议,这就是SQL92 查询标准协议。目前的云计算、云查杀都是一种服务,现在比较流行的说法是SOA(面向服务的框架)。既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?只要我们用Java 写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!第2 页 总共10 页李海全学习笔记 WebService1.3 复杂的网络应用1.4 几个名词 名词1:XML.ExtensibleMarkupLanguage 扩展性标记语言XML,用于传输格式化的数据,是Web 服务的基础。
3、namespace-命名空间。xmlns=“” 使用默认命名空间。xmlns:itcast=“”使用指定名称的命名空间。 名词2:WSDLWebServiceDescriptionLanguageWeb 服务描述语言。通过XML 形式说明服务在什么地方地址。通过XML 形式说明服务提供什么样的方法 如何调用。 名词3:SOAP-SimpleObjectAccessProtocol(简单对象访问协议)SOAP 作为一个基于XML 语言的协议用于有网上传输数据。SOAP= 在HTTP 的基础上+XML 数据。SOAP 是基于HTTP 的。SOAP 的组成如下:Envelope 必须的部分。以XML
4、 的根元素出现。Headers 可选的。Body 必须的。在body 部分,包含要执行的服务器的方法。和发送到服务器的数据。1.5WSDL,SOAP 的格式1)WSDL说明服务在哪里,如何调用,其实就是一个使用说明书第3 页 总共10 页李海全学习笔记 WebService2)SOAP 协议的范本:请求示例: 以下发出HTTP 请求,但不同的是向服务器发送的是XML 数据!1、因为是在HTTP 上发数据,所以必须先遵循HTTP 协议2、XML 部分即SOAP 协议,必须包含Envelope 元素和Body 元素。SOAP 协议:响应示例: 响应的信息,同发送信息一样,先必须是HTTP 协议,然
5、后再遵循SOAP 协议。第4 页 总共10 页李海全学习笔记 WebService2.使用jdk 发布第一个WebService 服务并调用2.1 介绍JAX(JavaApiforXml)-WS 规范是一组XMLwebservices 的JAVAAPI。JAX-WS 允许开发者可以选择RPC-oriented 或者message-oriented 来实现自己的webservices。在JAX-WS 中,一个远程调用可以转换为一个基于XML 的协议例如SOAP。在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP 消息的代码。JAX-WS 的运行时实现会将这些API 的调用转换成为对
6、应的SOAP 消息。在服务器端,用户只需要通过Java 语言定义远程调用所需要实现的接口SEI (serviceendpointinterface),并提供相关的实现,通过调用JAX-WS 的服务发布接口就可以将其发布为WebService 接口。在客户端,用户可以通过JAX-WS 的API 创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。当然JAX-WS 也提供了一组针对底层消息进行操作的API 调用,你可以通过Dispatch 直接使用SOAP 消息或XML 消息发送请求或者使用Provider 处理SOAP 或XML 消息。通过webservice 所提供的互操作
7、环境,我们可以用JAX-WS 轻松实现JAVA 平台与其他编程环境(.net 等)的互操作。JAX-WS 与JAX-RPC 之间的关系Sun 最开始的webservices 的实现是JAX-RPC1.1(JSR101)。这个实现是基于Java 的RPC,并不完全支持schema 规范,同时没有对Binding 和Parsing 定义标准的实现。JAX-WS2.0(JSR224)是Sun 新的webservices 协议栈,是一个完全基于标准的实现。在binding 层,使用的是theJavaArchitectureforXMLBinding(JAXB,JSR222),在parsing 层,使用
8、的是theStreamingAPIforXML(StAX,JSR173),同时它还完全支持schema 规范。第5 页 总共10 页李海全学习笔记 WebService2.2 代码packagecom.cdut.ws;importjavax.jws.WebService;importjavax.xml.ws.Endpoint;/*WebService* 将Java类标记为WebService,或者将Java接口标记为WebService*author李海全*/WebService/注意只有此一个注解,此注解也是必须的,默认的SOAP消息风格为:DOCUMENTpublicclassHelloS
9、ervicepublicStringsayHello(Stringname)returnhello+name;publicstaticvoidmain(Stringargs)/参数1:WebService发布地址/参数2:服务的实现者Endpoint.publish(http:/127.0.0.1:6789/hello,newHelloService();步骤:1) 在类上添加WebService 注解。这是jdk1.6 提供的一个注解。它位于:javax.jws.*包中。2)通过EndPoint(端点服务)发布一个webService。Endpoint 也是jdk 提供的一个专门用于发布服务
10、的类,它的publish 方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。staticEndpoint.publish(Stringaddress,Objectimplementor) 。 在给定地址处针对指定的实现者对象创建并发布端点。stop 方法用于停止服务。EndPoint 发布完成服务以后,将会独立的线程运行。所以,publish 之后的代码,可以正常执行。注意事项:第6 页 总共10 页李海全学习笔记 WebService给类添加上WebService 注解后,类中所有的非静态方法都将会对外公布。不支持静态方法,final 方法。如
11、 果 希 望 某 个 方 法( 非static, 非final) 不 对 外 公 开 , 可 以 在 方 法 上 添 加WebMethod(exclude=true),阻止对外公开。如果一个类上,被添加了WebService 注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。2.3 调用WebService2.3.1 服务发布成功了,如何调用呢?请看说明书-WSDL:在地址栏输入(注意后面的参数?wsdl)http:/127.0.0.1:9999/helloworld?wsdl目前不是访问webService,只是获取一个用于描述WebService 的说明文件,即:wsdl 文件.
12、wsdl-WebServiceDescriptionLanguage,是以XML 文件形式来描述WebService 的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务2.3.2 使用wsimport 生成本地调用代码:1:可以通过javaversion 检查你当前的版本号.如果版本太低可以安装高版本的jdk.或直接将别人已安装好的jdk 目录拷贝到你的机器如D:jdk1.6.0_21 目录下.因为以前的环境变量已经设置成以前老版本的jdk 目录,即JAVA_HOME 和PATH 两个环境变量.可以再重新设置一下环境变量为:JAVA_HOME=D:jdk1.6.0_21,path
13、=%JAVA_HOME%bin,重新设置了环境变量后,要重新打开一个doc(命令行)窗口.才生效.如果不想修改原来已经配置好的环境变量,可以命令行窗口输入以下命令,使jdk1.6.0_24 生效:setpath=D:jdk1.6.0_21bin;%PATH%(回车即可)再通过javaversion 查看jdk 的版本号是否已经发生变化.2:转到一个相对干净的目录下,我在d 盘上新建立一个目录名为:ws,并转到此目录下.3:开启你的webService.4:输入以下命令:wsimports.http:/127.0.0.1:6789/hello?wsdl参数说明:-s 是指编译出源代码文件,后面的
14、.(点)指將代碼放到當前目錄下.最后面的http.是指获取wsdl 说明书的地址.5:此时,将生成.java 文件和.class 文件.(都包含原始包名).将代码Copy 到你的项目中.(只拷贝java 文件)6:在新的项目中,新一个类,(可位于任意包下),对上面生成的代码进行调用,见下一页ppt.7:wsimport 其他参数说明,我们经常使用的参数为-d,-s,-p-d将会生成.class 文件.示例:wsimportd.http:/127.0.0.1:6789/hello?wsdl-s将会生成.java 文件.示例:wsimports.http:/127.0.0.1:6789/hello
15、?wsdl-p将生成的文件(.java 或是.class 修改成指定的包名)第7 页 总共10 页李海全学习笔记 WebService示例:wsimport-s.-pcom.beijing.itcasthttp:/127.0.0.1:6789/hello?wsdl对于-p 参数,注意包名的修改,它将所生成类,全部置于通过-p 指定的包下.(演示)需要说明的是,当仅使用-p 参数时,它也将同时使用-d 即编译成.class 文件.d 参数写或不写,它都在那里,不离不弃.注意:-s 不能分开,-s 后面有个小点,用于指定源代码生成的目录。点即当前目录。如果使用了-s 参数则会在目录下生成两份代码,
16、一份为.class 代码。一份为.java 代码。.class 代码,可以经过打包以后使用。.java 代码可以直接Copy 到我们的项目中运行。2.3.4 使用说明书WSDL2.3.5 调用代码packagecom.cdut.ws;/* 通过调用生成的类,来调用远程代码*author 李海全*/publicclassApppublicstaticvoidmain(Stringargs)/从HelloServiceService的getHelloWorldPort方法中返回调用接口HelloServiceservice=newHelloServiceService().getHelloServ
17、icePort();/执行调用Stringret=service.sayHello(习近平);第8 页 总共10 页李海全学习笔记 WebServiceSystem.out.println(ret);2.4 例子:通过WebService 获取天气信息1.打开网址:直接使用wsimport 通过该地址生存java 文件时,会报错。因为该wsdl 里面包含ref=s:schema 这样的引用。2.将该网页另存为“WeatherWebService.wsdl”文件。3.运用wsimport 命令:wsimport-s.file:/f:/WeatherWebService.wsdl将打开该文件,将出
18、错的地方删除4.再运行该命令,生成以下代码5.编写客户端,将生成文件拷贝到工程中.webxml.ArrayOfString;.webxml.WeatherWebService;.webxml.WeatherWebServiceSoap;第9 页 总共10 页李海全学习笔记 WebServicepublicclassRunMainpublicstaticvoidmain(Stringargs)WeatherWebServicewws=newWeatherWebService();WeatherWebServiceSoapwwsp=wws.getWeatherWebServiceSoap();ArrayOfStringaos=wwsp.getWeatherbyCityName(成都);for(Strings:aos.getString()System.out.println(s);6.结果第10 页 总共10 页
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1