欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WebService教程详解(一)

程序员文章站 2024-03-09 17:01:29
web services 可以将应用程序转换为网络应用程序。 通过使用 web services,您的应用程序可以向全世界发布信息,或提供某项功能。 web s...

web services 可以将应用程序转换为网络应用程序。

通过使用 web services,您的应用程序可以向全世界发布信息,或提供某项功能。

web services 可以被其他应用程序使用。

通过 web services,您的会计部门的 win 2k 服务器可以与 it 供应商的 unix 服务器相连接。

基本的 web services 平台是 xml+http。

web services 使用 xml 来编解码数据,并使用 soap 来传输数据。

什么是webservice

webservice,顾名思义就是基于web的服务。它使用web(http)方式,接收和响应外部系统的某种请求。从而实现远程调用.

1:从webservice的工作模式上理解的话,它跟普通的web程序(比如asp、jsp等)并没有本质的区别,都是基于http传输协议的程序。

2:webservice所使用的数据均是基于xml格式的。目前标准的webservice在数据格式上主要采用soap协议。soap协议实际上就是一种基于xml编码规范的文本协议。

webservice的技术支持

web service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,web service平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。目前这些协议有:

xml和xsd

  可扩展的标记语言xml 是web service平台中表示数据的基本格式。除了易于建立和易于分析外,xml主要的优点在于它既与平台无关,又与厂商无关。xml是由万维网协会(w3c)创建,w3c制定的xml schemaxsd 定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。

  web service平台是用xsd来作为数据类型系统的。当你用某种语言如vb. net或c# 来构造一个web service时,为了符合web service标准,所有你使用的数据类型都必须被转换为xsd类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如 soap。

soap

  soap即简单对象访问协议(simple object access protocal),它是用于交换xml编码信息的轻量级协议。它有三个主要方面:xml-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为xml对象的规则,执行远程过程调用(rpc)的约定。soap可以运行在任何其他传输协议上。例如,你可以使用 smtp,即因特网电子邮件协议来传递soap消息,这可是很有诱惑力的。在传输层之间的头是不同的,但xml有效负载保持相同。

  web service 希望实现不同的系统之间能够用“软件-软件对话”的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于web无缝集成”的目标。

wsdl

  web service描述语言wsdl 就是用机器能阅读的方式提供的一个正式描述文档而基于xml的语言,用于描述web service及其函数、参数和返回值。因为是基于xml的,所以wsdl既是机器可阅读的,又是人可阅读的。

uddi

  uddi 的目的是为电子商务建立标准;uddi是一套基于web的、分布式的、为web service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的web service注册,以使别的企业能够发现的访问协议的实现标准。 调用rpc与消息传递

  web service本身其实是在实现应用程序间的通信。我们现在有两种应用程序通信的方法:rpc远程过程调用 和消息传递。使用rpc的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。rpc系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不需要知道对象是在哪台机器上。

如何发布一个webservice?

1、用jdk1.6.0_21以后的版本发布一个webservice服务.并通过地址栏查看它的wsdl文档.

2、通过wsimport生成客户端代码,调用并查看运行的结果.(学会如何调用是我们的重点).

需要注意的是,jdk1.6._07以后jdk版本发布webservice时必须要完整的对代码进行注解,如果使用的是jdk1.6.0_21以后版本,因为它已经内含了ws2.1所以,可以只对类添加@webservice的注解.

以下是两段不同的代码:

在jdk1.6.0_13的版本上发布的ws:

package com.itcast; 
import javax.jws.webmethod; 
import javax.jws.webservice; 
import javax.jws.soap.soapbinding; 
import javax.jws.soap.soapbinding.style; 
import javax.xml.ws.endpoint; 
@webservice(targetnamespace="http://loalhost:9999/helloworld") 
@soapbinding(style=style.rpc)//只支持rpc的消息风格 
public class helloworld { 
//以下通过@webmethod注解,对外公开方法 
@webmethod 
public string sayhello(){ 
return "helloworld"; 
} 
public static void main(string[] args) { 
endpoint.publish("http://localhost:9999/helloworld",new helloworld()); 
} 
} 

2:以下是在jdk1.6.0_24上发布的webservice代码:

