web service.docx_第1页
web service.docx_第2页
web service.docx_第3页
web service.docx_第4页
web service.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

WebService的功能(是什么)WebService是一种跨编程语言和跨操作系统平台的远程调用技术所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统(采用交互提问的方式来加深大家对此技术的理解)。远程调用技术有什么用呢?商场的POS机转账调用的转账方法的代码是在银行服务器上,还是在商场的pos机上呢?什么情况下可能用到远程调用技术呢?例如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA应用。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。除了WebService外,常见的远程调用技术还有RMI(Remote method invoke)和CORBA,由于WebService的跨平台和跨编程语言特点,因此比其他两种技术应用更为广泛,但性能略低。面试webservice时的总体回答思路:1.是跨语言的远程调用技术,把对象的方法让远程可以调用 2.soap协议3.服务端要提供wsdl文件,wsdl文件的作用 4.客户端调用原理,5.服务器端实现原理1.介绍远程调用时,还是画一个图给人的印象更直接,接下来直接用下面的例子和wsimport做一个远程调用的例子,先不管理论:1)使用java6的Webservice支持API编写和发布一个WebService服务,并把这个服务放在一个学生的机器上运行。写这个服务程序时要注意类前必须有WebService和SOAPBinding这两个注解,并且WebService注解中一定要用到targetNameSpace参数,代码如下:import javax.xml.ws.*;import javax.jws.*;import javax.jws.soap.*;WebService(targetNamespace=http:/localhost:7070/itcast) /试试将这里的itcast改名为it315。SOAPBinding(style = SOAPBinding.Style.RPC)public class HelloService public static void main(String args)Endpoint.publish(http:/localhost:7070/itcast,new HelloService();WebMethodpublic void sayHello()System.out.println(hello);2. 接着调用/zh_cn/index.aspx中罗列的得到手机号的webservice测试一下,更有力地说明了WebService用武之地。3.本页PPT的总体思路:前面两段是在纵向解释Webservice自己是什么,第三段则是在横向比较Webservice与其他同类的技术,就像生活中的许多实例一样,某领域的一个专家不仅要能说清出了自己的产品,还要对同行的产品也有所了解,知己知彼,才能更加凸显自己确实对Webservice这个领域有深入的研究和认识。待深入研究问题:经常有人说,WebService比较慢,我想是因为没有把创建Service对象前面的工作缓存吧!如果仅仅是进行SOAP调用,性能应该不低。例如,让客户端的代码对象只创建一次,然后一直缓存。WebService的调用原理WebService使用SOAP协议实现跨编程语言和跨操作系统平台WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议(simple object access protocol,简单对象访问协议) 。SOAP协议 = HTTP协议 + XML数据格式 SOAP协议是基于HTTP协议的,两者的关系就好比高速公路是基于普通公路改造的,在一条公路上加上隔离栏后就成了高速公路。商店的服务员只要收到了钱就给客户提供货物,商店服务员不用关心客户是什么性质的人,客户也不用关心商店服务员是什么性质的人。同样, WebService客户端只要能使用HTTP协议把遵循某种格式的XML请求数据发送给WebService服务器, WebService服务器再通过HTTP协议返回遵循某种格式的XML结果数据就可以了,WebService客户端与服务器端不用关心对方使用的是什么编程语言。HTTP协议和XML是被广泛使用的通用技术,各种编程语言对HTTP协议和XML这两种技术都提供了很好的支持,WebService客户端与服务器端使用什么编程语言都可以完成SOAP的功能,所以,WebService很容易实现跨编程语言,跨编程语言自然也就跨了操作系统平台。这里提到了SOAP协议,就一定要做个试验,来增加学员的感性认识,学员才能真正理解上面精辟的理论总结,试验步骤如下:1)接着前面的实验,使用浏览器访问http:/localhost:7070/itcast?wsdl,可以看到一个wsdl文件内容(这个wsdl文件描述了Webservice服务的有关信息,客户端根据这个信息去调用服务)。接着使用MyEclipse附带的WebService Explorer去调用上面发布的Webservice服务,尽管在最终结果的status视窗中可以通过”source”超链接查看WebService调用时的请求和响应消息的实体内容,但这种方式仍然不是很直观。2)画图解释清楚代理监控器程序的运行原理,然后使用Myeclipse附带的Tcp Monitor来检测Webservice调用过程的消息传输情况,监听的类型要设置为Tcp类型,它就不会修改HTTP请求头中的Host字段, 最终使得WSDL文件中的绑定地址还是我们访问wsdl文件时的代理地址(WebService服务器程序是根据Http消息中的Host头字段来生成绑定地址信息) 。如果监听的类型设置为HTTP类型,它会修改Host头字段为目标地址,这样导致WSDL文件中的绑定地址又成了目标地址最终导致WebService调用过程跨过监听程序而无法实施监听。另外,意外发现在Tcp Monitor监听的地址上单击鼠标右键,发现还可以修改请求消息后再发发送请求,这个功能真好!看来以后要多多到处单击鼠标右键试试,说不定就会有意外惊喜。再另外,MyEclipse的TcpMonitor有一个显示头的菜单项,可以显示出http的请求头和响应头信息。3.在myeclipse的工具栏上有一个lauch web service explorer的按钮,打开web service explorer窗口后,要单击该窗口左上角的wsdl page按钮,这样不必自己编写WebService客户端程序就可以WebService服务进行测试调用了,测试下前面两个例子。WebService调用之前的工作 WSDL文件好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService客户端要调用一个WebService服务,首先要知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService服务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。WSDL(webservice description language)是基于XML格式的,它是WebService客户端和服务器端都能理解的标准格式,其中描述的信息可以分为what,where,how等部分!WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:注册到UDDI服务器,以便被人查找直接告诉给客户端调用者,例如,在自己网站给出信息或邮件告诉。提问:客户端首先要知道服务的信息,然后再来调用服务。服务的信息用什么规范进行说明,调用服务采用什么协议。Wsdl文件中的web服务的名称空间和连接的远程服务器本来相当于一个商标的产品不一定只在自己的公司卖的道理,wsdl文件中包含了连接服务的地址和名称空间两个东西。wsdl文件用于描述对外的一项服务,其中的元素中包含多个元素,元素中又包含多个元素,每个元素又包含一个和一个元素,元素和元素的内容分别指向前面定义的一个元素。每个元素对应一个Java类,其中的每个元素对应Java类中的一个方法。wsdl文件的组成,主要包括三个方面的内容:what(服务是什么),where(服务在哪里),how(怎么调用服务)WebService的工作过程WebService的开发应用WebService开发可以分为服务器端开发和客户端开发两个方面:把公司内部系统的业务方法发布成WebService服务,供远程合作单位和个人调用。(借助一些WebService框架可以很轻松地把自己的业务对象发布成WebService服务,Java方面的典型WebService框架包括:axis,xfire,cxf等,javaee服务器通常也支持发布WebService服务,例如JBoss。这框架应用不是学习的重点,看看相关的技术手册都很轻松地掌握,关键还是要了解WebService的工作原理。)调用别人发布的WebService服务,大多数人从事的开发都属于这个方面,例如,调用天气预报WebService服务。(使用厂商的WSDL2Java之类的工具生成静态调用的代理类代码;使用厂商提供的客户端编程API类;使用SUN公司早期标准的jax-rpc开发包;使用SUN公司最新标准的jax-ws开发包。)例如,参照axis的userguide目录下的第一个例子写客户端,就是使用厂商提供的编程API类。WebService的客户端编程原理代理图我们给这个类WebService客户端API传递wsdl文件的url地址,这些API就会创建出底层的代理类,我调用这些代理,就可以访问到webservice服务。代理类把客户端的方法调用变成soap格式的请求数据再通过HTTP协议发出去,并把接收到的soap数据变成返回值返回。我们平常写的程序都是在同一个程序中调用其他对象的方法,而webservice是怎样实现调用其它计算机中的对象的方法的呢?其基本原理是在客户端程序的本地有一个代理对象,这个代理对象和远程对象具有相同的方法声明,这个代理程序不用我们自己编写,工具可以帮我们生成。客户端程序调用本地代理对象的方法时,代理对象会通过某种网络传送技术去联系远程的程序,远程程序再调用代理对象请求的相应本地对象的方法,然后将方法执行的结果返回给客户端代理程序。远程调用技术就是要解决客户端如何将请求信息传送给远程的程序,远程的程序如何将结果回应给客户端,并且其实现技术对开发人员来说是透明的,即不需要开发人员自己的考虑和实现这些细节。写多种客户端程序,每个客户端程序用一个单独的工程,如jaxrpcclient(分别用axis和xfire的实现),staticstub(分别用axis和xfire的实现),axisclient(包括代理与DII),xfireclient(包括代理与DII),jaxwsclient,wsstaticstub。WebService客户端编程工具生成静态代理类方式xfire的WSGen还需要额外导入ant.jar包axis的WSDL2java写批处理或直接在eclipse中运行这个类jdk6的wsimportcxf的每个工具的那么多内部细节,我就没有时间去深入研究了,但是,我对webservice的原理和这些工具的共同应用方式进行了很好的总结,所以,随便来个工具,我基本上都能随时玩起来。在写批处理的过程中,如果%1参数代表的是文件,那么最好是用%1来表示,这样可以解决文件路径中有空格的问题。使用axis的wsdl2java时,客户端程序如何调用,是参看userguide下的example6知道的。生成的静态代理类内部其实还是包装了jax-rpc 或jax-ws api。使用cxf的步骤:1.搜索cxf,然后下载cxf开发包,解压后的文档中只有api类的doc,所以,还得在网站上读userguide和faq,并且多切换点击几次看到的内容不一样。2.先试试其客户端的功能,在bin目录中看到wsdl2java.bat,看调用的是哪个java类,然后再eclipse中执行这个类,看提示信息,就知道要传递哪些命令参数了。另外,在cxf的官网中,也能看到wsdl2java命令的选项的帮助。设置的参数信息如下:-d client -p cn.client http:/localhost:7070/itcast?wsdl运行时出了问题,要使用较新的jax-ws版本,覆盖jdk的endorsed目录。3.生成的客户端代码有误,可能是我的jdk6中的jax-ws版本较低的缘故吧,删除掉这个错误方法就可以继续用了。按老黎的提醒,把新版本的jax-ws.jar包拷贝到myelcipse的jdk的额外jar包中,并将它们移动到最前面,这个编译器问题就解决了。对于获取手机号的例子,一下子出现了多个类,这些类之间的关系最好是参看wsdl来推敲:往往对应了工厂类(Service类)的名字,其中的 说明了接口类的名称。有空再看看wsimport c:a.wsdl生成的java源代码是怎样的,这时候程序内部的wsdl的url是什么?WebService客户端编程动态代理类方式使用jax-rpc第一步是创建xxx.Service实例对象调用getPort返回代理,客户端的接口要实现remote接口,因为客户端代理是用java技术生成的,java生成的远程调用的代理必须实现remote接口,即我实现的代理靠的是java的remote技术。使用jax-ws第一步就是创建出javax.xml.ws.Service实例对象jax-ws是代替jax-rpc的webservice标准,如果遇到还在使用jax-rpc,要知道是什么意思就可以了。,jaxrpc api犹如jdbc api,axis和xfire的实现犹如jdbc driver包,在编程时只要jaxrpc.jar即可,运行时必须axis.jar或xfire.jar,通过ServiceFactory.SERVICEFACTORY_PROPERTY属性来选择具体的实现类客户端程序并不包含指定连接远程服务器地址的途径,只包含指定wsdlURL和名称空间这两个参数。这些api为什么接受的参数都是wsdl文件的路径,而不是服务绑定的地址呢?这是因为解耦,假设服务路径变了,wsdl文件中的信息随主改变,客户端程序根据wsdl文件就知道要去新地址去服务,不需要修改源码。客户端工程要与服务器端工程完全独立创建,并且编写客户端程序时,不要从服务器上拷贝任何东西,包括接口类,这才能体现异构平台的调用。客户端的接口中的方法名与服务器端的接口的方法名必须一样,但参数的类型可以不完全一样(必须兼容,例如,整数可以用字符串方式传递,但字符串中的内容必须兼容整数) 客户端程序获取接口实例的代码可以抽取成一个方法或工具类,该方法接收一些相应参数,返回接口的代理实现。用jax-rpc进行远程调用时,虽然服务器端的接口是普通接口,但客户端接口必须继承remote接口(但是用xfire自带的客户端api时,接口可以不继承remote接口,并且接口的名称可以与服务器不一致),这是因为java生成的远程调用代理对象有此要求,这与webservice本身没有关系,而是java在远程调用实现上的一个技术要求而已。webservice可以返回复杂对象类型,从wsdl文件的描述上可以推测出,这个复杂类型只是描述有哪些属性而已,也就是只描述数据而已,不能描述方法,所以,如果服务器返回一个File对象,客户端会生成一个File类,该File类中只有原始File类中的get和set方法。直接使用jws文件和jax-rpc的代理调用方式做webservice的实验中遇到的问题:1. 必须设置ServiceFactory.SERVICEFACTORY_PROPERTY属性2. 产生Service时必须指定wsdl文件的url地址3. 端口号和服务名的QName必须由两部分组成。客户端程序总是报告方法的参数类型不一致,实在找不出错误来,结果重新启动程序后就好了。使用jax-ws开发客户端时,那个Port对应的接口类不能随便自己写,必须用wsimport工具生成,并且要把所有生成的.java源文件都带上。WebService客户端编程动态方法调用(DII)使用jax-rpc第一步是创建xxx.Service实例对象调用getCall返回Call对象,call的invoke实现动态调用。使用jax-ws第一步就是创建出javax.xml.ws.Service实例对象jax-ws的DII比较麻烦,看了看那个dispatch的例子,暂时不想花时间去专研了WebService客户端编程用Socket编程方式调用WebService框架的底层实现原理技术实现原理:各类WebService框架的本质就是一个大大的Servlet,当远程调用客户端给它通过http协议发送过来soap格式的请求数据时,它分析这个数据,就知道要调用哪个java类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成soap格式的数据,通过http响应消息回给客户端。只要把WebSerive框架做成一个Servlet,放在Tomcat中,是不是就具备Tcp服务器和接受客户端网络访问的功能了呢?客户端访问这个Servlet,这个Servlet的功能充当WebService框架,客户端说的SOAP话是基于http协议的。由于webservice是基于http协议的,所以webservice服务器端框架通常就是一个servlet程序,该servlet程序接收客户端的xml格式的请求,然后根据请求内容调用本地对象的方法,再将结果封装成xml格式返回给客户端。如果传递的参数是复杂对象类型,这就又涉及到了xml2object和object2xml了。使用任何框架进行配置时,都应该思考一个问题:webservice框架调用服务类时,是只创建服务类的一个对象,还是每次创建一个对象,带着问题去找配置答案。服务器工程也分成多个,分别是axisserver,xfireserver,jbossserver,wsriserver(参考实现,jdk6serverAxis步骤:1.首先直接把axis包中webapps目录下的axis例子程序复制到tomcat中,就配置好了axis的服务器端环境2.写好一个服务类,将.java复制一份,改名为jws后介绍一下jws的即时发布技术。3.读帮助文档,参照docs目录下的userguide目下中的第三个例子,获得一份wsdd文件,然后进行修改。4.使用adminclient进行发布,需要使用set classpath=%classpath%;和拖动的方式逐一加入各个jar包,更好的办法是编写一个批处理,设置axis_lib=,然后设置classpath,然后用%1 %2 %3 %4等执行adminclient。更好的方式是将所有jar包导入到eclispe中,再eclipse中运行adminclient将更简捷)5.给大家看发布后的结果,也就是生成了server-config.wsdd文件,要重新启动应用程序,才会生效。6.直接访问axis的核心Servlet映射的URL地址(去掉*),可以看到部署的所有服务,看wsdl文件,说明wsdl文件的作用。7.使用jdk6自带的wsimport生成客户端,报告错误,然后修改server-config.wsdd文件,在service中增加style=document属性,重启动程序再次执行,成功搞定。比较两次的wsdl文件不相同。演示将wsdl保存到本地也是可以的,说清楚只要得到wsdl文件或其url地址,都可以知道对方的服务如何调用了。(以前用myeclipse的tcp monitor进行监视时,由于采用的是HTTP监视类型,所以只能是先把wsdl文件拿到手,然后改其中的连接信息,修改完后将这个文件放在tomcat服务器下的一个目录中进行访问,这倒是更好地说清楚了WSDL文件与SOAP的关系)jws的一些问题:1. jws文件不能采用utf-8编码2. 学员们在myeclipse启动tomcat,jws文件无法完成编译,直接手工启动tomcat则没问题。adminclient的一些问题:1.使用adminclient工具进行部署时,服务类要提前放在web项目的WEB-INF/classes目录中。2.如果发布到的webapp的路径不是/axis,该怎么做?看adminclient打印出的错误信息,接着单独执行adminclient看提示,解释下adminclient的工作方式即可搞定。第7步正好可以根据上面的错误来引出soap消息的几种格式,推荐看黎活明的ejb书。soap规定了如何将程序的数据和调用表示为xml格式,其格式可以分为rpc格式、文档格式和消息格式等,较常见的是rpc格式和消息格式,rpc格式就是将xml中的数据转换成java对象后处理和将java对象转换成xml数据后传输。消息格式就是程序直接接收和发送xml对象,例如程序的方法定义为:public Document method(Document body),该方法接收的参数和返回值都是Document对象。xfire步骤:1.参照手册做第一个webservice服务器端例子,可以用config初始化参数来修改配置文件的位置,文件路径是相对当前web.xml文件的位置。1)编写服务类 2)将服务类注册和部署成WebService2.针对xfire项目,访问/mywebapp/services,可以验证xfire是否配置正常。(注:讲课时一定要罗列实施步骤,这样的效果就会很好!)用jax-ws api调用xfire的web服务时,出现了异常,这可能是xfire内部的bug,我们不用去理会jax-ws ri在Tomcat6中发布webservice需要单独下载jax-ws2.1的包,jdk6.0自带的是jax-ws2.0看jax-ws ri的帮助文档的sample说明,然后使用fromjava这个例子程序在tomcat下进行测试将参考实现的所有jar放置在web项目下的lib目录中,借助myeclipse生成sun-jaxws.xml文件jboss发布webservicejboss只能用jdk1.5在jboss中发布webservice,直接把一个java类按照servlet方式在web.xml进行配置,然后访问配置的url地址,并在该地址后加上?wsdl,即可看到wsdl文件了。刚开始jboss使用的jdk是jdk1.6,发布和访问wsdl文件都没问题,但使用wsimport生成客户端进行调用时总是报告xml解析错误,换成axis的wsdl2java生成客户端时也报同样的错误,最后把jboss使用的jdk是jdk1.5,没有作任何修改,再运行原来的wsimport和wsdl2java生成的客户端程序,结果都很正常。讲课时也按照这个顺序,以便让学员们真实感受到在软件开发领域经常会存在工具冲突的问题。最后,用wsgen生成客户端代理,做试验不通(可能又是jdk版本的问题,换成jdk1.5后也不行),以后看看对于其他方式发布的webservi

温馨提示

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

评论

0/150

提交评论