1. 程式人生 > >使用Axis2實現WebService的釋出和呼叫

使用Axis2實現WebService的釋出和呼叫

一、Axis2簡介:

Axis2是一套嶄新的WebService引擎,該版本是對Axis1.x重新設計的產物。Axis2不僅支援SOAP1.1和SOAP1.2,還集成了非常流行的REST WebService,同時還支援Spring、JSON等技術。在本文中主要介紹瞭如何使用Axis2開發一個不需要任何配置檔案的WebService,並在客戶端使用Java呼叫這個WebService。

二、Axis2下載安裝:

 在本文使用了目前Axis2的最新版本1.6.4。讀者可以下載如下兩個zip包:   

   axis2-1..6.4-bin.zip     

   axis2-1.6.4-war.zip 
   

其中 axis2-1.6.4-bin.zip 檔案中包含了Axis2中所有的jar檔案,axis2-1.6.4-war.zip 檔案用於將WebService釋出到Web容器中。

將 axis2-1.6.4-war.zip 檔案解壓到相應的目錄,將目錄中的axis2.war檔案放到Tomcat伺服器的webapps目錄中(本文使用的Tomcat的版本是7.x),並啟動Tomcat。 

在瀏覽器位址列中輸入如下的URL:     http://localhost:8080/axis2/ 

如果在瀏覽器中顯示出如下所示的頁面,則表示Axis2安裝成功。


三、編寫和釋出WebService

在Axis2中不需要進行任何的配置,就可以直接將一個簡單的POJO釋出成WebService。其中POJO中所有的public方法將被髮布成WebService方法。

新建一個Java工程Axis2_1,直接點選src右鍵新建一個名為 SimpleService 的類,這樣建好的Java檔案會預設放在 default package中,在Java程式碼中將不會出現package 定義語句 (這很重要,因為釋出webservice服務的class檔案不能使用package關鍵字宣告包)


SimpleService類:

import java.util.Random;
//注意:無package包宣告
public class SimpleService {
    
	public  String getGreeting(String name){
		return "Hello " + name;
	}
	
	public int getPrice(){
		return new Random().nextInt(100);
	}
}
在SimpleService類中有兩個方法,由於這兩個方法都是public方法,因此,它們都將作為WebService方法被髮布

 編譯SimpleService類後,將SimpleService.class檔案放到Tomcat容器的webapps\axis2\WEB-INF\pojo目錄中(如果沒有pojo目錄,則新建該目錄)。現在我們已經成功將SimpleService類釋出成了WebService。在瀏覽器位址列中輸入如下的URL: 
http://localhost:8080/axis2/services/listServices ,如果成功釋出,則出現下圖:


注意事項:

1. POJO類不能使用package關鍵字宣告包。 
2. Axis2在預設情況下可以熱釋出WebService,也就是說,將WebService的.class檔案複製到pojo目錄中時,Tomcat不需要重新啟動就可以自動釋出WebService。如果想取消Axis2的熱釋出功能,可以開啟\webapps\axis2\WEB-INF\conf\axis2.xml,找到如下的配置程式碼:

<parameter name="hotdeployment">true</parameter>
將true改為false即可。要注意的是,Axis2在預設情況下雖然是熱釋出,但並不是熱更新,也就是說,一旦成功釋出了WebService,再想更新該WebService,就必須重啟Tomcat。這對於開發人員除錯WebService非常不方便,因此,在開發WebService時,可以將Axis2設為熱更新,同樣在axis2.xml檔案中找到如下配置:
<parameter name="hotupdate">false</parameter>
將false改為true 即可

 3. 釋出WebService的pojo目錄只是預設的,如果想在其他的目錄釋出WebService,可以開啟axis2.xml檔案,並在<axisconfig>元素中新增如下的子元素:

<deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/>
directory屬性的值 設定為你的釋出目錄即可

四、Java呼叫WebService

匯入用到的jar包:

axiom-api-1.2.15.jar
axiom-impl-1.2.15.jar
axis2-adb-1.6.4.jar
axis2-kernel-1.6.4.jar
axis2-transport-http-1.6.4.jar
axis2-transport-local-1.6.4.jar
commons-codec-1.3.jar
commons-httpclient-3.1.jar
commons-logging-1.1.1.jar
httpcore-4.0.jar
neethi-3.0.2.jar
wsdl4j-1.6.2.jar
XmlSchema-1.4.7.jar

