WebService学习笔记.docx
《WebService学习笔记.docx》由会员分享,可在线阅读,更多相关《WebService学习笔记.docx(25页珍藏版)》请在冰豆网上搜索。
WebService学习笔记
学习笔记WebService
WebService学习笔记
学习笔记
WebService
2013-3-31
第1页总共10页
李海全学习笔记WebService
1.WebService能做什么?
1.1简单的网络应用
1.2什么是服务
●
●
●
●
●
现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。
更别
说只使用一种语言了。
大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应
用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP协议
与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据
库本身并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议。
目前的云计算、云查杀都是一种服务,现在比较流行的说法是SOA(面向服务的框架)。
既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么
语言,那我们为什么就不能实现跨平台、跨语言的服务呢?
只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言
的服务!
第2页总共10页
李海全学习笔记WebService
1.3复杂的网络应用
1.4几个名词
●名词1:
XML.ExtensibleMarkupLanguage-扩展性标记语言
·
XML,用于传输格式化的数据,是Web服务的基础。
·
namespace-命名空间。
·
·
xmlns=“”使用默认命名空间。
xmlns:
itcast=“”使用指定名称的命名空间。
●名词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页
李海全学习笔记WebService
2.2代码
packagecom.cdut.ws;
importjavax.jws.WebService;
importjavax.xml.ws.Endpoint;
/**
*WebService
*将Java类标记为WebService,或者将Java接口标记为WebService
*@author李海全
*
*/
@WebService//注意只有此一个注解,此注解也是必须的,默认的SOAP消息风格
为:
DOCUMENT
publicclassHelloService{
publicStringsayHello(Stringname){
return"hello"+name;
}
publicstaticvoidmain(String[]args){
//参数1:
WebService发布地址
//参数2:
服务的实现者
Endpoint.publish("http:
//127.0.0.1:
6789/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:
6789/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:
6789/hello?
wsdl
-s<目录>将会生成.java文件.
示例:
wsimport–s.http:
//127.0.0.1:
6789/hello?
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参数则会在目录下生成两份代码,一份为.class代码。
一份为.java代码。
.class代码,可以经过打包以后使用。
.java代码可以直接Copy到我们的项目中运行。
2.3.4使用说明书WSDL
2.3.5调用代码
packagecom.cdut.ws;
/**
*通过调用生成的类,来调用远程代码
*@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.打开网址:
直接使用wsimport通过该地址生存java文件时,会报错。
因为该wsdl里面包含ref=
"s:
schema"这样的引用。
2.将该网页另存为“WeatherWebService.wsdl”文件。
3.运用wsimport命令:
wsimport-s.file:
/f:
/WeatherWebService.wsdl
将打开该文件,将出错的地方删除
4.再运行该命令,生成以下代码
5.编写客户端,将生成文件拷贝到工程中
.webxml.ArrayOfString;
.webxml.WeatherWebService;
.webxml.WeatherWebServiceSoap;
第9页总共10页
李海全学习笔记WebService
publicclassRunMain{
publicstaticvoidmain(String[]args){
WeatherWebServicewws=newWeatherWebService();
WeatherWebServiceSoapwwsp=wws.getWeatherWebServiceSoap();
ArrayOfStringaos=wwsp.getWeatherbyCityName("成都");
for(Strings:
aos.getString()){
System.out.println(s);
}
}
}
6.结果
第10页总共10页