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


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