在使用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服務器,點擊預覽,效果以下: