在通用的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. Bomb(要49)--数位dp

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  2. kubernetes pod termination pending

    在将k8s从1.7.9 升级到1.10.2 之后,发现删除pod一直处于terminating状态, 调查发现删不掉的pod都有一个特点就是pod yaml中command部分写错了,如下所示: ap ...

  3. HTML5创业的另一种可能

    当一种新的颠覆式技术出现,是投靠大平台还是坚持走独立的道路? HTML5(下称H5)火了.在多数人还没完全弄清楚什么是H5时,它已悄无声息地潜入移动端,并渐呈燎原之势火速席卷云寻觅云寻觅. 以前,H5 ...

  4. (转)MySQL高可用解决方案

    MySQL高可用解决方案 原文:http://www.ywnds.com/?p=5565 有这么两个概念,数据库的可靠性和数据库的可用性,可靠性指的是数据可靠,而可用性指的是服务可用.但是不管是可靠性 ...

  5. 介绍Windows Azure HDInsight服务的Hadoop Storm的视频

    介绍Windows Azure HDInsight服务的Hadoop Storm的原理,用例及开发入门的视频,收藏一下: http://channel9.msdn.com/Shows/Data-Exp ...

  6. 第8章 scrapy进阶开发(2)

    8-4 selenium集成到scrapy中 其实也没什么好说的直接上代码 这是在middlewares.py中定义的一个class: from selenium.common.exceptions ...

  7. C# 创建、部署、调用WebService

    webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice的例子.这里我用的是Visual Studio 201 ...

  8. Layui 好用的弹出框

    layui的下载地址: http://www.layui.com/ 需要引用layui里面的css跟js layui自带jquery var $ = layui.$ 一个直接弹出另一个窗体的弹出框 w ...

  9. GPUImage使用

    GPUImage项目下载地址:https://github.com/BradLarson/GPUImage.git 下载项目时如果下载不下来可以直接check一份(之前下载了好多次都是下载失败,最后没 ...

  10. 折半插入排序-ACM题

    第一种实现方式:(本人一开始对cin的使用不是很熟悉,看了一些人得博客详解后才有了第一种方式的实现,自己都被惊讶到了so easy:题目在下面) // // main.cpp // BinaryIns ...