FineReport中以jws方式調用WebService數據源方案

在使用WebService做爲項目的數據源時,但願報表中也是直接調用這個WebService數據源,而不是定義數據鏈接調用對應的數據庫表,這樣要怎麼實現呢?java

在程序中訪問WebService應用服務,將WebService返回的數據轉爲程序數據集,而後在設計器中調用。web

以axis1.4上的WebService爲例,介紹其取數方式以及將數據轉換爲WebService的程序數據集的過程。數據庫

WebService應用服務apache

如在Tomcat下的Axis工程中以jwa方式發佈了一個WebService應用服務下TestWS2TDClient.jws,返回一個數組數據,以下:數組

public class TestWS2TDClient {tomcat

public String[][] getTD() {服務器

String[][] a = {{"城市", "銷售員", "銷售額"},{"江蘇", "Anna", "230"},{"江蘇", "Alex", "190"},{"江蘇","Jack","320"},{"江蘇","Apple","210"},{"浙江","Faye","150"},{"浙江","Sammi","280"}};app

return a;webapp

}this

}

以jws方式發佈WebService:將寫好的TestWS2TDClient.java文件重命名TestWS2TDClient.jws,放在Tomcat\webapps\axis便可。

在java類中訪問WebService數據源

Java中發佈一個soap請求,訪問TestWS2TDClient.java,獲得返回的數據,代碼以下:

try {
	String endpoint = "http://localhost:8080/axis/TestWS2TDClient.jws";
	Service service = new Service(); //建立一個服務(service)調用(call)
	Call call = (Call) service.createCall(); // 經過service建立call對象
	call.setTargetEndpointAddress(new java.net.URL(endpoint)); // 設置service所在URL
	call.setOperationName(new QName("http://localhost:8080/axis/TestWS2TDClient.jws","getTD"));  // 調用service中的getTD方法
	String[][] ret = (String[][])call.invoke(new Object[] {}); // getTD方法沒有參數,所以傳一個空的對象,獲得service中getTD返回的數據
	return ret;
} catch (Exception e) {
	e.printStackTrace();
}

Soap即簡單對象訪問協議,客戶端發送一個請求,調用相應的對象,而後服務器返回結果。這些消息是XML格式的,而且封裝成符合HTTP協議的消息。

在此期間須要引入axis.jar、commons-discovery-0.2.jar、commons-logging-1.0.4.jar、wadl4j-a.5.a.jar、log4j-1.2.8.jar、jaxrpc.jar六個包,能夠在zxis\WEB-INF\lib下找到。

將得到數據轉爲程序數據集

訪問WebService後,該服務會返回數據給客戶端,該例中返回一個字符串數組。定義WebServiceTableData.java類,擴展AbstractTableData,將得到的數組數據轉爲程序數據集。完整代碼以下:

package com.fr.data;

import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import com.fr.data.AbstractTableData;
import com.fr.general.data.TableDataException;

public class WebServiceTableData extends AbstractTableData{
	private String[][] data;
	
	public WebServiceTableData() {
		this.data = this.getData();
	}

	//獲取列數
	public int getColumnCount() throws TableDataException {
		return data[0].length;
	}

	//獲取列的名稱爲數組中第一行的值
	public String getColumnName(int columnIndex) throws TableDataException {
		return data[0][columnIndex];
	}

	//獲取行數爲數據的長度-1
	public int getRowCount() throws TableDataException {
		return data.length - 1;
	}

	//獲取值
	public Object getValueAt(int rowIndex, int columnIndex) {
		return data[rowIndex + 1][columnIndex];
	}

	public String[][] getData() {
		try {
			String endpoint = "http://localhost:8080/axis/TestWS2TDClient.jws";
			Service service = new Service();
			Call call = (Call) service.createCall();
			call.setTargetEndpointAddress(new java.net.URL(endpoint));
			call.setOperationName(new QName("http://localhost:8080/axis/TestWS2TDClient.jws",
					"getTD"));
			String[][] ret = (String[][])call.invoke(new Object[] {});
			return ret;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new String[][] {};
	}
}

將編譯好的class文件拷貝到%FR_HOME%/WebReport/WEB-INF/classes/com/fr/data文件夾下。

設計器中調用程序數據集

新建報表,定義數據集,選擇程序數據集,選擇定義好的程序數據集WebServiceTableData.class,自定義數據集的名稱爲ds1,啓動tomcat服務器,點擊預覽,效果以下:

相關文章
相關標籤/搜索