WebService之axis

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
[color=green]JAVA_HOME[/color] C:\Program Files\Java\jdk1.5.0_07
[color=green]CLASSPATH[/color] .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
[color=green]AXIS_HOME[/color] D:\dev\axis-1_4
[color=green]AXIS_LIB[/color] %AXIS_HOME%\lib
[color=green]AXISCLASSPATH[/color] %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/。如下:


[img]http://dl.iteye.com/upload/attachment/357902/473d3783-e933-3dd3-b6c2-706a3f554ade.jpg[/img]

·Validation 可对安装配置校验。

[img]http://dl.iteye.com/upload/attachment/357917/ea3ca1d2-817b-3aad-9607-105cc03275fb.jpg[/img]

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

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

[img]http://dl.iteye.com/upload/attachment/357935/763f24d8-b985-375f-bd94-5fbccb4f0d86.jpg[/img]

其它略。

四、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!"

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

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

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服务[color=red]发布描述文件deploy.wsdd[/color]

<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


你会发现目录下多了一个[color=red]server-config.wsdd[/color]文件,这就是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_("[email protected]");
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)

[img]http://dl.iteye.com/upload/attachment/358040/1a96f0a2-1444-314e-8b96-b9cec2b60628.jpg[/img]
[color=red]看一下deploy.wsdd(部署service用到)[/color]

<!-- 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

[color=blue]AdminClient 首先会在axis.jar所在应用下的WEB-INF文件夹下创建一个webservice配置文件server-config.wsdd,并且根据wsdd文件的配置将我们的webservice加入到这个配置文件中。如果server-config.wsdd已经存在则不会创建,会修改这个文件将新的service 配置到server-config.wsdd文件中。[/color]
[color=red]即:会在WEB-INF下生成server-config.wsdd文件,这个就是axis的服务配置文件,对外提供service描述。[/color]

<!-- 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;
}


服务端和客户端的代码、配置就是如此。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章