WebService学习笔记 学习笔记——WebService
第1 页 总共10 页
学习笔记
WebService
2013-3-31
李海全学习笔记——WebService
1.WebService 能做什么?
1.1 简单的网络应用
1.2 什么是服务
现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别
说只使用一种语言了。 大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应
用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP 协议 与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据 库本身并不知道,它只知道接收到了一份协议,这就是SQL92 查询标准协议。 目前的云计算、云查杀都是一种服务,现在比较流行的说法是SOA(面向服务的框架)。 既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么
语言,那我们为什么就不能实现跨平台、跨语言的服务呢?
只要我们用Java 写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言
的服务!
第2 页 总共10 页
1.3 复杂的网络应用
李海全学习笔记——WebService
1.4 几个名词
名词1:XML.ExtensibleMarkupLanguage -扩展性标记语言
· XML,用于传输格式化的数据,是Web 服务的基础。
· namespace-命名空间。
· xmlns=“http://itcast.cn” 使用默认命名空间。
· xmlns:itcast=“http://itcast.cn”使用指定名称的命名空间。
名词2:WSDL–WebServiceDescriptionLanguage–Web 服务描述语言。
· 通过XML 形式说明服务在什么地方-地址。
· 通过XML 形式说明服务提供什么样的方法– 如何调用。
名词3:SOAP-SimpleObjectAccessProtocol(简单对象访问协议)
· SOAP 作为一个基于XML 语言的协议用于有网上传输数据。 · SOAP= 在HTTP 的基础上+XML 数据。
· SOAP 是基于HTTP 的。
· SOAP 的组成如下:
· Envelope– 必须的部分。以XML 的根元素出现。 · Headers– 可选的。
· Body– 必须的。在body 部分,包含要执行的服务器的方法。
和发送到服务器的数据。
1.5WSDL,SOAP 的格式
1)WSDL-说明服务在哪里,如何调用,其实就是一个使用说明书
第3 页 总共10 页
李海全学习笔记——WebService
2)SOAP 协议的范本:-请求示例:
以下发出HTTP 请求,但不同的是向服务器发送的是XML 数据!
1、因为是在HTTP 上发数据, 所以必须先遵循HTTP 协议 2、XML 部分即SOAP 协议,必须包含 Envelope 元素和Body 元素。
SOAP 协议:-响应示例:
响应的信息,同发送信息一样,先必须是HTTP 协议,然后再遵循SOAP 协议。
第4 页 总共10 页
李海全学习笔记——WebService
2.使用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 的调用转换成为对应的SOAP 消息。
在服务器端,用户只需要通过Java 语言定义远程调用所需要实现的接口SEI (service endpointinterface),并提供相关的实现,通过调用JAX-WS 的服务发布接口就可以将其发布 为WebService 接口。
在客户端,用户可以通过JAX-WS 的API 创建一个代理(用本地对象来替代远程的服务) 来实现对于远程服务器端的调用。
当然JAX-WS 也提供了一组针对底层消息进行操作的API 调用,你可以通过Dispatch 直 接使用SOAP 消息或XML 消息发送请求或者使用Provider 处理SOAP 或XML 消息。
通过webservice 所提供的互操作环境,我们可以用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 层,使 用的是theStreamingAPIforXML(StAX,JSR173),同时它还完全支持schema 规范。
第5 页 总共10 页
2.2 代码
packagecom.cdut.ws; importjavax.jws.WebService; importjavax.xml.ws.Endpoint; /**www.mwcly.cn *WebService * 将Java类标记为WebService,或者将Java接口标记为WebService *@author李海全 * */ @WebService//注意只有此一个注解,此注解也是必须的,默认的SOAP消息风格 为:DOCUMENT publicclassHelloService{ 李海全学习笔记——WebService
publicStringsayHello(Stringname){ return\"hello\"+name; }
publicstaticvoidmain(String[]args){ //参数1:WebService发布地址 //参数2:服务的实现者 Endpoint.publish(\"http://127.0.0.1:67/hello\",new HelloService()); } }
步骤:
1) 在类上添加@WebService 注解。这是jdk1.6 提供的一个注解。它位于:javax.jws.*包中。 2)通过EndPoint(端点服务)发布一个webService。
Endpoint 也是jdk 提供的一个专门用于发布服务的类,它的publish 方法接收两个参数,
一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
staticEndpoint.publish(Stringaddress,Objectimplementor) 。 在给定地址处针对指定 的实现者对象创建并发布端点。 stop 方法用于停止服务。
EndPoint 发布完成服务以后,将会的线程运行。所以,publish 之后的代码,可 以正常执行。
注意事项:
第6 页 总共10 页
李海全学习笔记——WebService
给类添加上@WebService 注解后,类中所有的非静态方法都将会对外公布。 不支持静态方法,final 方法。
如 果 希 望 某 个 方 法( 非static, 非final) 不 对 外 公 开 , 可 以 在 方 法 上 添 加 @WebMethod(exclude=true),阻止对外公开。
如果一个类上,被添加了@WebService 注解,则必须此类至少有一个可以公开的方法, 否则将会启动失败。
2.3 调用WebService
2.3.1 服务发布成功了,如何调用呢?请看说明书-WSDL:
在地址栏输入(注意后面的参数?wsdl)http://127.0.0.1:9999/helloworld?wsdl
目前不是访问webService,只是获取一个用于描述WebService 的说明文件,即:wsdl 文件. wsdl-WebService
DescriptionLanguage,是以XML 文件形式来描述WebService 的”说明书”,
有了说明书,我们才可以知道如何使用或是调用这个服务
2.3.2 使用wsimport 生成本地调用代码:
1:可以通过java–version 检查你当前的版本号.如果版本太低可以安装高版本的jdk. 或直接将别人已安装好的jdk 目录拷贝到你的机器如D:\\jdk1.6.0_21 目录下.
因为以前的环境变量已经设置成以前老版本的jdk 目录,即JAVA_HOME 和PATH 两个环境变 量.
可以再重新设置一下环境变量为:JAVA_HOME=D:\\jdk1.6.0_21,path=%JAVA_HOME%\\bin, 重新设置了环境变量后,要重新打开一个doc(命令行)窗口.才生效.
如果不想修改原来已经配置好的环境变量,可以命令行窗口输入以下命令,使jdk1.6.0_24 生 效:
setpath=D:\\jdk1.6.0_21\\bin;%PATH%(回车即可)
再通过java–version 查看jdk 的版本号是否已经发生变化.
2:转到一个相对干净的目录下,我在d 盘上新建立一个目录名为:ws,并转到此目录下. 3:开启你的webService. 4:输入以下命令:
wsimport–s.http://127.0.0.1:67/hello?wsdl
参数说明:-s 是指编译出源代码文件,后面的.(点)指將代碼放到當前目錄下. 最后面的http….是指获取wsdl 说明书的地址.
5:此时,将生成.java 文件和.class 文件.(都包含原始包名).将代码Copy 到你的项目中.(只拷贝 java 文件)
6:在新的项目中,新一个类,(可位于任意包下),对上面生成的代码进行调用,见下一页ppt. 7:wsimport 其他参数说明,我们经常使用的参数为-d,-s,-p -d<目录>将会生成.class 文件.
示例:wsimport–d.http://127.0.0.1:67/hello?wsdl -s<目录>将会生成.java 文件.
示例:wsimport–s.http://127.0.0.1:67/hello?wsdl
-p<包名>将生成的文件(.java 或是.class 修改成指定的包名)
第7 页 总共10 页
李海全学习笔记——WebService
示例:wsimport-s.-pcom.beijing.itcasthttp://127.0.0.1:67/hello?wsdl
对于-p 参数,注意包名的修改,它将所生成类,全部置于通过-p 指定的包下.(演示)
需要说明的是,当仅使用-p 参数时,它也将同时使用-d 即编译成.class 文件.–d 参数写或不写, 它都在那里,不离不弃.
注意:-s 不能分开,-s 后面有个小点,用于指定源代码生成的目录。点即当前目录。 如果使用了-s 参数则会在目录下生成两份代码,一份为.class 代码。一份为.java 代码。 .class 代码,可以经过打包以后使用。.java 代码可以直接Copy 到我们的项目中运行。 2.3.4 使用说明书WSDL
2.3.5 调用代码
packagecom.cdut.ws; /**www.huaihua365.net * 通过调用生成的类,来调用远程代码 *@author 李海全 */ publicclassApp{
publicstaticvoidmain(String[]args){ //从HelloServiceService的getHelloWorldPort方法中返回调用接口 HelloServiceservice=new HelloServiceService().getHelloServicePort();
//执行调用 Stringret=service.sayHello(\"**\"); 第8 页 总共10 页
} 李海全学习笔记——WebService
System.out.println(ret); }
2.4 例子:通过WebService 获取天气信息
1.打开网址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 直接使用wsimport 通过该地址生存java 文件时,会报错。因为该wsdl 里面包含ref= \"s:schema\" 这样的引用。
2.将该网页另存为“WeatherWebService.wsdl”文件。 3.运用wsimport 命令:
wsimport-s.file:/f:/WeatherWebService.wsdl
将打开该文件,将出错的地方删除
4.再运行该命令,生成以下代码
5.编写客户端,将生成文件拷贝到工程中 importcn.com.webxml.ArrayOfString; importcn.com.webxml.WeatherWebService; importcn.com.webxml.WeatherWebServiceSoap;
第9 页 总共10 页
publicclassRunMain{ publicstaticvoidmain(String[]args){ WeatherWebServicewws=newWeatherWebService(); WeatherWebServiceSoapwwsp=wws.getWeatherWebServiceSoap(); 李海全学习笔记——WebService
ArrayOfStringaos=wwsp.getWeatherbyCityName(\"成都\"); for(Strings:aos.getString()){ System.out.println(s); }
}
} 6.结果
第10 页 总共10 页
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务