package com.itcast; 
import javax.jws.webservice; 
import javax.xml.ws.endpoint; 
@webservice//注意只有此一个注解,此注解也是必须的,默认的soap消息风格为:document 
public class helloworld { 
public string sayhello(){ 
return "helloworld"; 
} 
public static void main(string[] args) { 
endpoint.publish("http://localhost:9999/helloworld",new helloworld()); 
} 
}

第一个webservice服务

package com.itcast; 
import javax.jws.webservice; 
import javax.xml.ws.endpoint; 
/** 
* 第一个webservice服务应用 
*/ 
//通过注解,标明此类发布为一个webservice 
@webservice 
public class helloworld { 
public string sayhello(){ 
return "hello world"; 
} 
//在main方法中,使用javax.xml.ws.endpoint端点发布一个应用 
public static void main(string[] args) { 
endpoint.publish("http://127.0.0.1:9999/helloworld", 
new helloworld()); 
} 
}

代码说明:helloworld类的所有非静态公开方法将对外部暴露.

wsimport工具说明:

 wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的webservice是用什么语言写的,都将在客户端生成java代码.服务器端用什么写的并不重要.

 wsimport.exe位于java_home\bin目录下.

常用参数为:

• -d<目录> - 将生成.class文件。默认参数。

• -s<目录> - 将生成.java文件。

• -p<生成的新包名> -将生成的类,放于指定的包下。

(wsdlurl) - http://server:port/service?wsdl,必须的参数

使用:

1:可以通过java –version检查你当前的版本号.如果版本太低可以安装高版本的jdk.

或直接将别人已安装好的jdk目录拷贝到你的机器如d:\jdk1.6.0_24目录下.

因为以前的环境变量已经设置成以前老版本的jdk目录,即java_home和path两个环境变量.

可以再重新设置一下环境变量为:java_home=d:\jdk1.6.0_24,path=%java_home%\bin,

重新设置了环境变量后,要重新打开一个doc(命令行)窗口.才生效.

如果不想修改原来已经配置好的环境变量,可以命令行窗口输入以下命令,使jdk1.6.0_24生效:

set path = d:\jdk1.6.0_24\bin;%path%(回车即可)

再通过java –version查看jdk的版本号是否已经发生变化.

2:转到一个相对干净的目录下,我在d盘上新建立一个目录名为:ws,并转到此目录下.

3:开启你的webservice.

4:输入以下命令:

wsimport –s . http://127.0.0.1:9999/helloworld?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:9999/helloworld?wsdl

-s<目录>将会生成.java文件.

示例:wsimport –s . http://127.0.0.1:9999/helloworld?wsdl

-p<包名>将生成的文件(.java或是.class修改成指定的包名)

示例:wsimport -s . -p com.beijing.itcast http://127.0.0.1:9999/helloworld?wsdl

对于-p参数,注意包名的修改,它将所生成类,全部置于通过-p指定的包下.(演示)

需要说明的是,当仅使用-p参数时,它也将同时使用-d即编译成.class文件. –d参数写或不写,它都在那里,不离不弃.

runmain.java的源代码如下:

package com.leaf; 
import com.itcast.helloworld; 
import com.itcast.helloworldservice; 
/** 
* 通过调用生成的类,来调用远程代码 
*/ 
public class runmain { 
public static void main(string[] args) { 
//从helloworldserice的gethelloworldport方法中返回调用接口 
helloworld helloworld = 
new helloworldservice().gethelloworldport(); 
string str = helloworld.sayhello(); //执行调用 
system.err.println(str);//返回helloworld字符串 
} 
} 

webservice与普通web程序的区别

1、 webservice只采用http post方式传输数据,不使用get方式;

1) tttp post的contenttype为

(1)application/x-www-form-urlencoded

2) webservice的contenttype为

(2) text/xml soap1.1
(3) application/soap+xml –soap1.2

2、webservice从数据传输格式上作了限定。

webservice所使用的数据均是基于xml格式的。目前标准的webservice在数据格式上主要采用soap协议。soap协议实际上就是一种基于xml编码规范的文本协议。

webservice和web服务器的区别:

我们可以把webservice看作是web服务器上应用;反过来说,web服务器是webservice运行时所必需的容器。这就是它们的区别和联系。

webservice的特点:

1、 webservice通过http post方式接受客户的请求

2、 webservice与客户端之间一般使用soap协议传输xml数据.

3、它本身就是为了跨平台或跨语言而设计的。