加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 21:55:57 所属栏目:安全 来源:网络整理
导读:在使用WebService作为项目的数据源时,希望报表中也是直接调用这个WebService数据源,而不是定义数据连接调用对应的数据库表,这样要怎么实现呢? 在程序中访问WebService应用服务,将WebService返回的数据转为程序数据集,然后在设计器中调用。 以axis1.4上

在使用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,放在Tomcatwebappsaxis即可。

在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六个包,可以在zxisWEB-INFlib下找到。

将获得数据转为程序数据集

访问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服务器,点击预览,效果如下:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读