web service框架---axis学习笔记

AHRL 2008-10-08

都学到了什么:

1,了解了什么是webservice以及使用它的目的

2,了解了wsdl文档结构,学会怎么编写一个wsdl文件.

3,了解了axis框架,以及怎么使用它来发布,卸载服务,根据java代码生成wsdl文件,根据wsdl文件来生成代码

4,学会怎么在eclipse中利用wsdl文档生成服务端和客户端代码

5,学会怎么在客户方调用服务

接下来我介绍下我学的内容:

一,基础知识篇:

webservice:

实现网络上各个系统之间的服务调用,和语言无关.

服务提供方:

提供service服务的一方.

服务调用方:

调用service服务的一方.

Wsdl概念:

服务描述语言,根据服务提供wsdl文档我们可以知道对方提供的服务的信息:

对方提供了哪些服务?

如果调用这些服务?

当我们调用这些服务时,需要提供什么信息?

我们将如何提供这些信息?

服务将以什么样的格式返回这些信息?

WSDL文档的结构:

根节点为definitions,它的属性中定义了各种名称的命名空间.

三个必须定义的命名空间为:xmlns:wsdl,xmlns:soap,xmlns:xsd另外还定义了其他的一些命名空间(比如我们自己定义的).

根节点下包括以下直接子节点:

portType元素,每个portType元素都是一系列的操作的集合,你可以将单个portType元素看成是各种方法组成类的一个逻辑分组,其中有operation(方法)元素,operation元素中有input和output元素,input和output元素中的message属性等于message元素的name.

message元素,包含若干个part元素,part元素中的element属性等于types中定义的element的name.

注:在IBM的文档中,part元素使用type属性来定义它的类型,此type属性相当于java中的类型,type的值为命名空间(xsd或者用户自定义的)中定义的各种类型.而在公司的wsdl文档中,part元素是通过element属性来定义类型的,element属性值为types元素中定义的element元素,element元素中定义了complexType元素,而complexType元素才相当于java中的类型,等于是多封装了一层.

types元素,定义了若干element和complexType元素

binding元素,它将SOAP与WSDL文件绑定到一起的过程,type属性的值等于portType元素的name,bingding元素中有其他元素.bingding元素中有wsdlsoap:bingding、wsdl:operation两个子元素,其中wsdlsoap:bingding元素作用是声明将把soap作为绑定和传输服务使用,它的style属性是个可选属性,描述了改绑定内部操作的性质,transport属性指定了改绑定将使用的底层传输服务,如http。wsdl:operation元素,每个此元素描述了对应的操作的绑定细节。

sercive元素,它定义了服务.其中的name属性表示服务的逻辑名,port元素引用binding元素.

二,实际应用篇

使用axis编写和发布服务

编写java代码并且发布服务

下载axis包,把webapp/axis/web-inf/lib下的包全部拷到我们的web工程中.另外还需要activation.jar和mail.jar包,这两个包可以去网络上找,找到后也拷贝到工程目录下.(注意,也需要把这些包加入到classpath下,因为等下命令中要用到这些包的类)

然后在web.xml文件中配置servlet配置如下:

<servlet>
		<display-name>
		Apache-Axis Servlet</display-name>
		<servlet-name>AxisServlet</servlet-name>
		<servlet-class>
		org.apache.axis.transport.http.AxisServlet</servlet-class>
	</servlet>
	<servlet>
		<display-name>
		Axis Admin Servlet</display-name>
		<servlet-name>AdminServlet</servlet-name>
		<servlet-class>
		org.apache.axis.transport.http.AdminServlet</servlet-class>
		<load-on-startup>100</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>AxisServlet</servlet-name>
		<url-pattern>/servlet/AxisServlet</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>AxisServlet</servlet-name>
		<url-pattern>*.jws</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>AxisServlet</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>AdminServlet</servlet-name>
		<url-pattern>/servlet/AdminServlet</url-pattern>
	</servlet-mapping>

编写一个wsdd文件,例子如下

<deployment xmlns="http://xml.apache.org/axis/wsdd/"   
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">   
            <service name="MyService" provider="java:RPC">   
                     <parameter name="className" value="samples.userguide.example3.MyService"/>   
                      <parameter name="allowedMethods" value="*"/>   
            service>

deployment>

然后使用命令:javaorg.apache.axis.client.AdminClient-lhttp://地址:端口/context模块/services/AdminServicedeploy.wsdd来发布服务.

使用axis的Java2WSDL工具生成wsdl文件:

javaora.apache.axis.client.AdminClient–l“http://地址:端口/上下文路径/services/服务名”-n“urn:命名空间”–p“包路径”“urn:命名空间”完整类名

使用axis的WSDL2Java工具生成Java代码:

javaorg.apache.axis.wsdl.WSDL2Java-o代码路径-dSession-s-Strue-Nurn:命名空间包路径wsdl文件名

总结:用axis开发webservices步骤:

方式一(能生成标准的java代码)

1,写java代码,生成wsdl

2,通过wsdl生成java代码和部署的wsdd

3,部署服务.

方式二

1,写java代码,wsdd

2,通过wsdd部署服务.

方式三

1,双方定义好wsdl文件

2,双方通过wsdl文件生成源代码,服务提供方在源代码中把实现写好,服务调用方调用服务.

利用eclipse来生成axis:

首先,利用wsdl生成服务端和客户端.我用的是eclipse3.3,newotherwebservices/webservice,newotherwebservices/webserviceclient可以生成服务端和客户端.

服务端配置:

(1)导包到工程中(同前)

(2)配置web.xml文件(同前)

(3)发布服务:把自动生成的wsdd文件中的service标签部分拷贝到web-inf/server-config.wsdd中

客户端配置:

(1)导包到工程中(同前)

(2)编写代码访问服务端,例子如下:

public static void main(String[] args) {
	// TODO Auto-generated method stub
	FJFaultNotifyBindingStub binding;
	FJFaultNotifyServiceLocator locator=new FJFaultNotifyServiceLocator();
	URL url;
	try{
		url=new URL("http://localhost:8080/FJfaultNotifyService/services/FJFaultNotifyService");
		binding = (FJFaultNotifyBindingStub) locator.getFJFaultNotifyService(url);
		IsAliveResponse response= binding.isAlive(new IsAliveRequest("服务提供者","服务调用者"));
		System.out.println(response.getResultIsAlive());
	}
	catch(Exception e){
		
	}
}

相关推荐