在通用的webservice集合中,在集合中使用wsdl取数的方式获取数据,并将数据转换为程序数据集,那么怎样通过wsdl取数并转换为程序数据集呢?

首先将wsdl获取到的数据数据转换为二维数组,然后通过FineReport的程序数据集接口,将数据导入到接口中,wsdl取数的方式有三种,RPC方式调用、document方式调用以及通过axis2的wsdl2java.bat生成客户端调用,前两种方式不生成客户端代码,比较繁琐,最后一种方式生成客户端代码,但是比较简洁。

在浏览器中输入wsdl文件的地址可得知,wsdl中定义了两个取数函数,getDatabaseInfo 和getMobileCodeInfo ,前者无参数传入,后者需要传入mobileCode参数。

Document方式调用

以上述wsdl为例,使用getDatabaseInfo函数,不传入参数,document方式调用函数代码如下:

  • Wsdl数据获取
try {

// 指定调用WebService的URL

String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";

EndpointReference targetEPR = new EndpointReference(url);

// 创建一个OMFactory,下面的namespace、方法与参数均需由它创建

OMFactory fac = OMAbstractFactory.getOMFactory();

// 命名空间

OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn","a");

// 下面创建的是参数对数

/*

 * OMElement symbol = fac.createOMElement("mobileCode", omNs);

 * symbol.addChild(fac.createOMText(symbol, "18795842"));

 */

// 下面创建一个method对象 ,方法

OMElement method = fac.createOMElement("getDatabaseInfo", omNs);

// method.addChild(symbol);

Options options = new Options();

options.setTo(targetEPR);

options.setAction("http://WebXml.com.cn/getDatabaseInfo");

ServiceClient sender = new ServiceClient();

sender.setOptions(options);

OMElement result1 = sender.sendReceive(method);

} catch (AxisFault axisFault) {

axisFault.printStackTrace();

}  
  • OMElement对象转换

由于document方式函数调用取数方式获取到的数据为OMElement对象,所以需要将OMElement转换为二维数组,转换函数代码如下:

public static String[][] getResults(OMElement element) {

        if (element == null) {

            return null;

        }

        Iterator iterator = element.getChildElements();

        Iterator innerItr;

        List<String> list = new ArrayList<String>();

        OMElement result = null;

        while (iterator.hasNext()) {

            result = (OMElement) iterator.next();

            innerItr = result.getChildElements();

            while (innerItr.hasNext()) {

             OMElement elem = (OMElement)innerItr.next();  

       list.add(elem.getText());

            }

        }

        String[] result1 = list.toArray(new String[list.size()]);

        String results[][] = new String[result1.length][3];

String b1, b2, b3;

for (int i = 0; i < result1.length; i++) {

if (result1[i].length() != 0) {

b1 = result1[i].substring(0, result1[i].indexOf(" "));

b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));

b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);

results[i][0] = b1;

results[i][1] = b2;

results[i][2] = b3;

}

}

        return results;

}  
  • 获取数据转换为程序数据集

定义WebServiceTableWsdlDataDemo1.java类,扩展AbstractTableData,将获得的数组数据转为程序数据集。完整代码如下:

package com.fr.data;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMFactory;

import org.apache.axiom.om.OMNamespace;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

import com.fr.general.data.TableDataException;

public class MobileWsdlTableDataDemo1 extends AbstractTableData{

private String[][] data;  

    public MobileWsdlTableDataDemo1() {  

        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 static String[][] getResults(OMElement element) {

        if (element == null) {

            return null;

        }

        Iterator iterator = element.getChildElements();

        Iterator innerItr;

        List<String> list = new ArrayList<String>();

        OMElement result = null;

        while (iterator.hasNext()) {

            result = (OMElement) iterator.next();

            innerItr = result.getChildElements();

            while (innerItr.hasNext()) {

             OMElement elem = (OMElement)innerItr.next();  

       list.add(elem.getText());

            }

        }

        String[] result1 = list.toArray(new String[list.size()]);

        String results[][] = new String[result1.length][3];

String b1, b2, b3;

for (int i = 0; i < result1.length; i++) {

if (result1[i].length() != 0) {

b1 = result1[i].substring(0, result1[i].indexOf(" "));

b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));

b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);

results[i][0] = b1;

results[i][1] = b2;

results[i][2] = b3;

}

}

        return results;

}

public String[][] getData() {

try {

String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";

      EndpointReference targetEPR = new EndpointReference(url);       

      //创建一个OMFactory,下面的namespace、方法与参数均需由它创建  

      OMFactory fac = OMAbstractFactory.getOMFactory();

      // 命名空间

      OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn", "a");

      //下面创建的是参数对数

     /*

      *OMElement symbol = fac.createOMElement("mobileCode", omNs);

      symbol.addChild(fac.createOMText(symbol, "18795842"));

      */

      //下面创建一个method对象  ,方法

      OMElement method = fac.createOMElement("getDatabaseInfo", omNs);

      // method.addChild(symbol);       

      Options options = new Options();       

      options.setTo(targetEPR);

      options.setAction("http://WebXml.com.cn/getDatabaseInfo");

      ServiceClient sender = new ServiceClient();

      sender.setOptions(options);    

      OMElement result1 = sender.sendReceive(method);

      String[][] result = getResults(result1);

        return result;

} catch (org.apache.axis2.AxisFault e) {

e.printStackTrace();

} catch (java.rmi.RemoteException e) {

e.printStackTrace();

}

return new String[][] { {} };

}

    } 

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

如果想要传参,在代码中传递的参数为手机号码,返回对应的省、市、运营商,完整代码如下:

package com.fr.data;  

import java.util.ArrayList;  

import java.util.Iterator;  

import java.util.List;  

import org.apache.axiom.om.OMAbstractFactory;  

import org.apache.axiom.om.OMElement;  

import org.apache.axiom.om.OMFactory;  

import org.apache.axiom.om.OMNamespace;  

import org.apache.axis2.addressing.EndpointReference;  

import org.apache.axis2.client.Options;  

import org.apache.axis2.client.ServiceClient;  

import com.fr.base.FRContext;

import com.fr.general.data.TableDataException;  

import com.fr.general.FRLogger;

public class MobileWsdlTableDataDemoPara extends AbstractTableData{  

    private String[][] data;    

    public MobileWsdlTableDataDemoPara() {    

        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 static String[][] getResults(OMElement element) {  

        if (element == null) {  

            return null;  

        }  

        Iterator iterator = element.getChildElements();  

        //Iterator innerItr;  

        List<String> list = new ArrayList<String>();  

        OMElement result = null;  

        while (iterator.hasNext()) {  

            result = (OMElement) iterator.next();

            list.add(result.getText());

        }  

        String[] result1 = (String[]) list.toArray(new String[list.size()]);  

        String results[][] = new String[result1.length][3];  

        String b1, b2, b3;  

        for (int i = 0; i < result1.length; i++) {  

            if (result1[i].length() != 0) {  

                b1 = result1[i].substring(0, result1[i].indexOf(" "));  

                b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));  

                b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);  

                results[i][0] = b1;  

                results[i][1] = b2;  

                results[i][2] = b3;  

            }  

        }  

        return results;  

}  

    public String[][] getData() {  

        try {  

         FRLogger.getLogger().error("进入了");

         String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";  

            EndpointReference targetEPR = new EndpointReference(url);             

            //创建一个OMFactory,下面的namespace、方法与参数均需由它创建    

            OMFactory fac = OMAbstractFactory.getOMFactory();  

            // 命名空间  

            OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn/", "a");

            //下面创建的是参数对数  

            OMElement symbol = fac.createOMElement("mobileCode", omNs);

            symbol.addChild(fac.createOMText(symbol, "18651038607"));

            OMElement symbol2 = fac.createOMElement("userID", omNs);

            symbol2.addChild(fac.createOMText(symbol2, ""));  

            //下面创建一个method对象  ,方法  

            OMElement method = fac.createOMElement("getMobileCodeInfo", omNs);  

            method.addChild(symbol);  

            method.addChild(symbol2);

            Options options = new Options();              

            options.setTo(targetEPR);  

            options.setAction("http://WebXml.com.cn/getMobileCodeInfo");  

            ServiceClient sender = new ServiceClient();  

            sender.setOptions(options);      

            OMElement result1 = sender.sendReceive(method);

            String[][] result = getResults(result1);

           return result;  

        } catch (org.apache.axis2.AxisFault e) {  

            e.printStackTrace();  

        } catch (java.rmi.RemoteException e) {  

            e.printStackTrace();  

        }  

        return new String[][]{{}};  

    }

    public static void main(String[] args) {

     MobileWsdlTableDataDemoPara ss = new MobileWsdlTableDataDemoPara();

     //ss.getData();

    }

}   
  • 设计器中调用程序数据集

新建报表,定义数据集,选择程序数据集,选择定义好的程序数据集WebServiceWsdlTableDataDemo1.class,点击预览,效果如下:

带参的程序数据集MobileWsdlTableDataDemoPara,点击预览,效果如下:

在设计器中调用程序数据集,同样要将上述导入到eclipse中的jar包拷贝到%FR_HOME\WebReport\WEB-INF\lib目录下,否则预览是没有数据的。

通过axis2生成客户端调用

Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。

  • wsdl2java.bat生成代码

wsdl2java -uri http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl -p mobile -o mobile

如下图:

uri:wsdl文件地址,可以是本地路径,也可以是网络路径;

-p:指定了生成的Java类的包名;

-o:指定了生成的一系列文件保存的根目录。

wsdl2java.bat插件还有很多参数,这里不一一详述了。

命令语句执行完成之后,在参数-o指定的文件目录里面就能看到生成的WebService代码了,这里指定的目录为当前目录下面的mobile文件夹(如果没有改文件夹,会自动新建),如下图:

  • 通过生成的WebService代码取数

将上一步骤生成的WebService代码即2个java文件所在的包一起拷到该工程的src目录中,如下图:

但是生成的MobileCodeWSStub会有一些报错需要修改一下,具体三种修改方式如下:

修改前:

修改后:

修改前:

修改后:

修改前:

修改后:

这样就可以直接使用工程中的MobileCodeWSStub类,从wsdl取数,并转换为二维数组,代码如下:

try {

      String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";

      MobileCodeWSStub stub = new MobileCodeWSStub(url);

//       MobileCodeWSStub.GetMobileCodeInfo aa = new MobileCodeWSStub.GetMobileCodeInfo();

      MobileCodeWSStub.GetDatabaseInfo bb = new MobileCodeWSStub.GetDatabaseInfo();

//       aa.setMobileCode("18795842832");

//       String rs=stub.getMobileCodeInfo(aa).getGetMobileCodeInfoResult();

     String[] p=stub.getDatabaseInfo(bb).getGetDatabaseInfoResult().getString();

     String result[][] = new String[p.length][3];

     String b1,b2,b3;

     for(int i = 0;i<p.length;i++)

     {        

      if(p[i].length()!=0)

      {

       b1 = p[i].substring(0, p[i].indexOf(" "));

       b2 = p[i].substring(p[i].indexOf(" ")+1).substring(0,p[i].substring(p[i].indexOf(" ")+1).indexOf(" "));

       b3 = p[i].substring(p[i].indexOf(" ")+1).substring(p[i].substring(p[i].indexOf(" ")+1).indexOf(" ")+1);

       result[i][0] = b1;

       result[i][1] = b2;

       result[i][2] = b3;

}

   }

     return result;

} catch (org.apache.axis2.AxisFault e) {

e.printStackTrace();

} catch (java.rmi.RemoteException e) {

e.printStackTrace();

}

return new String[][] { {} };

} 
  • 获取数据转换为程序数据集

定义WebServiceWsdlTableDataDemo2.java类,扩展AbstractTableData,将获得的数组数据转为程序数据集。完整代码如下:

package com.fr.data;  

import java.util.logging.Logger;  

import mobile.MobileCodeWSStub;  

import org.apache.axis2.AxisFault;  

import org.apache.axis2.addressing.EndpointReference;  

import org.apache.axis2.client.Options;  

import org.apache.axis2.rpc.client.RPCServiceClient;  

import com.fr.data.AbstractTableData;  

import com.fr.general.data.TableDataException;  

import com.fr.third.javax.xml.namespace.QName;  

public class WebServiceWsdlTableDataDemo2 extends AbstractTableData{  

    /** 

     *  

     */  

    private static final long serialVersionUID = 1L;  

    private String[][] data;    

    public WebServiceWsdlTableDataDemo2() {    

        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 url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";  

              MobileCodeWSStub stub = new MobileCodeWSStub(url);  

//            MobileCodeWSStub.GetMobileCodeInfo aa = new MobileCodeWSStub.GetMobileCodeInfo();  

              MobileCodeWSStub.GetDatabaseInfo bb = new MobileCodeWSStub.GetDatabaseInfo();  

//            aa.setMobileCode("18795842832");  

//            String rs=stub.getMobileCodeInfo(aa).getGetMobileCodeInfoResult();  

             String[] p=stub.getDatabaseInfo(bb).getGetDatabaseInfoResult().getString();  

             String result[][] = new String[p.length][3];  

             String b1,b2,b3;  

             for(int i = 0;i<p.length;i++)  

             {               

                 if(p[i].length()!=0)  

                 {  

               b1 = p[i].substring(0, p[i].indexOf(" "));  

               b2 = p[i].substring(p[i].indexOf(" ")+1).substring(0,p[i].substring(p[i].indexOf(" ")+1).indexOf(" "));  

               b3 = p[i].substring(p[i].indexOf(" ")+1).substring(p[i].substring(p[i].indexOf(" ")+1).indexOf(" ")+1);  

               result[i][0] = b1;  

               result[i][1] = b2;  

               result[i][2] = b3;  

            }             

           }  

             return result;  

        } catch (org.apache.axis2.AxisFault e) {  

            e.printStackTrace();  

        } catch (java.rmi.RemoteException e) {  

            e.printStackTrace();  

        }  

        return new String[][] { {} };  

    }  

    public static void main(String[] args) {  

        for(int i=0; i<new WebServiceWsdlTableDataDemo2().getData().length; i++) {  

            System.out.println(new WebServiceWsdlTableDataDemo2().getData()[i]);  

        }  

    }  

    }  

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

  • 设计器中调用程序数据集

新建报表,定义数据集,选择程序数据集,选择定义好的程序数据集WebServiceWsdlTableDataDemo2.class,点击预览,效果如下:

在设计器中调用程序数据集,同样要将上述导入到eclipse中的jar包拷贝到%FR_HOME\WebReport\WEB-INF\lib目录下,否则预览是没有数据的。

WebService程序数据集之WSDL取数的更多相关文章

  1. 报表引擎API开发入门—带参程序数据集

    我们今天又来讲讲报表开发的事,上周开的这个系列入门文章也三四天了,浏览量不佳小编甚是悲伤啊,希望大家多多支持我! 一.问题描述 在实际应用中,可能需要根据表名动态地改变数据源,比如在程序数据集中,通过 ...

  2. 帆软FineReport如何使用程序数据集

    大多数情况下,FineReport直接在设计器里使用“数据集查询”,直接写SQL就能满足报表要求,但对于一些复杂的报表,有时候SQL处理并不方便,这时可以把查询结果在应用层做一些预处理后,再传递给报表 ...

  3. NOIP2007 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  4. 报表引擎API开发入门—简单程序数据集

    小编最近接的项目是有关报表开发的,很想把这部分知识分享出来.希望大家能够支持我!不多说,马上进入我们今天的话题. API基本知识 小编最近项目所做的是关于一个报表软件—FineReport报表开发的一 ...

  5. NOIP2007矩阵取数[DP|高精度]

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  6. TYVJ 矩阵取数 Label:高精度+dp

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  7. 【NOIP2007】矩阵取数

    因为傻逼写错高精度搞了一下午浪费好多时间,好想哭qaq 原题: 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数.游戏规则如下: 1. 每次取数时须从每 ...

  8. JAX-WS开发WebService程序

    近来公司里要用的到WebService做开发,所以就自己学习了一下,刚开始感觉挺难的,但是真正学会以后,原来这么简单. 今天把这些东西哦记下来,以便日后的复习. 我来介绍一下我的开发环境:Eclips ...

  9. 1166 矩阵取数游戏[区间dp+高精度]

    1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [ ...

随机推荐

  1. G - Game HDU - 5242 (数链剖分)

    题目链接: G - Game HDU - 5242 题目大意:首先是T组测试样例,给出一颗以1节点为根的树,每个节点有各自的价值,有m次从根节点出发向下走到叶子节点的机会,每次会得到所有经过节点的权值 ...

  2. 豆瓣电影信息爬取(json)

    豆瓣电影信息爬取(json) # a = "hello world" # 字符串数据类型# b = {"name":"python"} # ...

  3. 皕杰报表 javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

    今天做报表的时候,跳转到显示报表页面的时候不出来数据,报错说数据集未产生. 后台报错 javax.naming.NameNotFoundException: Name jdbc is not boun ...

  4. 【Alpha】Phylab 展示博客

    目录 Phylab Alpha 展示博客 一.团队简介 二.项目目标 2.1 典型用户 2.2 功能描述 2.3 用户量 三.项目发布与展示 3.1 新功能 3.2 修复缺陷 3.3 问题与限制 3. ...

  5. gerapy的初步使用(管理分布式爬虫)

    一.简介与安装 Gerapy 是一款分布式爬虫管理框架,支持 Python 3,基于 Scrapy.Scrapyd.Scrapyd-Client.Scrapy-Redis.Scrapyd-API.Sc ...

  6. 通过CGI实现在Html页面上执行shell命令

    在mac上配置cgi(不用系统自带的apache cgi.) 安装cgi 1. brew update 2. brew install httpd24 安装完后,会有如下提示 DocumentRoot ...

  7. Homebrew设置代理

    在终端上输入环境变量: export ALL_PROXY=socks5://127.0.0.1:1080 注意:这个只在当前生效,关闭终端就不行了. 原理:本身使用curl进行访问,所以通过环境变量能 ...

  8. scrapyd远程连接配置

    安装scrapyd: pip install scrapyd 默认scrapyd启动是通过scrapyd就可以直接启动,bind绑定的ip地址是127.0.0.1端口是:6800,这里为了其他主机可以 ...

  9. TreeMap红黑树

    Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构 ...

  10. Comet技术在Java Web中的应用

    HTTP协议是互联网上大量信息交换的基础,其特点是,它是基于请求-响应模式的无状态的单向协议,即,必须由客户端发起一个请求建立连接,服务器接收请 求,把数据返回给客户端,然后释放连接.下一次,再由客户 ...