注:紅色部分爲我添加的。
axis支持三種web service的部署和開發,分別爲:
1.Dynamic Invocation Interface ( DII)
2.Stubs方式
1.Dynamic Invocation Interface ( DII)
2.Stubs方式
使用dii的方式:
1.編寫服務端程序HelloService
public class HelloService{
public String getName(String name)
{
return "Welcome to Axis, "+name;
}
}
2.將源碼拷貝到AXIS_HOME下,重命名爲 HelloService.jws
3.訪問連接http://localhost:8080/axis/HelloService.jws?wsdl,頁面顯示axis自動生成的wsdl(並且在axis\WEB-INF\jwsClasses 生成HelloService.class類文件)
4.編寫訪問服務的客戶端 HelloClient.java,編譯,執行,在命令提示行下會看到 "return value is Welcome to Axis ,fengshan"
public class HelloService{
public String getName(String name)
{
return "Welcome to Axis, "+name;
}
}
2.將源碼拷貝到AXIS_HOME下,重命名爲 HelloService.jws
3.訪問連接http://localhost:8080/axis/HelloService.jws?wsdl,頁面顯示axis自動生成的wsdl(並且在axis\WEB-INF\jwsClasses 生成HelloService.class類文件)
4.編寫訪問服務的客戶端 HelloClient.java,編譯,執行,在命令提示行下會看到 "return value is Welcome to Axis ,fengshan"
public class HelloClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/axis/HelloService.jws";
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
call.setOperationName(new QName(
"http://localhost:8080/axis/HelloService.jws", "getName"));
call.setTargetEndpointAddress(new java.net.URL(endpoint));
String ret = (String) call.invoke(new Object[] { "fengshan" });
System.out.println("return value is " + ret);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/axis/HelloService.jws";
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
call.setOperationName(new QName(
"http://localhost:8080/axis/HelloService.jws", "getName"));
call.setTargetEndpointAddress(new java.net.URL(endpoint));
String ret = (String) call.invoke(new Object[] { "fengshan" });
System.out.println("return value is " + ret);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
總結:dii方式比較簡單,服務器端暴露一個類,客戶端通過固定的方式(套路來訪問服務器提供的服務)
服務器:寫一個類,裏面有一個業務方法,然後將後綴名字從java改成jws
客戶端:1.構造連接地址:http://localhost:8080/axis/HelloService.jws (ip+路徑+類名.jws)
2.構造vservice對象,掉用service對象的createCall()方法返回call對象
3.調用call對象的etOperationName()方法設置訪問webservice資源的參數
4.調用call對象的invoke()方法,並且傳遞對象數組,字符串類型,(通過wsdl可以觀察出request和response的參數,根據這些表述,來設置請求參數和接受返回數據)
使用Stubs方式:
1.服務器端仍然使用HelloService.java,編譯後將他放在axis\WEB-INF\classes下
2.編寫deploy.wsdd文件,聲明服務器端需要發佈的webservice的名字,和她的方法(放在web-inf目錄下)
deploy.wsdd內容:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="HelloService" provider="java:RPC">
<parameter name="className"
value="HelloService"/>
<parameter name="allowedMethods" value="*"/> <!---這裏也可以填寫需要暴露的方法的名字->
</service>
</deployment>
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="HelloService" provider="java:RPC">
<parameter name="className"
value="HelloService"/>
<parameter name="allowedMethods" value="*"/> <!---這裏也可以填寫需要暴露的方法的名字->
</service>
</deployment>
3.切換到deploy.wsdd所在目錄,運行java org.apache.axis.client.AdminClient deploy.wsdd,如果部署成功,會輸出<Admin>Done processing</Admin>信息。可以點擊http://localhost:8080/axis瀏覽器中List來查看所發佈的服務。
4.接下來客戶端測試該服務。
首先,在環境變量中設置CLASSPATH,加入以下jar:%AXIS_LIB%\axis.jar;
%AXIS_LIB%\axis-ant.jar;
%AXIS_LIB%\commons-discovery.jar;
%AXIS_LIB%\commons-logging.jar;
%AXIS_LIB%\jaxrpc.jar;
%AXIS_LIB%\saaj.jar;
%AXIS_LIB%\log4j-1.2.8 .jar;
%AXIS_LIB%\wsdl4j.jar
可以通過以下命令查看是否設置好了CLASSPATH:Echo %CLASSPATH%。
Axis提供了實現WSDL2Java的命令行工具org.apache.axis.wsdl.WSDL2Java,利用這個工具可以從WSDL地址處生成Java代碼。命令如下:(在axis目錄下)
java org.apache.axis.wsdl.WSDL2Java -Nhttp://localhost:8080/axis/services/HelloService=com http://localhost:8080/axis/services/HelloService?wsdl
會在com(由上述命令行中參數設定)包下生成HelloService.java、HelloServiceService.java、HelloServiceServiceLocator.java和HelloServiceSoapBindingStub.java四個文件。
5.編寫測試類(在axis目錄下)
首先,在環境變量中設置CLASSPATH,加入以下jar:%AXIS_LIB%\axis.jar;
%AXIS_LIB%\axis-ant.jar;
%AXIS_LIB%\commons-discovery.jar;
%AXIS_LIB%\commons-logging.jar;
%AXIS_LIB%\jaxrpc.jar;
%AXIS_LIB%\saaj.jar;
%AXIS_LIB%\log4j-
%AXIS_LIB%\wsdl4j.jar
可以通過以下命令查看是否設置好了CLASSPATH:Echo %CLASSPATH%。
Axis提供了實現WSDL2Java的命令行工具org.apache.axis.wsdl.WSDL2Java,利用這個工具可以從WSDL地址處生成Java代碼。命令如下:(在axis目錄下)
java org.apache.axis.wsdl.WSDL2Java -Nhttp://localhost:8080/axis/services/HelloService=com http://localhost:8080/axis/services/HelloService?wsdl
會在com(由上述命令行中參數設定)包下生成HelloService.java、HelloServiceService.java、HelloServiceServiceLocator.java和HelloServiceSoapBindingStub.java四個文件。
5.編寫測試類(在axis目錄下)
public class HelloClient
{
public static void main(String[] args)
{
try
{
com.HelloServiceServiceLocator locator=new com.HelloServiceServiceLocator();
com.HelloService service=locator.getHelloService();
System.out.println(service.getName("fengshan"));
}
catch(Exception e)
{
System.err.println("Execution failed.Exception:"+e);
}
}
}
{
public static void main(String[] args)
{
try
{
com.HelloServiceServiceLocator locator=new com.HelloServiceServiceLocator();
com.HelloService service=locator.getHelloService();
System.out.println(service.getName("fengshan"));
}
catch(Exception e)
{
System.err.println("Execution failed.Exception:"+e);
}
}
}
總結:Stubs方式主要是服務器端使用deploy.wsdd 文件,寫好需要暴露的webservice的名字和其中的方法,使用 java org.apache.axis.client.AdminClient deploy.wsdd 將她部署在服務器上供外界調用,而外界使用 java org.apache.axis.wsdl.WSDL2Java -Nhttp://localhost:8080/axis/services/HelloService=com http://localhost:8080/axis/services/HelloService?wsdl 將遠端的webservice映射成本地類,供自己使用
使用步驟:
1. 在獲得自動映射的4個類以後,new一個 loctor對象,這個對象實現了 一個接口(HelloServiceService ),調用接口種的方法getHelloService()獲得一個service對象,然後用這個對象調用webservice暴露的方法會得到一個返回值(String).
我們自己也可以簡單寫一個客戶端來調用:
public class HelloWorldClient1 {
public static void main(String[] args) {
try {
Service service = new Service();
String Url = "http://localhost:8080/axis/services/HelloService";
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(Url);
call.setOperationName(new QName(Url, "getName"));
String result = (String) call.invoke(new Object[] { "winwin" });
System.out.println(result);
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
其實上面四個自動生成的java文件也就是像以上這個客戶端這樣來調用的。可以對照看看。
public static void main(String[] args) {
try {
Service service = new Service();
String Url = "http://localhost:8080/axis/services/HelloService";
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(Url);
call.setOperationName(new QName(Url, "getName"));
String result = (String) call.invoke(new Object[] { "winwin" });
System.out.println(result);
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
其實上面四個自動生成的java文件也就是像以上這個客戶端這樣來調用的。可以對照看看。