Java呼叫程式碼(RPC方式):

public class RPCClient {
	
    public static String address="http://localhost:8080/axis2/services/SimpleService";
	
    public static void main(String[] args) throws IOException{
		
    	Object[] result=invoke("getPrice", new Object[]{}, new Class[]{int.class});
    	System.out.println(result[0]);
    	result=invoke("getGreeting", new Object[]{"jack"}, new Class[]{String.class});
    	System.out.println(result[0]);
	}
    
        @SuppressWarnings("rawtypes")
	public static Object[] invoke(String method,Object[] params,Class[] classes) throws AxisFault{
    	//使用RPC方式呼叫WebService
    	RPCServiceClient client=new RPCServiceClient();
    	Options option=client.getOptions();
    	
    	//指定呼叫的URL
    	EndpointReference reference=new EndpointReference(address);
    	option.setTo(reference);
    	
    	/*
    	 * 設定要呼叫的方法
    	 * http://ws.apache.org/axis2 為預設的(無package的情況)名稱空間,
    	 * 如果有包名,則為 http://axis2.webservice.elgin.com ,包名倒過來即可
    	 * method為方法名稱
    	 * 
    	 */
    	QName  qname=new QName("http://ws.apache.org/axis2", method);
    	
    	//呼叫遠端方法,並指定方法引數以及返回值型別
    	Object[] result=client.invokeBlocking(qname,params,classes);
    	
    	return result;
    	
    }
輸出結果:

五、Java複雜資料的呼叫處理

在default package下新建返回複雜型別的WebService類

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import com.elgin.webservice.axis2.User;

public class ComplexTypeServices {
    
	/**
	* @Title: upload
	* @Description: 檔案資料處理
	* @param b
	* @param len
	* @return    引數
	*/
	public String upload(byte[] b ,int len){
		FileOutputStream fos=null;
		String path="";
		try {
			String dir=System.getProperty("user.dir");
			File file=new File(dir + "/" + new Random().nextInt(1000) + ".jsp");
			fos=new FileOutputStream(file);
			fos.write(b , 0 ,len);
			path=file.getAbsolutePath();
			System.out.println("File path:" + path);
		} catch (Exception e) {
			
		} finally{
			try {
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return path;
	}
	
	/**
	* @Title: getArray
	* @Description: 返回一維陣列
	* @param i      陣列長度
	* @return       引數
	*/
	public int[] getArray(int i){
		int[] arr=new int[i];
		for (int j = 0; j < arr.length; j++) {
			arr[j]=new Random().nextInt(100);
		}
		return arr;
	}
	
	
	/**
	* @Title: getTwoArray
	* @Description: 返回二維陣列
	* @return    引數
	*/
	public String[][] getTwoArray(){
		return new String[][]{{"北京","上海"},{"南京","蘇州"},{"深圳","廈門"},{"西安","蘭州"}};
	}
	
	
	/**
	* @Title: getUser
	* @Description: 返回JavaBean物件
	* @return    引數
	*/
	public User getUser(){
		User user=new User();
		user.setUsername("elgin");
		user.setAge(26);
		user.setEmail("[email protected]");
		return user;
	}
}
User類:
package com.elgin.webservice.axis2;

public class User implements Serializable{
        private static final long serialVersionUID = 1L;
	private String username;
	private int age;
	private String email;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", age=" + age + ", email=" + email + "]";
	}
}
編譯完成之後,將上述ComplexTypeServices類的class檔案放到Tomcat容器的webapps\axis2\WEB-INF\pojo目錄下,在Tomcat的webapps/axis2工程下的classes檔案中新建檔案路徑:com/elgin/webservice/axis2  (User的包路徑) ,然後將User的class檔案放到此資料夾下,重啟Tomcat,訪問

http://localhost:8080/axis2/services/listServices   可以看到釋出成功了,在list中有 ComplexTypeServices這個服務


逐一呼叫各個方法:

package com.elgin.webservice.axis2;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;


public class RPCClient {
	
	public static String address="http://localhost:8080/axis2/services/SimpleService";
	public static String address1="http://localhost:8080/axis2/services/ComplexTypeServices";
	
    public static void main(String[] args) throws IOException{
		
    	testUpload();
    	testArray();
    	testTwoArray();
    	testUser();
    	
	}
    
    @SuppressWarnings("rawtypes")
	public static Object[] invoke(String method,Object[] params,Class[] classes) throws AxisFault{
    	//使用RPC方式呼叫WebService
    	RPCServiceClient client=new RPCServiceClient();
    	Options option=client.getOptions();
    	
    	//指定呼叫的URL
    	EndpointReference reference=new EndpointReference(address1);
    	option.setTo(reference);
    	
    	/*
    	 * 設定要呼叫的方法
    	 * http://ws.apache.org/axis2 為預設的(無package的情況)名稱空間,
    	 * 如果有包名,則為 http://axis2.webservice.elgin.com ,包名倒過來即可
    	 * method為方法名稱
    	 * 
    	 */
    	QName  qname=new QName("http://ws.apache.org/axis2", method);
    	
    	//呼叫遠端方法,並指定方法引數以及返回值型別
    	Object[] result=client.invokeBlocking(qname,params,classes);
    	
    	return result;
    	
    }
    
    public static void testUpload() throws IOException{
    	String dir=System.getProperty("user.dir");
    	File file=new File(dir +"/WebContent"+ "/hello.jsp");
    	FileInputStream fis=new FileInputStream(file);
    	int len=(int) file.length();
    	byte[] b=new byte[len];
    	int read=fis.read(b);
    	fis.close();
    	Object[] result=invoke("upload", new Object[]{b,read}, new Class[]{String.class});
    	System.out.println(result[0]);
    }
    
    public static void testArray() throws AxisFault{
    	Object[] result=invoke("getArray", new Object[]{5}, new Class[]{int[].class});
    	int[] arr=(int[]) result[0];
    	for (int i : arr) {
    		System.out.println(i );
		}
    }
    
    public static void testTwoArray() throws AxisFault{
    	Object[] result=invoke("getTwoArray", new Object[]{}, new Class[]{String[][].class});
    	String[][] arr=(String[][]) result[0];
    	for (String[] strings : arr) {
			for (String str : strings) {
				System.out.println(str);
			}
		}
    }
    
    public static void testUser() throws AxisFault{
    	Object[] result=invoke("getUser", new Object[]{}, new Class[]{User.class});
    	User user=(User) result[0];
    	System.out.println(user.toString());
    }
    
}

呼叫結果:


相關推薦

WebService—CXF整合Spring實現介面釋出呼叫過程

CXF整合Spring實現介面釋出 釋出過程如下: 1、引入jar包(基於maven管理) <dependency> <groupId>org.apache.cxf</groupId> <artifactId>

CXF非同步WebService釋出呼叫

最近工作需要接觸CXF非同步webservice的釋出和呼叫,在網上Google並搗鼓了好一陣子,總算成功了。畢竟這方面的資料比較少,自己總結一下寫下這篇博文。本文將描述如何利用CXF來發布和呼叫非同步的webservice,通過一個示例,帶大家一步一步開發基於

WebService學習之旅(六)使用Apache Axis2實現WebService客戶端呼叫

上節介紹瞭如何使用Axis2 釋出一個WebService,Axis2除了為我們編寫WebService應用帶來了便利,也同樣簡化的客戶端呼叫的過程,本節在上節的基礎上使用Axis2自帶的工具生成客戶端呼叫輔助類,並實現客戶端呼叫程式碼的編寫。 1.將前面下載

使用Axis2實現WebService釋出呼叫

一、Axis2簡介: Axis2是一套嶄新的WebService引擎,該版本是對Axis1.x重新設計的產物。Axis2不僅支援SOAP1.1和SOAP1.2,還集成了非常流行的REST WebService,同時還支援Spring、JSON等技術。在本文中主要介紹瞭如何使

webService總結(一)——使用CXF釋出呼叫webService(不使用Spring)

 CXF和Axis2是兩個比較流行的webService框架,接下來我會寫幾篇部落格簡單介紹如何使用這兩種框架。首先,先簡單介紹一下CXF的使用。 CXF釋出webService有多種方法,這裡我介

CXF開發webservice需要的最少jar包,CXF釋出呼叫客戶端程式碼

簡單介紹一下cxf開發客戶端和服務端的程式碼塊 釋出服務端程式碼: Java程式碼   @WebService publicinterface ApprovalService {       /**       * 3.1.10.  審批結果回撥介面       * @param status

springboot2.0+dubbo整合分散式服務釋出呼叫

       最近專案上要對以前的老專案做分散式的整改,因此我專門花了點時間研究下當前比較熱門的dubbo和springboot結合使用,以前使用過dubbo,但是沒有與springboot結合過,在網上查了點資料,感覺要麼是springboot版本過低,要麼是dubb

使用axis2實現webService

        實現webService有多種實現方式,基於CXF和axis2都可以實現,但是該選擇哪種實現方式呢?         1:如果應用程式需要多語言的支援,Axis2 應當是首選了         2:如果應用程式是遵循 Spring 哲學路線的話,Apach

dubbo釋出呼叫服務

1.釋出服務    <!-- 宣告需要暴露的服務介面 -->     <dubbo:protocol  name="dubbo" port="9092"/>     <dubbo:service interface="IConfigReadSe

webservice服務端釋出客戶端呼叫

1.服務端和客戶端增加Maven依賴包,如下 <!-- cxf方式webservice服務 --> <dependency>             <group

webservice服務端釋出呼叫 JAX-WS cxf axis2

之前專案中需要用到webservice的釋出最後做出了幾個例子如下: 1 基礎 JAX-WS例項 介面釋出: package com.test; import javax.jws.WebMethod; import javax.jws.WebSer

利用Axis2開發WebService(3)---用Java實現呼叫WebService的客戶端程式

WebService是為程式服務的,只在瀏覽器中訪問WebService是沒有意義的。因此,在本節使用Java實現了一個控制檯程式來呼叫上一節釋出的WebService。呼叫WebService的客戶端程式碼如下: package client; impor

SpringBoot整合cxf釋出WebService服務客戶端呼叫WebService服務

最近在做公司專案的一個功能需要寫WebSerice介面,為了系統得學習WebService,決定寫一個測試介面的例子。 測試專案中使用的是SpringBoot(spring整合cxf需新增cxf-rt-frontend-jaxws,cxf-rt-transpo

axis2 WebService釋出呼叫及部分異常

webservice實現也是Http請求,只是傳輸的內容是soap協議的xml檔案。只要是認清了這個就發現可以用多種方式去呼叫介面,如JS、URLConnection(可參考:https://www.cnblogs.com/yolanda-lee/p/490

Maven+SpringMVC+CXF整合實現webservice服務的釋出呼叫

今天有時間把之前遺留的內容給寫一下,一直想把webservice服務的釋出整合說一下,但是總是忘記了,最近有做了一些關於這一塊的東西,就總結下,來記錄一下。 簡述: WebService開源框架的選擇, 目前主流的Web Service框架主要有3種: Axis 2, CX

Axis2 WebService(配置、釋出呼叫)

準備工作 1、下載:axis2-1.5.4-bin.zip,axis2-1.5.4-war.zip 下載地址:http://axis.apache.org/axis2/java/core/ 2、環境變數設定 AXIS2_HOME E:\research\axis2-1.

Java Axis2釋出呼叫webservice介面

package MZ.GetWebService; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; imp

Win7下面實現釋出WebService程式開發

Win7下面實現釋出WebService程式 1、生成WebService程式 點選該專案的右鍵選擇“釋出”,首先將寫好的WebService程式釋出到本地的一個資料夾中,如下圖所示: 2、IIS下建立虛擬目錄 開啟IIS伺服器,在預設網站目錄下面建立建立一個虛擬目錄,

CXF實現WebService對物件XML檔案的釋出

搭建工程前文以及介紹 1..........................建立POJO類User.java package ObjectInterface; public class User { private String username; private S

SpringBoot | CXF釋出WebService服務客戶端呼叫WebService服務

一、引入maven依賴 <!-- cxf支援 --> <dependency> <groupId>org.apache.cxf</groupId> <art