在使用WebService作為項(xiàng)目的數(shù)據(jù)源時,希望報表中也是直接調(diào)用這個WebService數(shù)據(jù)源,而不是定義數(shù)據(jù)連接調(diào)用對應(yīng)的數(shù)據(jù)庫表,這樣要怎么實(shí)現(xiàn)呢?
在程序中訪問WebService應(yīng)用服務(wù),將WebService返回的數(shù)據(jù)轉(zhuǎn)為程序數(shù)據(jù)集,然后在設(shè)計(jì)器中調(diào)用。
以axis1.4上的WebService為例,介紹其取數(shù)方式以及將數(shù)據(jù)轉(zhuǎn)換為WebService的程序數(shù)據(jù)集的過程。
WebService應(yīng)用服務(wù)
如在Tomcat下的Axis工程中以jwa方式發(fā)布了一個WebService應(yīng)用服務(wù)下TestWS2TDClient.jws,返回一個數(shù)組數(shù)據(jù),如下:
public class TestWS2TDClient {
public String[][] getTD() {
String[][] a = {{"城市", "銷售員", "銷售額"},{"江蘇", "Anna", "230"},{"江蘇", "Alex", "190"},{"江蘇","Jack","320"},{"江蘇","Apple","210"},{"浙江","Faye","150"},{"浙江","Sammi","280"}};
return a;
}
}
以jws方式發(fā)布WebService:將寫好的TestWS2TDClient.java文件重命名TestWS2TDClient.jws,放在Tomcat\webapps\axis即可。
在java類中訪問WebService數(shù)據(jù)源
Java中發(fā)布一個soap請求,訪問TestWS2TDClient.java,得到返回的數(shù)據(jù),代碼如下:

try
{
String endpoint = "http://localhost:8080/axis/TestWS2TDClient.jws";
Service service = new Service(); //創(chuàng)建一個服務(wù)(service)調(diào)用(call)
Call call = (Call) service.createCall(); // 通過service創(chuàng)建call對象
call.setTargetEndpointAddress(new java.net.URL(endpoint)); // 設(shè)置service所在URL
call.setOperationName(new QName("http://localhost:8080/axis/TestWS2TDClient.jws","getTD")); // 調(diào)用service中的getTD方法

String[][] ret = (String[][])call.invoke(new Object[]
{}); // getTD方法沒有參數(shù),因此傳一個空的對象,得到service中g(shù)etTD返回的數(shù)據(jù)
return ret;

} catch (Exception e)
{
e.printStackTrace();
}
Soap即簡單對象訪問協(xié)議,客戶端發(fā)送一個請求,調(diào)用相應(yīng)的對象,然后服務(wù)器返回結(jié)果。這些消息是XML格式的,并且封裝成符合HTTP協(xié)議的消息。
在此期間需要引入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下找到。
將獲得數(shù)據(jù)轉(zhuǎn)為程序數(shù)據(jù)集
訪問WebService后,該服務(wù)會返回?cái)?shù)據(jù)給客戶端,該例中返回一個字符串?dāng)?shù)組。定義WebServiceTableData.java類,擴(kuò)展AbstractTableData,將獲得的數(shù)組數(shù)據(jù)轉(zhuǎn)為程序數(shù)據(jù)集。完整代碼如下:
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();
}

//獲取列數(shù)

public int getColumnCount() throws TableDataException
{
return data[0].length;
}

//獲取列的名稱為數(shù)組中第一行的值

public String getColumnName(int columnIndex) throws TableDataException
{
return data[0][columnIndex];
}

//獲取行數(shù)為數(shù)據(jù)的長度-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文件夾下。
設(shè)計(jì)器中調(diào)用程序數(shù)據(jù)集
新建報表,定義數(shù)據(jù)集,選擇程序數(shù)據(jù)集,選擇定義好的程序數(shù)據(jù)集WebServiceTableData.class,自定義數(shù)據(jù)集的名稱為ds1,啟動tomcat服務(wù)器,點(diǎn)擊預(yù)覽,效果如下: