1. 概述
1.1 应用场景
在使用 WebService 作为项目的数据源时,希望报表中可以直接调用 WebService 数据源,而不是定义数据连接调用对应的数据库表,这样要怎么实现呢?
1.2 实现原理
在程序中访问 WebService 应用服务,将 WebService 返回的数据转为程序数据集,然后在设计器中调用。本文示例通过jws 方式直接访问 WebService 数据源。
2. 示例
在 Axis1.4 工程中以 jws 方式发布一个 WebService,然后在 Java 中发送一个 soap 请求,访问*.jws 这个 WebService,得到返回的数据。
2.1 准备 WebService 数据源
2.1.1 准备 axis 服务器
若您已有搭建好的 axis 服务器,请忽略此步骤。
1)用户自行下载并安装 JDK 和 Web 应用服务器来配置部署的环境,本文示例使用 Tomcat 服务器部署,所以部署前提前准备好了一个 Tomcat 服务器。
2)在 axis 官网下载部署包,本文示例使用 axis1.4: axis-bin-1_4.zip, 解压后将 webapps/axis 目录复制到 %TOMCAT_HOME%/webapps/下,然后启动 Tomcat,浏览器输入服务器访问网址可以访问即成功。如下使用本地服务器,浏览器输入URL: http://localhost:8080/axis/,出现 axis 页面,则部署成功。
2.1.2 发布 WebService 应用服务
Tomcat 下的 axis 工程中以 jws 方式发布一个 WebService 应用服务 TestWS2TDClient.jws,返回一个数组数据。
1)新建 TestWS2TDClient.java 文件,内容如下:
public class TestWS2TDClient {
public String[][] getTD() {
String[][] a = { { "城市", "销售员", "销售额" }, { "江苏", "Anna", "230" }, { "江苏", "Alex", "190" },
{ "江苏", "Jack", "320" }, { "江苏", "Apple", "210" }, { "浙江", "Faye", "150" }, { "浙江", "Sammi", "280" } };
return a;
}
}
2)将写好的 TestWS2TDClient.java 文件重命名为TestWS2TDClient.jws,编码格式为 GBK,放在%Tomcat_HOME%\webapps\axis\目录下。即将以上数据发布为 WebService 应用服务。如下图所示:
3)访问http://localhost:8080/axis/TestWS2TDClient.jws,如下图所示:
点击 Click to see the WSDL,显示出内容,则发布成功。如下图所示:
注:若出现报错,提示需要 tools.jar,那么就将 JDK 下面的 tools.jar 放到 axis 的 lib 文件夹中。
2.2 定义程序数据源
2.1 节准备好了 WebService 数据源,接下来可以直接在 JAVA 中发送一个 SOAP 请求,访问 TestWS2TDClient.jws 这个 WebService,得到返回的数据。定义 WebServiceTableData.java 类,扩展 AbstractTableData,将获得的数组数据转为程序数据集。
2.2.1 准备编译环境
编译程序前,需先创建一个 Java 工程环境,并且需要一个 Java 编辑器,如 Eclipse 或 idea 。
在编辑器工程中导入 FineReport 工程 JAR 包。包括安装的报表工程
%FR_HOME%/lib下的所有的包,
%FR_HOME%/server/lib 下的所有包,
%FR_HOME%/webapps/webroot/WEB-INF/lib下的所有包,
还要引入 JDK 下的的 tools.jar,
还需要引入%AXIS_HOME%/web-inf/lib下面的 JAR 包,
详细操作可参考:编译Java程序
2.2.2 编写 Java 程序
在 JAVA 中发送一个 SOAP 请求,访问 TestWS2TDClient.jws 这个 WebService,得到返回的数据。代码如下:
注:SOAP 即简单对象访问协议,客户端发送一个请求,调用相应的对象, 然后服务器返回结果。这些消息是 XML 格式的,并且封装成符合 HTTP 协议的消息。
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();
}
访问 WebService 后,该服务会返回数据给客户端,该例中返回一个字符串数组。定义 WebServiceTableData.java 类,扩展 AbstractTableData,将获得的数组数据转为程序数据集。完整代码请参见:
2.2.3 编译 Java 文件
Java 程序编写完成后,在编译器中编译 WebServiceTableData.java ,编译通过后,将会在编译器对应工程文件存储路径下生成 WebServiceTableData.class 类文件。如下图所示:
将编译好的 WebServiceTableData.class 文件拷贝到%FR_HOME%/webapps/webroot/WEB-INF/classes/com/fr/data文件夹下。如下图所示:
注:远程设计时,本地设计器和远程服务器的工程下都需要放置程序数据集对应的 class 文件。
2.3 创建程序数据集
将 %AXIS_HOME%/web-inf/lib下面的 JAR 包(除了log4j-1.2.8.jar,会冲突),拷贝到报表工程%FR_HOME%/webapps/webroot/WEB-INF/lib 下,拷贝成功后重启工程,即完成报表环境引用第三方 JAR 包。如将 axis 下的 JAR 包拷贝到设计器%FR_HOME%/webapps/webroot/WEB-INF/lib 下,拷贝成功后重启设计器。
设计器打开后,新建模板,点击模板数据集下面的加号,选择「程序」数据集,在弹出的程序数据集对话框中,选择对应的 class 文件,如下图所示:
选定 class 文件后,点击保存后即完成了程序数据源配置。
2.4 使用程序数据集
配置好程序数据源后便可以使用自定义的程序数据集,与其他类型的数据集使用方法相同,可以通过拖拽方法实现单元格数据列绑定。如下图所示:
注:使用程序数据集时,axis 服务器为启动状态。