在使用 webService 作为项目的数据源时,希望报表中也是直接调用这个 WebService 数据源,而不是定义数据连接调用对应的数据库表,这样要怎么实现呢?
在程序中访问 WebService 应用服务,将 WebService 返回的数据转为程序数据集,然后在设计器中调用。
以 axis1.4 上的 WebService 为例,介绍其取数方式以及将数据转换为 WebService 的程序数据集的过程。
WebService 应用服务
如在 Tomcat 下的 Axis 工程中以 jwa 方式发布了一个 WebService 应用服务下 TestWS2TDClient.jws,返回一个数组数据,如下:
public class TestWS2TDClient {
public String[][] getTD() {
String[][] a = {{"城市", "销售员", "销售额"},{"江苏", "Anna", "230"},{"江苏", "Alex", "190"},{"江苏","Jack","320"},{"江苏","Apple","210"},{"浙江","Faye","150"},{"浙江","Sammi","280"}};
return a;
}
}
以 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 服务器,点击预览,效果如下:
来源: