`

WebService之axis

    博客分类:
  • J2EE
阅读更多
ITMS和97/BOSS交互工单,用WebService,摸索着搞定,记录如下。

一、下载Axis,http://ws.apache.org/axis/index.html,项目中用的1.4

二、环境设置:本机jdk版本-1.5.0_07,Tomcat-5.5
解压下载到的axis-bin-1_4.tar.gz
JAVA_HOME C:\Program Files\Java\jdk1.5.0_07
CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
AXIS_HOME D:\dev\axis-1_4
AXIS_LIB %AXIS_HOME%\lib
AXISCLASSPATH %AXIS_LIB%\axis.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\commons-discovery-0.2.jar
三、验证安装:
将axis-bin-1_4.tar.gz项目包中webapps下的axis拷入到Tomcat-webapps,启动Tomcat。
浏览器打开http://localhost:8882/axis/。如下:




·Validation 可对安装配置校验。



必选jar包必须都有,如缺失会有提示。

·List 显示已提供的WebService接口,wsdl为接口描述。



其它略。

四、Axis的发布方式:(前两种调用方式来自网络)
Axis支持三种web service的部署和开发,分别为:

  1、Dynamic Invocation Interface (DII)

  2、Dynamic Proxy方式

  3、Stubs方式

这里先介绍其中比较简单的两种,这两种在实际的工程开发中应用并不多见,但容易学习,第三种是在工程中经常用到的,将在下一篇中做介绍:

1,Dynamic Invocation Interface动态调用接口

这个也称之为即时发布,是Axis的特色之一,使用即时发布使用户只需有提供服务的Java类的源代码,即可将其迅速发布成Web服务。每当用户调用这类服务的时候,Axis会自动进行编译,即使服务器重启了也不必对其做任何处理,使用非常简单快捷。

  使用即时发布首先需要一个实现服务功能的Java源文件,将其扩展名改为.jws(Java Web Service的缩写),然后将该文件放到“……\webapps\axis”目录下即可。

第一个程序简单的返回HELLO WORLD!

HelloWorld.java
public class HelloWorld {
public String sayHello()
{
    return "HELLO WORLD!"; 
} 
}



将HelloWorld.java拷贝到%TOMCAT_HOME%\webapps\axis下,然后将其改名为HelloWorld.jws,这样AXIS就自然将其发布了。现在写个客户端程序访问一下:

TestClient.java

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

import javax.xml.rpc.ParameterMode;

public class TestClient
{
   public static void main(String [] args) throws Exception {
       
       String endpoint = "http://localhost:" +"8080"+ "/axis/HelloWorld.jws";//指明服务所在位置

       Service service = new Service(); //创建一个Service实例,注意是必须的!
       Call     call    = (Call) service.createCall();//创建Call实例,也是必须的!

     call.setTargetEndpointAddress( new java.net.URL(endpoint) );//为Call设置服务的位置

        call.setOperationName( "sayHello" );//注意方法名与HelloWorld.java中一样!!

         String res = (String) call.invoke( new Object[] {} );//返回String,没有传入参数

                         System.out.println( res );
   }
}


注意项目中要导入其自带的AXIS包(当然应该把其中JAR文件替换一下),可以看到程序返回了 "HELLO WORLD!"

可以看到在AXIS里发布服务其实是一件很容易的事,这是因为这个服务很简单的原因。。

局限性:必须知道服务端的源码,这个...尴尬,一般项目里只提供url给客户端调用

2,Dynamic Proxy动态代理方式

1、将HelloWorld.java编译成HelloWorld.class,放到%TOMCAT_HOME%\webapps\axis\WEB-INF\classes下

2、在%TOMCAT_HOME%\webapps\axis\WEB-INF下新建deploy.wsdd文件,即SOAP服务发布描述文件deploy.wsdd
<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="sayHello"/>
    </service>
</deployment>


在DOS下转换目录到%TOMCAT_HOME%\webapps\axis\WEB-INF,命令:

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd


你会发现目录下多了一个server-config.wsdd文件,这就是AXIS的配置文件,以后所有的服务发布描述都会在里面找到。(当然,你可以直接修改它,不用再写deploy.wsdd)然后打开浏览器http://localhost:8080/axis/servlet/AxisServlet,你就会看到你的服务已发布

同样用客户端程序访问一下:(注意和上边的差别!!)

HelloClient.java
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class HelloClient
{
   public static void main(String [] args) throws Exception {

       String endpoint = "http://localhost:" +"8080"+ "/axis/services/HelloWorld";//注意!差别仅仅在这里!!

       Service service = new Service();
       Call     call    = (Call) service.createCall();
       call.setTargetEndpointAddress( new java.net.URL(endpoint) );
        call.setOperationName("sayHello" );

         String res = (String) call.invoke( new Object[] {} );

                         System.out.println( res );
   }
}



对于有自定义的参数的客户端调用方式如下:

String endpoint = "http://192.168.0.3/DataManager/services/User";
    Service service= new Service();
    Call call= (Call)service.createCall(); 
    call.setTargetEndpointAddress(new java.net.URL(endpoint));
    call.setOperationName("addUser");  

//前面都一样,但是这里加了一段注册参数类型的说明,如果有多个自定义参数只需要要复制这段代码,

//再修改参数就行了。
    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.setClass_("U");
         user.setName_("annlee");
         user.setEmail_("1@163.com");
         user.setSeq_(new Integer(65546));
         user.setPassword_("password");
         user.setEnabled_("Y");
         user.setDisplayname_("李飞虎");
   
    String result=(String )call.invoke(new Object[]{user});




3,Stubs方式
工程应用当中的web service的参数和通回值通常都是一个数据Bean类,因此前面介绍的两种发布AXIS的web service方法在工程应用当中并不多见,下面介绍Stub发布方法,开发步骤如下:

1、编写服务端程序ITMSWorkSheetMgt.java
/**
 * ITMSWorkSheetMgt.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.
 */

package com.shtel.worksheet;

import java.util.Date;

import org.apache.log4j.Logger;

import com.pai.bossItf.bo.ITMSWorkSheet;
import com.pai.bossItf.bo.MgtResponse;
import com.shtel.worksheet.common.AppException;
import com.shtel.worksheet.common.Contants;
import com.shtel.worksheet.dao.WorkSheetDao;
import com.shtel.worksheet.model.WorksheetInfo;

public class ITMSWorkSheetMgt {
	
	Logger logger = Logger.getLogger(ITMSWorkSheetMgt.class);
	
	public MgtResponse addITMSWorkSheet(ITMSWorkSheet itmsWorkSheet) {
		
		logger.debug("Invoke addITMSWorkSheet...");
		// 返回结果
		MgtResponse response = new MgtResponse();
		logger.debug("addITMSWorkSheet:actionType=["+ itmsWorkSheet.getActionType() + "]");// 业务类型
		logger.debug("addITMSWorkSheet:adNumber=[" + itmsWorkSheet.getAdNumber()+ "]");// AD编号
		logger.debug("addITMSWorkSheet:crmQuoteNo=["+ itmsWorkSheet.getCrmQuoteNo() + "]");// crm订单号
		logger.debug("addITMSWorkSheet:orderType=["+ itmsWorkSheet.getOrderType() + "]");// 工单类型
		logger.debug("addITMSWorkSheet:requireTime=["+ itmsWorkSheet.getRequireTime() + "]");// 用户要求完工日期
		logger.debug("addITMSWorkSheet:sht_applicationTime=["+ itmsWorkSheet.getSht_applicationTime() + "]");// 开工单日期
		logger.debug("addITMSWorkSheet:sht_sequenceNo=["+ itmsWorkSheet.getSht_sequenceNo() + "]");// 工单序号
		
		if (itmsWorkSheet.getWorkItem() != null) {
			int len = itmsWorkSheet.getWorkItem().length;
			for (int i = 0; i < len; i++) {
				logger.debug("addITMSWorkSheet:workItem[" + i + "]=["
						+ itmsWorkSheet.getWorkItem()[i] + "]");
				
			}
		}

		// 工单序号不能为空
		if (itmsWorkSheet.getSht_sequenceNo() == null
				|| "".equals(itmsWorkSheet.getSht_sequenceNo())) {
			response.setResultCode(Contants.ERR_ORDERNO_NULL);
			response.setResultMessage(Contants.STR_ORDERNO_NULL);
			return response;
		}
		// CRM流水号不能为空
		if (itmsWorkSheet.getCrmQuoteNo() == null
				|| "".equals(itmsWorkSheet.getCrmQuoteNo())) {
			// TODO 补充
			response.setResultCode("");
			response.setResultMessage("");

		}
		// 开工单日期不能为空
		if (itmsWorkSheet.getSht_applicationTime() == null
				|| "".equals(itmsWorkSheet.getSht_applicationTime())) {
			response.setResultCode(Contants.ERR_ORDERTIME_NULL);
			response.setResultMessage(Contants.STR_ORDERTIME_NULL);
			return response;

		}
		// 业务类型不能为空
		if (itmsWorkSheet.getActionType() == null
				|| "".equals(itmsWorkSheet.getActionType())) {
			response.setResultCode(Contants.ERR_ORDERREMARK_NULL);
			response.setResultMessage(Contants.STR_ORDERREMARK_NULL);
			return response;

		} 
		// AD编号不能为空
		if (itmsWorkSheet.getAdNumber() == null
				|| "".equals(itmsWorkSheet.getAdNumber())) {
			response.setResultCode(Contants.ERR_ADNO_NULL);
			response.setResultMessage(Contants.STR_ADNO_NULL);
			return response;
		}
		// 工单类型不能为空
		if (itmsWorkSheet.getOrderType() == null
				|| "".equals(itmsWorkSheet.getOrderType())) {
			response.setResultCode(Contants.ERR_ORDERTYPE_NULL);
			response.setResultMessage(Contants.STR_ORDERTYPE_NULL);
			return response;
		}
		
		/** ****** SAVE WORKSHEET ****** */
		
		try {
			Date opTime = new Date();
			WorksheetInfo workSheet = new WorksheetInfo();
			workSheet.orderRemark = itmsWorkSheet.getActionType();
			workSheet.adNo = itmsWorkSheet.getAdNumber();
			workSheet.orderNo = itmsWorkSheet.getSht_sequenceNo();
			workSheet.orderLsh = itmsWorkSheet.getCrmQuoteNo();
			workSheet.orderTime =itmsWorkSheet.getSht_applicationTime();
			workSheet.userTargetDate = itmsWorkSheet.getRequireTime();
			workSheet.orderType = itmsWorkSheet.getOrderType();
			workSheet.opTime = opTime;
			workSheet.status = Contants.STATUS_BEFORE_SG;
			workSheet.workItemList = itmsWorkSheet.getWorkItem();
			
			WorkSheetDao.saveItems(workSheet);
			
			response.setResultCode(Contants.OPER_SUCCESS);
			response.setResultMessage(Contants.STR_OPER_SUCCESS);
		} catch (AppException e) {
			response.setResultCode(Contants.ERR_DATABASE_ERROR);
			response.setResultMessage(Contants.STR_DATABASE_ERROR);
			logger.error("addITMSWorkSheet: Database insert error",e);
		}
		
		return response;
	}
	
}



2、将Axis集成到工程,在工程的web.xml配置文件中加入以下AXIS配置
 <!-- AXis Servlet Mapping -->
  <servlet>    
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
  </servlet>
  
     
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
 

3、wsdl2java ,Ant编译
	<target name="WSDL2JAVA">
		<path id="class.path">
			<fileset dir="${axis.home}/lib">
				<include name="**/*.jar" />
			</fileset>
		</path>

		<mkdir dir="${wsclient.src.dir}" />

		<taskdef resource="axis-tasks.properties" classpathref="class.path" />

		<axis-wsdl2java output="${wsclient.src.dir}" serverside="true" skeletondeploy="true" testcase="false" verbose="true" url="${wsdl.dir}/ITMSWorkSheetMgt.wsdl">
			<mapping namespace="http://bo.bossItf.pai.com" package="com.pai.bossItf.bo" />
		</axis-wsdl2java>
	</target>


4、生成客户端代码目录如下:包含客户端client stub文件、deploy.wsdd(发布service)和undeploy.wsdd(删除service)


看一下deploy.wsdd(部署service用到)
<!-- Use this file to deploy some handlers/chains and services      -->
<!-- Two ways to do this:                                           -->
<!--   java org.apache.axis.client.AdminClient deploy.wsdd          -->
<!--      after the axis server is running                          -->
<!-- or                                                             -->
<!--   java org.apache.axis.utils.Admin client|server deploy.wsdd   -->
<!--      from the same directory that the Axis engine runs         -->

<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

  <!-- Services from ITMSWorkSheetMgtService WSDL service -->

  <service name="ITMSWorkSheetMgt" provider="java:RPC" style="wrapped" use="literal">
      <parameter name="wsdlTargetNamespace" value="http://bo.bossItf.pai.com"/>
      <parameter name="wsdlServiceElement" value="ITMSWorkSheetMgtService"/>
      <parameter name="schemaQualified" value="http://bo.bossItf.pai.com"/>
      <parameter name="wsdlServicePort" value="ITMSWorkSheetMgt"/>
      <parameter name="className" value="com.pai.bossItf.bo.ITMSWorkSheetMgtSoapBindingSkeleton"/>
      <parameter name="wsdlPortType" value="ITMSWorkSheetMgt"/>
      <parameter name="typeMappingVersion" value="1.2"/>
      <parameter name="allowedMethods" value="*"/>

      <typeMapping
        xmlns:ns="http://bo.bossItf.pai.com"
        qname="ns:WorkItem"
        type="java:com.pai.bossItf.bo.WorkItem"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle=""
      />
      <typeMapping
        xmlns:ns="http://bo.bossItf.pai.com"
        qname="ns:MgtResponse"
        type="java:com.pai.bossItf.bo.MgtResponse"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle=""
      />
      <typeMapping
        xmlns:ns="http://bo.bossItf.pai.com"
        qname="ns:ITMSWorkSheet"
        type="java:com.pai.bossItf.bo.ITMSWorkSheet"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle=""
      />
      <arrayMapping
        xmlns:ns="http://bo.bossItf.pai.com"
        qname="ns:ArrayOfWorkItem"
        type="java:com.pai.bossItf.bo.WorkItem[]"
        innerType="cmp-ns:WorkItem" xmlns:cmp-ns="http://bo.bossItf.pai.com"
        encodingStyle=""
      />
  </service>
</deployment>



5、发布服务:
进入web-inf,deploy.wsdd放入此目录,执行命令
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient  -lhttp://localhost:8080/axis/services/AdminService deploy.wsdd 

AdminClient 首先会在axis.jar所在应用下的WEB-INF文件夹下创建一个webservice配置文件server-config.wsdd,并且根据wsdd文件的配置将我们的webservice加入到这个配置文件中。如果server-config.wsdd已经存在则不会创建,会修改这个文件将新的service 配置到server-config.wsdd文件中。
即:会在WEB-INF下生成server-config.wsdd文件,这个就是axis的服务配置文件,对外提供service描述。
    <!-- caoxh 接口机接收工单 20101119  -->
	<service name="ITMSWorkSheetMgt" provider="java:RPC" style="wrapped"
    	use="literal">
    	<parameter name="allowedMethods" value="*" />
    	<parameter name="typeMappingVersion" value="1.2" />
    	<parameter name="wsdlPortType" value="ITMSWorkSheetMgt" />
    	<parameter name="className"
    		value="com.shtel.worksheet.ITMSWorkSheetMgt" />

    	<parameter name="wsdlServicePort" value="ITMSWorkSheetMgt" />
    	<parameter name="schemaQualified"
    		value="http://bo.bossItf.pai.com" />
    	<parameter name="wsdlTargetNamespace"
    		value="http://bo.bossItf.pai.com" />
    	<parameter name="wsdlServiceElement"
    		value="ITMSWorkSheetMgtService" />
    	<typeMapping
    		deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
    		encodingStyle="" qname="ns5:WorkItem"
    		serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
    		type="java:com.pai.bossItf.bo.WorkItem"
    		xmlns:ns5="http://bo.bossItf.pai.com" />
    	<typeMapping
    		deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
    		encodingStyle="" qname="ns6:MgtResponse"
    		serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
    		type="java:com.pai.bossItf.bo.MgtResponse"
    		xmlns:ns6="http://bo.bossItf.pai.com" />
    	<typeMapping
    		deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
    		encodingStyle="" qname="ns7:ITMSWorkSheet"
    		serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
    		type="java:com.pai.bossItf.bo.ITMSWorkSheet"
    		xmlns:ns7="http://bo.bossItf.pai.com" />
    	<arrayMapping innerType="ns8:WorkItem"
    		languageSpecificType="java:com.pai.bossItf.bo.WorkItem[]"
    		qname="ns8:ArrayOfWorkItem" xmlns:ns8="http://bo.bossItf.pai.com" />
    </service>

现在访问访问http://localhost:8080/工程名/services就可以看到此工程发布的所有的web service

6、客户端调用:
	/**
	 * 客户端stub调用webservice接口
	 * 
	 * @param worksheet
	 */
	public static OrderMessageInfo addWorksheet(ITMSWorkSheet worksheet) {
		OrderMessageInfo orderState = new OrderMessageInfo();
		MgtResponse response = new MgtResponse();
		ITMSWorkSheetMgtSoapBindingStub binding = null;
		ITMSWorkSheetMgtServiceLocator locator = new ITMSWorkSheetMgtServiceLocator();
		String webServiceUrl = "http://ip:port/project/services/ITMSWorkSheetMgt";
		try {
			binding = (ITMSWorkSheetMgtSoapBindingStub) locator
					.getITMSWorkSheetMgt(new URL(webServiceUrl));
			response = binding.addITMSWorkSheet(worksheet);
			if (response != null) {
				logger.info("response.code:" + response.getResultCode());
				logger.info("response.message:" + response.getResultMessage());
				orderState.setOrderState(Integer.parseInt(response
						.getResultCode()));
				orderState.setOrderStateDesc(response.getResultMessage());
			}

		} catch (MalformedURLException e) {
			logger.error("Creates a URL object from the String(webServiceURL) Error", e);
		} catch (ServiceException e) {
			logger.error("getSOAP_HTTP_Port Error", e);
		} catch (RemoteException e) {
			logger.error("Invoked WebService Method(SZJT_ReturnResult) Error", e);
		}
		return orderState;
	}


服务端和客户端的代码、配置就是如此。
  • 大小: 60.6 KB
  • 大小: 122.3 KB
  • 大小: 11.4 KB
  • 大小: 36.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics