1具备的相关知识点
Webservice
Xml extending marking Language可扩展的标记语言(DTD、Schema,stax)
SOAP-Simple Object Access Protocal
Java-ws(java api xml for webservice)
CXF REST axis xfire metro
SOA Service Oriented Architecture
SOA 不是Web服务?
在理解SOA和Web服务的关系上,经常发生混淆。根据2003年4月的Gartner报道,Yefim V. Natis就这个问题是这样解释的:“Web服务是技术规范,而SOA是设计原则。特别是Web服务中的WSDL,是一个SOA配套的接口定义标准:这是Web服务和SOA的根本联系。”从本质上来说,SOA是一种架构模式,而Web服务是利用一组标准实现的服务。Web服务是实现SOA的方式之一。用Web服务来实现SOA的好处是你可以实现一个中立平台,来获得服务,而且随着越来越多的软件商支持越来越多的Web服务规范,你会取得更好的通用性。
2WebService功能
WebService是一种跨编程语言和跨操作系统平台的远程调用技术,异构平台的交互。.net、php、python、perl
所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统
远程调用技术有什么用呢?商场的POS机转账调用的转账方法的代码是在银行服务器上,还是在商场的pos机上呢?
什么情况下可能用到远程调用技术呢?例如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA应用。
举例:
Amazon的云计算服务总称为AmazonWebServices(AWS,Amazon WEB服务),迄今它包括四种主要的服务:Simple Storage Service (S3,一种简单的存储服务);Elastic Compute Cloud (EC2,务弹性可扩展的云计算服器);Simple Queuing Service(一种简单的消息队列);以及仍处在测试阶段的SimpleDB(简单的数据库管理)。换句话说,Amazon现在通过互联网提供存储、计算处理、消息队列(message queuing)、数据库管理系统等“即插即用”型的服务。
这些服务所需要的巨大的后台IT基础架构是Amazon的数据中心。不过,用户只需要对自己消费了的服务进行付费:S3存储是每月每GB为15美分,根据配置不同,EC2服务器容量是每小时10-80美分。
2.1主要优势
所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。
除了WebService外,常见的远程调用技术还有RMI(Remote method invoke)和CORBA,由于WebService的跨平台和跨编程语言特点,因此比其他两种技术应用更为广泛,但性能略低。
Dll动态链接库。
名词解释:
CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范。或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。
3快速开发一个基于Jws的Webservice的项目
3.1服务器端的建立
3.1.1创建接口
SEI-Service Endpoint Interface
3.1.2创建实现类
SIB-Service Implementation Bean
接入点接口
3.1.3开启服务
可以生成一个wsdl的文件在服务地址中
targetNamespace目标命名空间
3.2客户端的建立
问题:依赖于接口?
3.3wsimport的使用
3.4wsdl的简单讲解
包含五大部分
types:用来定义访问的类型
访问的所有的类型都会生成对应java对象代码。
message:SOAP
有多少个方法就有两倍多的消息。
portType:指明服务器的接口,并且通过operation绑定相应的in和out的消息:其中in表示参数,out表示返回值
binding:指定传递消息所使用的格式
消息以什么样的形式呈现给客户。有两种形式 document rpc
早期SoapMessage Encode方式。现在用literal
service:指定服务所发布的名称
3.5soap的使用和TCPMon
arg0和arg1不清楚代表什么含义?
3.6传递对象数据
3.7代码优先还是协约优先
wsdl是契约
代码优先
针对java编程,只要了解annotation。自动生成,有些不会自动生成,就需要改。
契约优先
服务类型
基于实体的服务·
基于功能的服务·(天气预报、发Email)
基于流程的服务(业务流程 (BPM)ERP)工作流程(JBPM)
4XML的DTD和Schema
4.1DTD简介
4.2Schema
schema出现的目的是通过一个更加合理的方式来编写xml的文件(基于xml语法的方式)
schema可以使用命名空间来支持多个名称相同的元素
schema可以很好的完成对java或者所有对象的修饰并且提供了大量的数据类型
5WebService调用原理
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很容易实现跨编程语言,跨编程语言自然也就跨了操作系统平台。
6WebService调用之前的工作
WSDL文件
1.WSDL(webservice description language)是基于XML格式的,它是WebService客户端和服务器端都能理解的标准格式,其中描述的信息可以分为what,where,how等部分!
2.WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。
3.WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:
a)注册到UDDI服务器,以便被人查找
b)直接告诉给客户端调用者,例如,在自己网站给出信息或邮件告诉。
UDDI是统一描述、发现和集成(Universal Description,Discovery and Integration)的缩写。
7WebService工作过程
SOAP, WSDL, UDDI
WSDL,UDDI和SOAP是SOA基础的基础部件。WSDL用来描述服务;UDDI用来注册和查找服务;而SOAP,作为传输层,用来在消费者和服务提供者之间传送消息。SOAP是Web服务的默认机制,其他的技术为可以服务实现其他类型的绑定。一个消费者可以在UDDI注册表(registry)查找服务,取得服务的WSDL描述,然后通过SOAP来调用服务。
8WebService开发应用
●WebService开发可以分为服务器端开发和客户端开发两个方面:
1.把公司内部系统的业务方法发布成WebService服务,供远程合作单位和个人调用。(借助一些WebService框架可以很轻松地把自己的业务对象发布成WebService服务,Java方面的典型WebService框架包括:axis,xfire,cxf等,java ee服务器通常也支持发布WebService服务,例如JBoss。这框架应用不是学习的重点,看看相关的技术手册都很轻松地掌握,关键还是要了解WebService的工作原理。)
2.调用别人发布的WebService服务,大多数人从事的开发都属于这个方面,例如,调用天气预报WebService服务。(使用厂商的WSDL2Java之类的工具生成静态调用的代理类代码;使用厂商提供的客户端编程API类;使用SUN公司早期标准的jax-rpc开发包;使用SUN公司最新标准的jax-ws开发包。)
9WebService客户端编程原理
●代理图
1.我们给这各类WebService客户端API传递wsdl文件的url地址,这些API就会创建出底层的代理类,我调用这些代理,就可以访问到webservice服务。代理类把客户端的方法调用变成soap格式的请求数据再通过HTTP协议发出去,并把接收到的soap数据变成返回值返回。
10WebService客户端编程
10.1工具生成静态代理类方式
●xfire的WSGen
还需要额外导入ant.jar包
●axis的WSDL2java
写批处理或直接在eclipse中运行这个类
●jdk6的wsimport
●cxf的…
●Metro
10.2动态代理类方式
1.使用jax-rpc
a)第一步是创建xxx.Service实例对象
b)调用getPort返回代理,客户端的接口要实现remote接口,因为客户端代理是用java技术生成的,java生成的远程调用的代理必须实现remote接口,即我实现的代理靠的是java的remote技术。
2.使用jax-ws
a)第一步就是创建出javax.xml.ws.Service实例对象
10.3动态方法调用(DMI)
1.使用jax-rpc
a)第一步是创建xxx.Service实例对象
b)调用getCall返回Call对象,call的invoke实现动态调用。
2.使用jax-ws
a)第一步就是创建出javax.xml.ws.Service实例对象
10.4用Socket编程方式调用
11WebService框架的底层实现原理
●技术实现原理:
1.各类WebService框架的本质就是一个大大的Servlet,当远程调用客户端给它通过http协议发送过来soap格式的请求数据时,它分析这个数据,就知道要调用哪个java类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成soap格式的数据,通过http响应消息回给客户端。
11.1Axis
●步骤:
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地址,都可以知道对方的服务如何调用了。
11.2XFire
●步骤:
1.参照手册做第一个webservice服务器端例子,可以用config初始化参数来修改配置文件的位置,文件路径是相对当前web.xml文件的位置。
a)编写服务类
b)将服务类注册和部署成WebService
2.针对xfire项目,访问/mywebapp/services,可以验证xfire是否配置正常。
11.3JAX-WS
Java API for Xml Web Service
查看api
javax.jws
javax.jws.soap
wsdl2java http://localhost:9000/Hello?wsdl
11.4jboss发布webservice
jboss只能用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后也不行),以后看看对于其他方式发布的webservice,wsgen生成的客户端代码是否起作用。
11.5CXF
11.5.1创建一个HelloWorld
11.5.2jaxb
java api for xml binding
12Myeclipse创建webservice程序
使用myeclipse的new webservice client功能时不需要将应用程序变成webservice工程
使用myeclipse生成的jax-ws客户端时,需要把jaxws-api.jar和jaxb-api.jar这两个文件拷贝到jdk的endorsed目录中去。使用myeclipse生成的xfire客户端时,错误和使用wsgen一样,也不能返回正确的结果。
13常见错误下载本文