`
duantonghai
  • 浏览: 20616 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

axis web service

阅读更多
以前对axis 生成web service一直比较糊涂,发现个人说个人的,好像有很多方法一样, 最近特意查了查资料总结一下。

axis 生成webservice有3 种 方式,

  1, Dynamic invocation interface
      
2, Dynamic proxy
  
3, sub

  下面分别做简单介绍

   在开始之前先环境配置:
    下载axis 包解压, 把webapps/axis 下的所有文件都拷贝到你的web 工程下,
     这样你就可以在你工程里生成web service和利用一些axis提供的工具.

     打开: http://localhost:9081/TestWebService/index.jsp

      这里去验证你的环境是否建立成功。

     在电脑环境变量里增加
 
    
     AXIS_HOME: C:\MyThings\book\program\axis-1_4
     AXIS_LIB : C:\MyThings\book\program\axis-1_4\lib
     AXISCLASSPATH : 
C:\MyThings\book\program\axis-1_4\lib\axis.jar;C:\MyThings\book\program\axis-1_4\lib\axis-ant.jar;C:\MyThings\book\program\axis-1_4\lib\commons-discovery-0.2.jar;C:\MyThings\book\program\axis-1_4\lib\commons-logging-1.0.4.jar;C:\MyThings\book\program\axis-1_4\lib\jaxrpc.jar;C:\MyThings\book\program\axis-1_4\lib\log4j-1.2.8.jar;C:\MyThings\book\program\axis-1_4\lib\saaj.jar;C:\MyThings\book\program\axis-1_4\lib\wsdl4j-1.5.1.jar;C:\MyThings\book\program\axis-1_4\lib\activation.jar;C:\MyThings\book\program\axis-1_4\lib\mail-1.4.jar


这里注意我把mail-1.4.jar 和 activation.jar也加进来了,这两个本来不在lib目录下,但是axis需要依赖我就加进来了
  
   http://localhost:9081/TestWebService/servlet/AxisServlet
   可以查看现在服务器上都部署了那些服务

   第1种

    动态接口调用,使用及时发布,用户只需提供java类源代码,axis会自动处理的


    heloWorld.java

     
 public class HelloWorld{
        public String sayHello(){
               return "Hello World";
        }
       }


     将hellWorld.java 拷贝到 %TOMCAT_HOME%\webpps\axis下,改名为HelloWorld.jws, 这样就发布成功了。

 测试代码:

 
import java.net.URL;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class CitiCardSericeTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {

		String endpoint = "http://localhost:8080/axis/HelloWorld.jws";
		Service service = new Service();
		Call call = (Call) service.createCall();
		call.setTargetEndpointAddress(new URL(endpoint));
		call.setOperationName("sayHello");
		String res = (String) call.invoke(new Object[] {});
		System.out.println(res);

	}

}

如果复杂对象:
QName qn=new QName("urn:beanservice","User");
		call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class,qn), new BeanDeserializerFactory(User.class,qn));
        User user=new User();
        user.setAge("10");
        user.setName("duant");
        String res = (String) call.invoke(new Object[] {user});
        System.out.println(res);

或者
  call.addParameter( "arg1", qn, ParameterMode.IN );




   第2种 Dynamic proxy
将HelloWorld.java编译成HelloWorld.class 放到 %TOMCAT_HOME%\webapps\axis\WEB-INF\classe下

 在 %TOMCAT_HOME%\webapps\axis\WEB-INF下建立deploy.wsdd文件,soap服务发布描述文件

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

	</service>
	
</deployment>


在doc目录下到 %TOMCAT_HOME%\webapps\axis\WEB-INF,命令
 java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wssd

就会发现多了一个servver-config.wsdd文件,这个就是配置文件,
访问 http://localhost:8080/axis/servlet/AxisServlet

测试代码:
import java.net.URL;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class CitiCardSericeTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {

		String endpoint="http://localhost:8080/axis/services/HelloWorld"; //和1不同
		Service service = new Service();
		Call call = (Call) service.createCall();
		call.setTargetEndpointAddress(new URL(endpoint));
		call.setOperationName("sayHello");
		String res = (String) call.invoke(new Object[] {});
		System.out.println(res);

	}

}


   第3种 stub 方式

  
package com.webService;

public class OrderService {
	public String orderProduce(String name, String address, String item, int quantity, Card card){
		String orderInfo=name+" "+address+" "+item+" "+card.getName();
		return orderInfo;
	}
}



package com.webService;

public class Card {
	private String name;
	private String age;
	
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}


编写完代码后, 在WEB-INF 下新建立一个文件 deploy.wsdd

这里需要注意beanMapping,因为card是一个java bean.

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
	
	
	<service name="OrderService" provider="java:RPC">
		<parameter name="className"  value="com.webService.OrderService" />
		<parameter name="allowedMethods" value="*" />

               <beanMapping languageSpecificType="java:com.webService.Card"
		qname="myNsn:Card" xmlns:myNsn="urn:BeanService" />
	</service>
	
</deployment>


  
这个时候已经完成了代码编写, 如果你的环境是好的,就可以进入发布环节,如果环境没好,请参考环境建立部分。

在WEB-INF下面执行命令

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:9081/TestWebServices/services/orderService  deploy.wsdd


系统提示 <Admin>Done processing </Admin>

就说明发布成功, 可以去  http://localhost:9081/TestWebService/servlet/AxisServlet 查看已经部署结果,

可以用 http://localhost:9081/TestWebServices/services/orderService?wsdl

获得这个service 的wsdl 文件

测试这个webservice时可以用 WSDL2Java 生成测试的 类,

执行命令:

java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java -o c:\\temp -p com.webService   orderService.wsdl

就可以根据wsdl文成生成客户端调用代码类,

card.java, OrderService_PortType.java, OrderServiceService.java, OrderServiceServiceLocator.java, OrderServiceSoapBindingStub.java



调用类

package com.webService;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		OrderServiceServiceLocator locator=new OrderServiceServiceLocator();
		try {
			OrderService_PortType service=locator.getOrderService();
Card card=new Card():
card.setName("laoslais");
			String res=service.orderProduce("one", "two", "three", 2, card);
			System.out.println(res);
		} catch (ServiceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}





执行就的到结果: one two three

handler:

package com.webService.haddler;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.xml.soap.SOAPException;

import org.apache.axis.AxisFault;
import org.apache.axis.Handler;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;

public class LogHandler extends BasicHandler {


	private static final long serialVersionUID = 1L;

	public void invoke(MessageContext context) throws AxisFault {
		Handler handler=context.getService();
		String filename=(String) this.getOption("filename");
		

		try {
			FileOutputStream fos=new FileOutputStream(filename,true);
			PrintWriter write=new PrintWriter(fos);
			Integer counter=(Integer)handler.getOption("accesses");
			if(counter==null){
				counter=new Integer(1);
			}
			
			counter=new Integer(counter.intValue()+1);
			Date date=new Date();
			context.getMessage().writeTo(System.out);
			String result="date web service:"+context.getTargetService()+" call "+counter;
			
			handler.setOption("accesses", counter);
			write.println(result);
			write.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (SOAPException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


deploy.wsdd:

<service name="OrderService" provider="java:RPC">
		<parameter name="className"  value="com.webService.OrderService" />
		<parameter name="allowedMethods" value="*" />
		<requestFlow>
		<handler name="logging" type="java:com.webService.haddler.LogHandler">
		 <parameter name="filename" value="c:\\temp\\myservice.log" />
		</handler>
		</requestFlow>
	</service>




客户端代码:

private static Logger logger=Logger.getLogger(AbstractServiceInvoke.class);
	private GbLogger m_gblog;
	private URL endPoint;
	protected Call call;
	
	public AbstractServiceInvoke(URL endPoint) throws ServiceException{
		this.endPoint = endPoint;
		Service service = new Service();

		this.call = (Call) service.createCall();
		this.call.setTargetEndpointAddress(this.endPoint);
		this.setCommonlPropety();
	}
	
	public URL getEndPoint() {
		return endPoint;
	}
	
	protected void setCommonlPropety(){
		call.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
		call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);
	    call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
	    call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
	}
	
	protected void registerTypeMapping(Class cls,QName qn){
		call.registerTypeMapping(cls, qn, new BeanSerializerFactory(cls,qn), new BeanDeserializerFactory(cls,qn)); 
	}
	
	protected void registerTypeMapping(String name,Class cls){
		QName qn=new QName("urn:beanservice",name);
		call.registerTypeMapping(cls, new QName("urn:beanservice",name), new BeanSerializerFactory(cls,qn), new BeanDeserializerFactory(cls,qn)); 
	}
	
	protected void registerTypeMapping(Class cls){
		String name=cls.getSimpleName();
		this.registerTypeMapping(name, cls);
	}
	
	
	protected void setInputType(QName qn,Class cls){
		call.addParameter(qn.getLocalPart(), qn,cls, ParameterMode.IN );
	}
	
	protected void setInputType(String name,Class cls){
		QName qn=new QName("urn:beanservice",name);
		call.addParameter(name, qn,cls, ParameterMode.IN );
	}
	
	protected void setInputType(Class cls){
		String name=cls.getSimpleName();
		this.setInputType(name, cls);
	}
	
	protected void setReturnType(Class cls){
		this.call.setReturnClass(cls);
	}
	
	protected Object invokeMethod(Object input,Class output,String operationName) throws RemoteException{
		String DEBUG_HDR = Utilities.getMethodInfo();
		
		try{

			Class inputCls=input.getClass();
			
			if(m_gblog != null){
				m_gblog.info(DEBUG_HDR + " input class:"+inputCls.getSimpleName());
			}else{
				logger.debug(DEBUG_HDR + " input class:"+inputCls.getSimpleName());
			}
			this.registerTypeMapping(inputCls);
			this.setInputType(inputCls);
			
			this.registerTypeMapping(output);
			this.setReturnType(output);
			if(m_gblog != null){
				m_gblog.info(DEBUG_HDR + " return class:"+output.getSimpleName());
			}else{
				logger.debug(DEBUG_HDR + " return class:"+output.getSimpleName());
			}
			
			this.call.setOperationName(operationName);
			if(m_gblog != null){
				m_gblog.info(DEBUG_HDR + " operationName:"+operationName);
			}else{
				logger.debug(DEBUG_HDR + " operationName:"+operationName);
			}
			
			Object res=this.call.invoke(new Object[] {input});
			return res;
		}finally{
			this.printDebugInfo();
		}
	}
	
	
分享到:
评论

相关推荐

    AXIS Web Service入门及应用

    AXIS Web Service是一种基于Java的开源工具,用于创建和部署Web服务。它是Apache软件基金会的项目,主要用于简化SOAP(简单对象访问协议)处理,使得开发人员可以轻松地将Java类转换为Web服务或调用远程Web服务。在...

    axis web service例子

    总结来说,"axis web service例子"是一个实践性的教学资源,帮助开发者深入理解Java Axis Web服务的工作机制,包括服务的创建、部署和调用。通过实际操作,学习者可以提升自己的Web服务开发技能,为未来的项目开发...

    axis web Service

    【Axis Web Service】是一种基于Java的开源Web服务框架,它由Apache软件基金会开发,主要用于创建和部署Web服务。Axis提供了一种简单的方式来实现SOAP(Simple Object Access Protocol)通信,允许不同平台上的应用...

    axis web service的教程,入门到精通

    Axis Web Service教程是针对Java开发者的一个重要学习资源,它涵盖了从基础到高级的Web服务开发技术。Axis是一个开源的SOAP栈,由Apache软件基金会维护,主要用于构建和部署Web服务。本教程将帮助你理解并掌握如何...

    axis web service client 源码

    axis web service client 源码

    AXIS WEB SERVICE开发所需包下载

    AXIS(Axis2)是Apache软件基金会开发的一个开源Web服务框架,主要用于构建高效、灵活且可扩展的Web服务。在本资源包中,包含了AXIS开发所需的几个关键组件,让我们一一解析它们的功能和用途。 1. **xmlsec-1[1]....

    Axis开发Web Service实例

    ### Axis开发Web Service实例详解 #### 一、概述 在探讨如何使用Apache Axis来开发Web Service之前,我们首先需要了解一些基本概念。 **Web Service**是一种标准的技术框架,用于实现不同平台之间的应用通信。它...

    AXIS开发Web Service.docx

    AXIS 是 Apache 开源项目提供的一款强大的 Web Service 引擎,用于开发和部署 Web Service。在本文中,我们将深入探讨如何使用 AXIS 在 Tomcat 6.0.26 上进行配置,并详细介绍三种部署和调用 Web Service 的方法:...

    axis开发web service程序

    ### Axis 开发 Web Service 程序详解 #### 一、Web Service 概念与应用场景 Web Service 是一种跨编程语言和操作系统平台的远程调用技术。它允许不同语言编写的程序通过网络进行通信和数据交换。Web Service 的...

    基于AXIS2实现Web Service开发

    基于AXIS2实现Web Service开发是一项常见的任务,尤其在企业级应用中,Web Service作为不同系统间通信的重要桥梁。AXIS2是Apache软件基金会提供的一个轻量级、高性能的Web Service框架,它提供了完整的Web Service...

    axis web services 例子

    描述 "axis web service 写的例子 里面有自定类的序列化与反序列化的例子" 强调了这个示例项目的核心内容。在Web服务中,序列化是将Java对象转换为可以在网络上传输的数据格式(如XML)的过程,而反序列化则是接收...

    基于Axis的Web Service客户端调用

    【标题】基于Axis的Web Service客户端调用 在IT领域,Web Service是一种通过网络进行通信的标准协议,它允许不同系统间的应用程序互相交换数据。而Apache Axis是Java平台上的一个开源工具,专门用于创建和部署Web ...

    axis2 web service完整教学

    【Apache Axis2 Web Service 教程】 Apache Axis2 是一个流行的开源Web服务框架,用于创建、部署和管理高性能的Web服务。本教程将详细介绍如何在Eclipse环境中利用Apache Axis2搭建Web服务及其客户端。 **环境配置...

    MyEclipse下开发Web Service(Axis)

    ### MyEclipse下开发Web Service(Axis):深入解析与实践指南 #### 一、环境配置与准备 在深入探讨如何使用Apache Axis在MyEclipse环境下构建Web Services之前,首要任务是确保拥有一个完整的开发环境。这包括但不...

    学习在JBoss上部署Axis

    ### 学习在JBoss上部署Axis Web Service #### 知识点概述 本文主要介绍如何在JBoss应用服务器上部署Axis Web Service。通过详细步骤和背景知识的讲解,帮助读者掌握这一技能。 #### 一、环境搭建与准备工作 1. *...

    用axis2开发web service

    【用Axis2开发Web Service】是本文的核心主题,轴心技术是Java开发Web服务的一种框架,相较于Axis1,其过程更为简洁。以下是关于使用Axis2开发Web Service的详细步骤和知识点: 1. **实验环境搭建**: - 首先确保...

    使用Axis开发Web Service程序

    ### 使用Axis开发Web Service程序 #### 一、概述 随着互联网技术的发展,Web Service作为一种标准的、基于XML的网络服务形式,在实现不同平台之间数据交换和应用集成方面扮演着重要角色。Axis作为Apache组织下的一...

    MyEclipse7.0创建基于Axis的Web service

    【MyEclipse7.0创建基于Axis的Web服务】\n\nWeb服务是一种基于标准的、平台无关的方式,使得应用程序可以相互通信。在本文中,我们将深入探讨如何使用MyEclipse7.0,一个强大的Java集成开发环境,来创建、发布以及...

Global site tag (gtag.js) - Google Analytics