| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1147 人关注过本帖
标题:FineReport中以jws方式调用WebService数据源方案
只看楼主 加入收藏
kaqima
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2016-3-15
结帖率:0
收藏
 问题点数:0 回复次数:0 
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,得到返回的数据,代码如下:
程序代码:
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 (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 (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服务器,点击预览,效果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 数据库表 public 数据源 工程 
2017-01-11 13:43
快速回复:FineReport中以jws方式调用WebService数据源方案
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043562 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved