黑马程序员webservice笔记_第1页
黑马程序员webservice笔记_第2页
黑马程序员webservice笔记_第3页
黑马程序员webservice笔记_第4页
黑马程序员webservice笔记_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、黑马程序员webservice笔记一:webservice第一天1.1:webservice介绍大家提出问题:1.1.1学习目标l 什么是webservice?l 它能做什么?l 为什么要学习webservice?l 学习webservice要达到什么目的? 会做?会说?还是一种思想?l 学会使用jax-ws开发webservice l 学会看懂和使用wsdl 说明书l 知道什么是soap协议(webservice的生活中的例子:/(便民查询网站)便民查询网站的设计思想:1.1.2 webservice的作用:webservice,顾名思义就是基于web的

2、服务。它使用web(http)方式,接收和响应外部系统的某种请求。从而实现远程调用. 我们可以调用互联网上查询天气信息web服务,然后将它嵌入到我们的程序(c/s或b/s程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单了调用了一下别人服务器上的一段代码而已。学习webserice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的webservice,就像使用自己的代码一样.。webservice可以实现跨平台远程调用,从而实现异构程序之间的通信,特定需求下可以实现远程数据共享、软件重用、分布式程

3、序集成。webservice 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。它采用标准soap协议(simple object access protocol) ,协议传输webservice数据,是w3c标准。xml和xsd(xml schema datatypes)是webservice的基础,是w3c标准,采用wsdl作为描述语言即webservice使用说明书webservice的优缺点:优点:1、采用xml支持跨平台远程调用。2、基于http的soap协议,可跨越防火墙。3、支持面向对象开发。4、有利于软件和数据重用,实现松耦合。缺点:随着soa

4、p协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议去完成简单的数据传输的效率不高,对接口要求不严格的情况下直接用http传输自定义数据内容更快捷,例如第三方支付公司的支持接口。1.2:webservice的原理(socket)使用socket实现远程调用客户端和服务端的调用代码:1.2.1 服务端代码:1.2.2 客户端代码:总结:webservice的底层原理,就是socket1.3:jdk发布webservice服务使用jax-ws开发webservice jax-ws 的全称为 java api for xml-based webservices ,从java5开始支

5、持jax-ws2.0版本,jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本,本教程我们使用jdk1.7.0_07开发。那么如何才可以发布一个webservice呢?1:用jdk1.6.0_13以后的版本发布一个webservice服务,并通过地址栏查看它的wsdl文档.2:通过wsimport生成客户端代码,调用并查看运行的结果.(学会如何调用是我们的重点).3:从互联网上获取一个webservice网络公开的服务,并使用工具生成客户端,调用并查看结果。测试代码包括服务端和客户端的开发1.3.1 服务端开发:代码:其中:1、编写sei(service endpoint

6、 interface),为了开发方便我们用java类代替接口加实现类的方式。2、java类中至少要有一个非静态的公开方法需要作为webservice服务方法。3、public class weatherserver上边要加上webservice,表示webservice的发布类。4、使用endpoint.publish()方法发布服务。1.3.2 学会看懂使用说明书(wsdl)1、在地址栏输入(注意后面的参数?wsdl):8888/weather?wsdl 2、 这里注意目前不是访问webservice,只是获取一个用于描述webservice的说明文件,即:ws

7、dl文件,我们需要看懂wsdl的文件,这样就知道服务端究竟发布什么样的服务,提供什么样的方法,需要传递什么类型的参数,方法的返回值类型是什么等。.3、 wsdl- 即webservicedescriptionlanguage,是以xml文件形式来描述webservice的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务。这里从下向上看:其中:1:weatherserverservice为视图服务2:weatherserverport为调用的端口,即getweatherserverport()方法3:weatherserver为接口,接口中提供一个queryweather()的方法

8、1.3.3 客户端开发:wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的webservice是用什么语言写的,都将在客户端生成java代码.服务器端用什么语言编写的并不重要.wsimport.exe位于java_homebin目录下.例如:在cmd的窗口下执行wsimport可以看到常用参数为: -d - 将生成.class文件。默认参数。 -s - 将生成.java文件。 -p -将生成的类,放于指定的包下。 (wsdlurl) - http:/server:port/service?wsdl,必须的参数。示例:wsimport其他参数说明,

9、我们经常使用的参数为-d,-s,-p-d将会生成.class文件.示例:wsimport d . :8888/weather?wsdl-s将会生成.java文件.示例:wsimport s . :8888/weather?wsdl-p将生成的文件(.java或是.class修改成指定的包名)示例:wsimport -s . -p cn.itcast :8888/weather?wsdl示例:c:/ wsimport s . :8888/weather?wsdl注意:-s不能分

10、开,-s后面有个小点在cmd的窗口执行:在d盘ws的文件夹下看到客户端生成的java文件:将.java的文件整个包拷贝到客户端的工程下,然后使用weatherclient的客户端测试,测试代码如下:其中weatherserviceservice为服务器类其中weatherserver为接口类其中getweatherserverport为端口类型其中queryweather为调用的方法这四个参数在wsdl的使用说明书中都会看到。l 通常用于描述服务的名称,即new weatherserverservice ();-通常称为服务名。l 在元素内的即new weatherserverservice

11、().getweatherserverport (); - 通常称为服务端口。l 是服务接口名。即:weatherserver weatherserver = new weatherserverservice ().getweatherserverport ();在myeclipse上查看.wsdl文件:如图:可视化的webservice1.4:网络练习对于用户而言,用户是永远也感受不到你的程序具体是如何获取天气预报信息的.但他的确通过你的程序获取了天气信息,这对用户就已经足够了.但其实,对于程序员来说,程序员本身并没有做很多的工作,只是简单的调用了气象部门对外发布的服务从而获取了天气信息.w

12、ebservice的网络网址:1.4.1:手机归属地1:下面实现一个手机号归属地的查询:大家可以回家试下:(1):在e盘下,写一个phone.wsdl文件(从资料webservice提供资料网上手机+天气中获取),内容就是网络发布的使用说明书(2):,生成客户端代码注意:使用jaxws提供的wsimport生成客户端,这里先强调jaxws只能编译soap1.1的协议,不能编译soap1.2的协议的代码。(3):客户端调用代码1.4.2:天气预报下面实现一个天气预报的查询:(1):在e盘下,写一个weather.wsdl文件(从资料webservice提供资料网

13、上手机+天气中获取),内容就是网络发布的使用说明书(2):,生成客户端代码注意:使用jaxws提供的wsimport生成客户端,这里先强调jaxws只能编译soap1.1的协议,不能编译soap1.2的协议的代码。(3):客户端调用代码1.5:webservice的soap协议webservice只采用http post方式传输数据,不使用get方式; http post的contenttype为 application/x-www-form-urlencodedwebservice的contenttype为 text/xml;charset=utf-8 soap1.1 application

14、/soap+xml soap1.2soap1.1和soap1.2的对比:soap1.1请求方式,post请求contenttype的类型:text/xml;charset=utf-8传输数据:传输的xml格式的数据soap1.2 请求方式,post请求 contentty pe的类型:application/soap+xml传输数据:传输的xml格式的数据l webservice从数据传输格式上作了限定。webservice所使用的数据均是基于xml格式的。目前标准的webservice在数据格式上主要采用soap协议。soap协议实际上就是一种基于xml编码规范的文本协议。l soap 是一

15、种网络通信协议l soap即simpleobjectaccessprotocol,即简易对象访问协议l soap 用于跨平台应用程序之间的通信l soap 被设计用来通过因特网(http)进行通信l soap http+xml,其实就是通过http发xml数据l soap 很简单并可扩展支持面向对象l soap 允许您跨越防火墙l soap 将被作为 w3c 标准来发展1.6:使用myeclipse的web service explorer的查看webservice发送和接收的数据(xml)(1)选择:(2)输入使用说明书的地址(3)点击【go】,(4)点击queryweather()的方法,

16、填写参数【北京】,点击【go】,可以查询数据。(5)查询的结果为:(6)点击【source】可以看到webservice传递是xml格式的数据,但是由于没有使用客户端,所以我们无法看到http请求,那该怎么办呢?(7)结论:使用是可以通过webservice调用远程服务器的,但是对于工具,只支持soap1.1,不支持soap1.2,后续我们会测试这个工具在soap1.2上的使用。l http: 请求方式:get或postl get: 请求: contenttype =text/html;charset=utf-8 响应 : contenttype = text/html;charset=utf

17、-8l post: 请求: contenttype = application/x-www-form-urlencoded 响应 : contenttype = text/html;charset=utf-8l soap协议无法用浏览器监视,因为webservice没有通过浏览器l 使用myeclipse 的webservice explorer监视soap协议体l 使用tcp/ip monitor监视soap协议1.7:使用myeclipse提供的tcp/ip monitor,监控webservice(1)选择:(2)右键选择属性(3)填写对应的数据(4)这里需要将type=http,改成t

18、cp/ip,因为http表示表现层,而tcp/ip表示传输层例如:在地址栏中输入::9527/weather?wsdl选择http,产生wsdl文件:选择tcp/ip,产生wsdl文件(5)使用web service explorer中输入:9527/weather?wsdl,我们可以看到http和xml数据查询结果:(6)使用tcp/ip monitor的原理图,通过代理验证soap协议=http协议(post请求)+xml数据(总结):http协议和webservice的soap协议进行对比:http协议 * contenttyp

19、e的类型,application/x-www-form-urlencoded * 请求方式,get请求和post请求 * 传输数据::7777/weather?name=zhangsan&age=28webservice:soap协议 * soap1.1 * contenttype的类型:text/xml;charset=utf-8 * 请求方式,http请求的post请求 * 传输数据:传输的xml格式的数据 xml数据传输的优势: 优势1:xml传输数据可以被任何语言所识别 优势2:xml的数据更能体现数据结果 zhangsan28 * soap1.2 * c

20、ontenttype的类型:application/soap+xml * 请求方式,http请求的post请求总结:soap协议=http协议(post请求)+xml数据soap协议就是webservice使用的协议请求:http请求+xml数据:post /weather http/1.1host: :9527content-type: text/xml; charset=utf-8content-length: 354accept: application/soap+xml, application/dime, multipart/related, text/*user-

21、agent: ibm web services explorercache-control: no-cachepragma: no-cachesoapaction: connection: close 北京 响应:http请求+xml数据:http/1.1 200 oktransfer-encoding: chunkedcontent-type: text/xml; charset=utf-8date: wed, 30 apr 2014 16:13:40 gmt5e93阴转晴0这里我们可以看出:soap协议体包含下列元素必需有 envelope 元素,此元素将整个 xml 文档标识为一条 so

22、ap 消息可选的 header 元素,包含头部信息必需有body 元素,包含所有的调用和响应信息 可选的 fault 元素,提供有关在处理此消息所发生错误的信息1.8:使用webservice发布对象(javabean)使用webservice发布一个javabean对象,并同时完成使用webservice获取网络发布的天气预报信息,将天气预报中的某个信息封装到javabean中,使用自己程序发布的webservice发布,客户端再进行调用。1.8.1 服务端代码:(1)将webservice获取网络天气预报的代码拷贝到服务端的程序中(2)即执行(3)生成代码:(4)使用生成的代码,调用网络的

23、数据服务,返回天气情况,代码如下:/* * 查询公网天气情况客户端 */public class querywebxmlclient public list querywather(string cityname)/获取视图,通过端口号,查询接口weatherwebservicesoap weatherwebservicesoap = new weatherwebservice().getweatherwebservicesoap();/查询天气list results = weatherwebservicesoap.getweatherbycityname(cityname).getstri

24、ng();for(string r:results)system.out.println(r);return results;/* * 测试封装的方法! */public static void main(string args) querywebxmlclient client = new querywebxmlclient();list list = client.querywather(北京);if(list!=null & list.size()0)for(string s:list)system.out.println(s);(5)在服务端上创建一个result对象,封装天气情况信息

25、和温度,代码如下:(6)封装服务器类,返回result对象,同时发布服务端程序其中resultlist.get(5)和resultlist.get(6)表示:1.8.2 客户端代码:(1)在cmd执行(2)生成客户端的代码:这里大家注意:同时result的javabean对象也被放置到了客户端(3)使用客户端代码进行测试:1.9:webservice的注解开发如何才可以修改wsdl文件的内容?使用webservice的注解。 webservice-定义服务,在public class上边l name属性:接口名称l portname属性:端口名称l servicename属性:定义服务器端的类

26、l targetnamespace属性:目标包文件 webmethod-定义方法,在公开方法上边l webmethod对所有非静态的公共方法对外暴露为服务.l 对于静态方法或非public方法是不可以使用webmethod注解的. l 对public方法可以使用webmethod(exclude=true)定义为非对外暴露的服务。 webresult-定义返回值,在方法返回值前边l 对方法的返回值进行配置 webparam-定义参数,在方法参数前边l 对方法的参数进行配置大家可以试试:1:通过webservice的注解,可以更加形像的描述web服务。从而生成wsdl文档。2:当修改了webse

27、rvice注解之后,同时会影响客户端生成的代码。3:调用的方法名和参数名也发生了变化。4:请同学们给自己的服务类加上注解以后再次通过wsimport生成源代码然后调用。看看会发生什么?(1):测试代码:(2):生成wsdl的使用说明书:(3):使用客户端代码:(4)测试客户端代码:1.10:使用代码编写webservice的客户端(1):删除客户端代码,只保留接口mywebservice和javabean文件result对象,我们使用代码编写的方式,来开发客户端如图:(2):客户端代码,可以使用以下代码进行测试。1.11:使用jax-ws发布web工程jax-ws开发的webservice 发

28、布至web容器需要使用jax-wsri(扩展实现), /下载jax-wsri最新版本,本教程使用jaxws-ri-2.2.8版本。1、创建java web 工程2、将jaxws-ri-2.2.8下的jar拷贝至java web工程的lib目录3、编写服务端代码,服务端代码与使用jax-ws开发普通java工程一致4、使用wsgen 生成wsdl5、在web-inf下创建sun-jaxws.xml,内容见备注6、修改web.xml文件7、访问tomcat下的web工程即可(http:/ip:端口/工程目录/weather)注意:web.xml中serv

29、let解析的路径要和sun-jaxws.xml中的一致,如例子中都配置为“/weather”1.11.1 服务端操作(1)创建web工程(2)导入jaxws-ri-2.2.8下的所有jar包(3)将之前我们写的java工程实现发布webservice的代码拷贝到web项目中,如图:(4)使用wsgen生成wsdl文件,在cmd下操作。wsgen生成wsdl:1、cmd进入命令行2、cd 找到项目工程目录3、执行wsgen格式为:wsgn wsdl cp -r -cp classpath(注意都是相对与当前目录)-r wsdl路径(注意都是相对与当前目录)例如生成soap1.1如下:wsgen

30、-wsdl:soap1.1 -classpath webroot/web-inf/classes -r webroot/web-inf/wsdl cn.itcast.ws.jaxws.server.weatherserver 生成soap1.2如下:wsgen -wsdl:xsoap1.2 -extension -classpath webroot/web-inf/classes -r webroot/web-inf/wsdl cn.itcast.ws.jaxws.server.weatherserver注意:在项目的webroot/web-inf/下创建wsdl文件夹cmd下执行的代码:ws

31、gen -wsdl:soap1.1 -classpath webroot/web-inf/classes -r webroot/web-inf/wsdl cn.itcast.ws.jaxws.server.weatherserverwsgen -wsdl:soap1.1 -classpath webroot/web-inf/classes -r webroot/web-inf/wsdl cn.itcast.server.weatherserver(5)在web项目上生成的代码:(6)在web-inf下创建sun-jaxws.xml文件,文件内容如下: (7)在web.xml中配置1.11.2

32、客户端操作(1):创建java工程(2):在cmd的窗口下,执行:代码如下:wsimport -s . file:/d:workspacews_g_jaxws_server_webwebrootweb-infwsdlweatherserverservice.wsdl(3):客户端测试代码:(4)如果抛出异常,则需要修改服务端以下文件的内容:将:的配置按照http:/localhost:8080/ws_g_jaxws_server_web/weather?wsdl中的内容修改成:如果执行:此时不会抛出异常:因为:通过http的方式调用使用说明书的代码是:1.12:使用jax-ws区分soap1.

33、1和soap 服务端操作(1)创建web工程(2)导入jaxws-ri-2.2.8下的所有jar包(3)将之前我们写的java工程实现发布webservice的代码拷贝到web项目中,如图:(4)使用wsgen生成wsdl文件,在cmd下操作。wsgen生成wsdl:1、cmd进入命令行2、cd 找到项目工程目录3、执行wsgen格式为:wsgn wsdl cp -r -cp classpath(注意都是相对与当前目录)-r wsdl路径(注意都是相对与当前目录)例如生成soap1.1如下:wsgen -wsdl:soap1.1 -classpath webroot/web-

34、inf/classes -r webroot/web-inf/wsdl cn.itcast.ws.jaxws.server.weatherserver 生成soap1.2如下:wsgen -wsdl:xsoap1.2 -extension -classpath webroot/web-inf/classes -r webroot/web-inf/wsdl cn.itcast.ws.jaxws.server.weatherserver在项目的webroot/web-inf/下创建wsdl文件夹cmd下执行的代码:wsgen -wsdl:xsoap1.2 -extension -classpath

35、 webroot/web-inf/classes -r webroot/web-inf/wsdl cn.itcast.ws.jaxws.server.weatherserver(5)在web项目上生成的代码:(6)在web-inf下创建sun-jaxws.xml文件,文件内容如下: 这里大家可以看下soap1.1和soap1.2的对比:sun-jaxws.xml(soap1.1) sun-jaxws.xml(soap1.2) (7)在web.xml中配置1.12.2 客户端操作(1):创建java工程(2):在cmd的窗口下,执行:代码如下:wsimport -s . file:/d:work

36、spacews_g_jaxws_server_webwebrootweb-infwsdlweatherserverservice.wsdl这里注意:和soap1.1相比,这里要添加:因为wsimport是jdk的命令,这里只支持soap1.1,要支持soap1.2,需要添加-extension(3):客户端测试代码:(4)如果抛出异常,则需要修改以下文件的内容:将:的配置按照http:/localhost:8080/ws_g_jaxws_server_web/weather?wsdl中的内容修改成:如果执行:此时不会抛出异常:因为:通过http的方式调用使用说明书的代码是:1.12.3 总结:

37、soap1.1和soap1.2的对比(1)生成的wsdl文件soap1.1生成的wsdl文件:soap1.2生成的wsdl文件(2)使用myeclipse的web service explorer工具测试该工具只支持soap1.2结果:看不到输入的参数1.13:使用webservice远程上传文件(附加,可看视频)(1)分析:(2)实现服务器端的代码:package cn.itcast.server;import java.io.file;import java.io.filenotfoundexception;import java.io.fileoutputstream;import ja

38、va.io.outputstream;import javax.jws.webservice;import javax.xml.ws.endpoint;webservicepublic class uploadserver /提供1个非静态的公用方法/* * 2个参数: * 参数1:传递上传的文件名参数2:byte类型的数组(存放文件的内容) * throws filenotfoundexception * return:string类型 */public string upload(string filename,byte b) throws exception/使用输出流的方式,将文件写到

39、指定的f盘下的ws包中outputstream out = new fileoutputstream(new file(f:/ws/+filename);out.write(b);out.close();return 恭喜你!上传的文件名是+filename+,已成功上传;public static void main(string args) /发布服务endpoint.publish(00:7777/two, new uploadserver();(3)使用wsimport生成客户端代码,实现客户端的代码package cn.itcast.server;i

40、mport java.io.file;import java.io.fileinputstream;import java.io.ioexception;import java.io.inputstream;public class main public static void main(string args) throws exception_exception, ioexception /文件名string filename = phone.wsdl;/使用输入流读取这个文件,将文件读到字节数组中inputstream in = new fileinputstream(new file

41、(e:/+filename);/定义一个字节的数组byte b = new bytein.available();/将输入流的文件,读到字节中in.read(b);in.close();/调用服务器的方法uploadserver uploadserver = new uploadserverservice().getuploadserverport();/* * 参数1:传递上传的文件名 参数2:byte类型的数组(存放文件的内容) */system.out.println(uploadserver.upload(filename, b);(4)总结:不一定只能使用javaweb的方式完成文件

42、上传,同时还可以使用webservice的方式完成文件上传,2个独立的程序之间完成文件上传。(5)大家可以参考视频资料:二:webservice第二天学习目标:1、cxf环境配置2、cxf开发java工程3、cxf与spring集成2.1:cxf介绍2.1.1 cxf的介绍apache cxf = celtix + xfire支持多种协议:1)soap1.1,1,22)xml/http3)corba(common object request broker architecture公共对象请求代理体系结构,早期语言使用的ws。c,c+,c#) 4)并可以与spring进行快速无缝的整合5)灵活

43、的部署:可以运行有tomcat,jboss,jetty(内置),ibmws,beaws上面。2.1.2 cxf的安装和配置:直接解压到某个盘下就可以使用:2.1.3 cxf的环境变量的配置环境变量: java_home, cxf_home path = %java_home%bin;%cxf_home%bin; classpath=.;%cxf_home%libcxf-manifest.jar2.2:cxf创建一个java工程2.2.1 服务端程序:(1)创建一个java工程(2)将第一天查询天气信息的代码拷贝到这个项目中,例如代码:(3)导入jar包(目录下全部的jar包)(4)cxf是面向

44、接口的编程,创建接口weatherserverinterface(5)创建类weatherserver实现以上的接口(6)创建querywebxmlclient调用网络天气预报的服务(7)result的javabean对象,返回封装的结果集(8)使用jaxwsserverfactorybean发布cxf的服务端附录:服务器端发布的类l serverfactorybeanl jaxwsserverfactorybean(建议使用)2个对象,都可以发布服务端,但是我们建议使用jaxwsserverfactorybean,因为它生成的wsdl文件更加规范。服务器端的拦截器:/ 输入拦截器jaxwss

45、erverfactorybean.getininterceptors().add(new loggingininterceptor();/ 输出拦截器jaxwsserverfactorybean.getoutinterceptors().add(new loggingoutinterceptor();目的是用来输出响应的头部信息,可以看到soap协议的格式(http请求+xml数据):例如:soap1.1:id: 10address: :9999/weatherencoding: utf-8http-method: postcontent-type: text/xml; charset=utf-8headers: accept=text/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论