FineReport中以jws方式调用WebService数据源方案

在使用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,得到返回的数据,代码如下:

点击(此处)折叠或打开

  1. try {
  2.     String endpoint = "http://localhost:8080/axis/TestWS2TDClient.jws";
  3.     Service service = new Service(); //创建一个服务(service)调用(call)
  4.     Call call = (Call) service.createCall(); // 通过service创建call对象
  5.     call.setTargetEndpointAddress(new java.net.URL(endpoint)); // 设置service所在URL
  6.     call.setOperationName(new QName("http://localhost:8080/axis/TestWS2TDClient.jws","getTD")); // 调用service中的getTD方法
  7.     String[][] ret = (String[][])call.invoke(new Object[] {}); // getTD方法没有参数,因此传一个空的对象,得到service中getTD返回的数据
  8.     return ret;
  9. } catch (Exception e) {
  10.     e.printStackTrace();
  11. }

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,将获得的数组数据转为程序数据集。完整代码如下:

点击(此处)折叠或打开

  1. package com.fr.data;

  2. import javax.xml.namespace.QName;
  3. import org.apache.axis.client.Call;
  4. import org.apache.axis.client.Service;
  5. import com.fr.data.AbstractTableData;
  6. import com.fr.general.data.TableDataException;

  7. public class WebServiceTableData extends AbstractTableData{
  8.     private String[][] data;
  9.     
  10.     public WebServiceTableData() {
  11.         this.data = this.getData();
  12.     }

  13.     //获取列数
  14.     public int getColumnCount() throws TableDataException {
  15.         return data[0].length;
  16.     }

  17.     //获取列的名称为数组中第一行的值
  18.     public String getColumnName(int columnIndex) throws TableDataException {
  19.         return data[0][columnIndex];
  20.     }

  21.     //获取行数为数据的长度-1
  22.     public int getRowCount() throws TableDataException {
  23.         return data.length - 1;
  24.     }

  25.     //获取值
  26.     public Object getValueAt(int rowIndex, int columnIndex) {
  27.         return data[rowIndex + 1][columnIndex];
  28.     }

  29.     public String[][] getData() {
  30.         try {
  31.             String endpoint = "http://localhost:8080/axis/TestWS2TDClient.jws";
  32.             Service service = new Service();
  33.             Call call = (Call) service.createCall();
  34.             call.setTargetEndpointAddress(new java.net.URL(endpoint));
  35.             call.setOperationName(new QName("http://localhost:8080/axis/TestWS2TDClient.jws",
  36.                     "getTD"));
  37.             String[][] ret = (String[][])call.invoke(new Object[] {});
  38.             return ret;
  39.         } catch (Exception e) {
  40.             e.printStackTrace();
  41.         }
  42.         return new String[][] {};
  43.     }
  44. }

将编译好的class文件拷贝到%FR_HOME%/WebReport/WEB-INF/classes/com/fr/data文件夹下。

设计器中调用程序数据集

新建报表,定义数据集,选择程序数据集,选择定义好的程序数据集WebServiceTableData.class,自定义数据集的名称为ds1,启动tomcat服务器,点击预览,效果如下:


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29584979/viewspace-2132228/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29584979/viewspace-2132228/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值