本例子的WebService提供了兩個(gè)方法,分別是sayHello和sayHelloToPerson,第一個(gè)只是返回一個(gè)"Hello"字符串,沒(méi) 有參數(shù),第二個(gè)函數(shù)接受一個(gè)字符串作為參數(shù),返回"Hello 參數(shù)值",該例子比較簡(jiǎn)單,但是清楚的說(shuō)明了從編寫(xiě)代碼到發(fā)布為WebService以及測(cè)試編寫(xiě)好的WebService全過(guò)程。
編寫(xiě)服務(wù)代碼
服務(wù)代碼提供了兩個(gè)函數(shù),分別為sayHello和sayHelloToPerson,源代碼如下:












































發(fā)布WebService
要將上邊寫(xiě)的HelloService類發(fā)布為WebService,需要先搭建Web應(yīng)用。下面是在Tomcat下使用Axis創(chuàng)建WebService服務(wù)的例子。
在Tomcat下創(chuàng)建Web應(yīng)用
在該例子中,在Tomcat下創(chuàng)建了一個(gè)context path為ws的WEB應(yīng)用。
1. 在Tomcat的webapps下創(chuàng)建如下文件系統(tǒng)
ws
WEB-INF
lib
classes
2. 在WEB-INF文件夾下創(chuàng)建web.xml文件,該文件的內(nèi)容如下:


































































































在上面的web.xml中主要是配置了axis的相關(guān)配置。
axis的相關(guān)配置
在上述的web.xml文件中已經(jīng)對(duì)axis進(jìn)行了配置,但是還需要進(jìn)行額外的配置。
復(fù)制axis相關(guān)的jar文件
將axis的相關(guān)jar文件復(fù)制到WEB-INF"lib文件夾下。這些文件包括:
activation.jar
axis.jar
axis-ant.jar
axis-schema.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
mailapi.jar
saaj.jar
wsdl4j-1.5.1.jar
xmlsec-1.3.0.jar
復(fù)制WebService服務(wù)主文件
將HelloService.java編譯后的class文件復(fù)制到WEB-INF"classes文件夾下,也就是說(shuō)在WEB-INF "classes文件夾下的文件夾結(jié)構(gòu)為:com"sinosoft"webservice,在webservice文件夾下有一個(gè) helloservice.class文件。
測(cè)試發(fā)布的Web應(yīng)用
啟動(dòng)Tomcat服務(wù),打開(kāi)IE瀏覽器,訪問(wèn)地址http:host:port/ws/services,如果看到如下界面就說(shuō)明AXIS部署成功了。
發(fā)布WebService
發(fā)布WebService需要使用現(xiàn)有的AdminService來(lái)實(shí)現(xiàn),這里我寫(xiě)了一個(gè)批處理文件來(lái)發(fā)布WebService,以后如果需要發(fā)布其他文件,只需要修改相應(yīng)的參數(shù)就可以了。
創(chuàng)建deploy.wsdd文件
文件deploy.wsdd內(nèi)容如下所示:








創(chuàng)建發(fā)布WebService服務(wù)的批處理文件
批處理文件deploywebservice.bat內(nèi)容如下:

java -cp E:"Stephen"Lib"axislib"activation.jar;E:"Stephen"Lib"axislib"axis-ant.jar;E:"Stephen"Lib"axislib"axis-schema.jar;E:"Stephen"Lib"axislib"axis.jar;E:"Stephen"Lib"axislib"commons-discovery-0.2.jar;E:"Stephen"Lib"axislib"commons-logging-1.0.4.jar;E:"Stephen"Lib"axislib"jaxrpc.jar;E:"Stephen"Lib"axislib"log4j-1.2.8.jar;E:"Stephen"Lib"axislib"mailapi.jar;E:"Stephen"Lib"axislib"saaj.jar;E:"Stephen"Lib"axislib"wsdl4j-1.5.1.jar;E:"Stephen"Lib"axislib"xmlsec-1.3.0.jar org.apache.axis.client.AdminClient -lhttp://localhost:8090/ws/services/AdminService deploy.wsdd
其中E:"Stephen"Lib"axislib是存放axis對(duì)應(yīng)的jar文件的文件夾,現(xiàn)在將所有的jar文件都加入到classpath中進(jìn)行執(zhí)行。
-l后的參數(shù)是本地要發(fā)布WebService的AdminService對(duì)應(yīng)的訪問(wèn)地址。
最后deploy.wsdd是對(duì)應(yīng)的配置文件名稱。
發(fā)布WebService服務(wù)
將deploy.wsdd文件和deploywebservice.bat文件復(fù)制到同一個(gè)文件夾下,執(zhí)行deploywebservice.bat批處理文件,就可以將deploy.wsdd中描述的Java類發(fā)布為WebService。發(fā)布完成之后在訪問(wèn)http://host:port/ws/services如下圖所示:
從上圖可以看出,發(fā)布成功后,多了一個(gè)HelloServices的服務(wù)。這樣就說(shuō)明HelloService發(fā)布成功了。
查看HelloServices的wsdl
訪問(wèn)http://host:port/ws/services/HelloServices?wsdl可以看到如下wsdl的內(nèi)容:






































































































用Java調(diào)用WebService實(shí)例
下面是用Java調(diào)用剛發(fā)布的WebService例子。

/*
* File name: TestHelloService.java
*
* Version: v1.0
*
* Created on Aug 2, 2008 9:54:10 AM
*
* Designed by Stephen
*
* (c)Copyright 2008
*/
package test.com.sinosoft.webservice;
import java.io.IOException;
import java.net.MalformedURLException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Stephen
*
* 測(cè)試調(diào)用WebService
*/
public class TestHelloService {
private static final Log log = LogFactory.getLog(TestHelloService.class);
private static final String HELLO_SERVICE_ENDPOINT = "http://localhost:8090/ws/services/HelloServices?wsdl";
public static void main(String[] args) {
TestHelloService tester = new TestHelloService();
// tester.callSayHello();
tester.callSayHelloToPerson();
}
public void callSayHello() {
try {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(
HELLO_SERVICE_ENDPOINT));
call.setOperationName(new QName("http://webservice.sinosoft.com/",
"sayHello"));
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
try {
String ret = (String) call.invoke(new Object[] {});
System.out.println("The return value is:" + ret);
return;
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
}
log.error("call sayHello service error!");
}
public void callSayHelloToPerson() {
try {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(
HELLO_SERVICE_ENDPOINT));
call.setOperationName(new QName("http://webservice.sinosoft.com/",
"sayHelloToPerson"));
call.addParameter("name", org.apache.axis.Constants.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
try {
String ret = (String) call.invoke(new Object[] { "Stephen" });
System.out.println("The return value is:" + ret);
return;
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
}
log.error("call sayHello service error!");
}
}