Chinaunix首页 | 论坛 | 博客
  • 博客访问: 200741
  • 博文数量: 97
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1024
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-03 09:03
文章分类
文章存档

2017年(17)

2016年(54)

2015年(25)

2014年(1)

我的朋友

分类: Web开发

2017-01-13 17:09:53

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

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

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

Document方式调用

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

  • Wsdl数据获取

点击(此处)折叠或打开

  1. try {
  2. // 指定调用WebService的URL
  3. String url = "";
  4. EndpointReference targetEPR = new EndpointReference(url);
  5. // 创建一个OMFactory,下面的namespace、方法与参数均需由它创建
  6. OMFactory fac = OMAbstractFactory.getOMFactory();
  7. // 命名空间
  8. OMNamespace omNs = fac.createOMNamespace("","a");
  9. // 下面创建的是参数对数
  10. /*
  11.  * OMElement symbol = fac.createOMElement("mobileCode", omNs);
  12.  * symbol.addChild(fac.createOMText(symbol, "18795842"));
  13.  */
  14. // 下面创建一个method对象 ,方法
  15. OMElement method = fac.createOMElement("getDatabaseInfo", omNs);
  16. // method.addChild(symbol);
  17. Options options = new Options();
  18. options.setTo(targetEPR);
  19. options.setAction("/getDatabaseInfo");
  20. ServiceClient sender = new ServiceClient();
  21. sender.setOptions(options);
  22. OMElement result1 = sender.sendReceive(method);
  23. } catch (AxisFault axisFault) {
  24. axisFault.printStackTrace();
  25. }

  • OMElement对象转换

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

点击(此处)折叠或打开

  1. public static String[][] getResults(OMElement element) {
  2.         if (element == null) {
  3.             return null;
  4.         }
  5.         Iterator iterator = element.getChildElements();
  6.         Iterator innerItr;
  7.         List<String> list = new ArrayList<String>();
  8.         OMElement result = null;
  9.         while (iterator.hasNext()) {
  10.             result = (OMElement) iterator.next();
  11.             innerItr = result.getChildElements();
  12.             while (innerItr.hasNext()) {
  13.                 OMElement elem = (OMElement)innerItr.next();
  14.        list.add(elem.getText());
  15.             }
  16.         }
  17.         String[] result1 = list.toArray(new String[list.size()]);
  18.         String results[][] = new String[result1.length][3];
  19. String b1, b2, b3;
  20. for (int i = 0; i < result1.length; i++) {
  21. if (result1[i].length() != 0) {
  22. b1 = result1[i].substring(0, result1[i].indexOf(" "));
  23. b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));
  24. b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);
  25. results[i][0] = b1;
  26. results[i][1] = b2;
  27. results[i][2] = b3;

  28. }
  29. }
  30.         return results;
  31. }

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

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

点击(此处)折叠或打开

  1. package com.fr.data;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import org.apache.axiom.om.OMAbstractFactory;
  7. import org.apache.axiom.om.OMElement;
  8. import org.apache.axiom.om.OMFactory;
  9. import org.apache.axiom.om.OMNamespace;
  10. import org.apache.axis2.addressing.EndpointReference;
  11. import org.apache.axis2.client.Options;
  12. import org.apache.axis2.client.ServiceClient;
  13. import com.fr.general.data.TableDataException;
  14.  
  15. public class MobileWsdlTableDataDemo1 extends AbstractTableData{
  16. private String[][] data;
  17.     
  18.     public MobileWsdlTableDataDemo1() {
  19.         this.data = this.getData();
  20.     }
  21.     
  22.     public int getColumnCount() throws TableDataException {
  23.         return data[0].length;
  24.     }
  25.   
  26.     //获取列的名称为数组中第一行的值
  27.     public String getColumnName(int columnIndex) throws TableDataException {
  28.         return data[0][columnIndex];
  29.     }
  30.   
  31.     //获取行数为数据的长度-1
  32.     public int getRowCount() throws TableDataException {
  33.         return data.length - 1;
  34.     }
  35.   
  36.     //获取值
  37.     public Object getValueAt(int rowIndex, int columnIndex) {
  38.         return data[rowIndex + 1][columnIndex];
  39.     }
  40.   
  41.     public static String[][] getResults(OMElement element) {
  42.         if (element == null) {
  43.             return null;
  44.         }
  45.         Iterator iterator = element.getChildElements();
  46.         Iterator innerItr;
  47.         List<String> list = new ArrayList<String>();
  48.         OMElement result = null;
  49.         while (iterator.hasNext()) {
  50.             result = (OMElement) iterator.next();
  51.             innerItr = result.getChildElements();
  52.             while (innerItr.hasNext()) {
  53.                 OMElement elem = (OMElement)innerItr.next();
  54.        list.add(elem.getText());
  55.             }
  56.         }
  57.         String[] result1 = list.toArray(new String[list.size()]);
  58.         String results[][] = new String[result1.length][3];
  59. String b1, b2, b3;
  60. for (int i = 0; i < result1.length; i++) {
  61. if (result1[i].length() != 0) {
  62. b1 = result1[i].substring(0, result1[i].indexOf(" "));
  63. b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));
  64. b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);
  65. results[i][0] = b1;
  66. results[i][1] = b2;
  67. results[i][2] = b3;
  68. }
  69. }
  70.         return results;
  71. }
  72.  
  73.  
  74. public String[][] getData() {
  75. try {
  76. String url = "";
  77.       EndpointReference targetEPR = new EndpointReference(url);    
  78.       //创建一个OMFactory,下面的namespace、方法与参数均需由它创建
  79.       OMFactory fac = OMAbstractFactory.getOMFactory();
  80.       // 命名空间
  81.       OMNamespace omNs = fac.createOMNamespace("", "a");
  82.       //下面创建的是参数对数
  83.      /*
  84.       *OMElement symbol = fac.createOMElement("mobileCode", omNs);
  85.       symbol.addChild(fac.createOMText(symbol, "18795842"));
  86.       */
  87.       //下面创建一个method对象 ,方法
  88.       OMElement method = fac.createOMElement("getDatabaseInfo", omNs);
  89.       // method.addChild(symbol);    
  90.       Options options = new Options();    
  91.       options.setTo(targetEPR);
  92.       options.setAction("/getDatabaseInfo");
  93.       ServiceClient sender = new ServiceClient();
  94.       sender.setOptions(options);
  95.       OMElement result1 = sender.sendReceive(method);
  96.       String[][] result = getResults(result1);
  97.            return result;
  98. } catch (org.apache.axis2.AxisFault e) {
  99. e.printStackTrace();
  100. } catch (java.rmi.RemoteException e) {
  101. e.printStackTrace();
  102. }
  103. return new String[][] { {} };
  104. }
  105.  
  106.     }

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

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

点击(此处)折叠或打开

  1. package com.fr.data;
  2.   
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6.  
  7. import org.apache.axiom.om.OMAbstractFactory;
  8. import org.apache.axiom.om.OMElement;
  9. import org.apache.axiom.om.OMFactory;
  10. import org.apache.axiom.om.OMNamespace;
  11. import org.apache.axis2.addressing.EndpointReference;
  12. import org.apache.axis2.client.Options;
  13. import org.apache.axis2.client.ServiceClient;
  14.  
  15. import com.fr.base.FRContext;
  16. import com.fr.general.data.TableDataException;
  17. import com.fr.general.FRLogger;
  18.   
  19. public class MobileWsdlTableDataDemoPara extends AbstractTableData{
  20.     private String[][] data;
  21.       
  22.     public MobileWsdlTableDataDemoPara() {
  23.         this.data = this.getData();
  24.     }
  25.       
  26.     public int getColumnCount() throws TableDataException {
  27.         return data[0].length;
  28.     }
  29.     
  30.     //获取列的名称为数组中第一行的值
  31.     public String getColumnName(int columnIndex) throws TableDataException {
  32.         return data[0][columnIndex];
  33.     }
  34.     
  35.     //获取行数为数据的长度-1
  36.     public int getRowCount() throws TableDataException {
  37.         return data.length - 1;
  38.     }
  39.     
  40.     //获取值
  41.     public Object getValueAt(int rowIndex, int columnIndex) {
  42.         return data[rowIndex + 1][columnIndex];
  43.     }
  44.     
  45.     public static String[][] getResults(OMElement element) {
  46.         if (element == null) {
  47.             return null;
  48.         }
  49.         Iterator iterator = element.getChildElements();
  50.         //Iterator innerItr;
  51.         List<String> list = new ArrayList<String>();
  52.         OMElement result = null;
  53.         while (iterator.hasNext()) {
  54.             result = (OMElement) iterator.next();
  55.             list.add(result.getText());
  56.         }
  57.         String[] result1 = (String[]) list.toArray(new String[list.size()]);
  58.         String results[][] = new String[result1.length][3];
  59.         String b1, b2, b3;
  60.         for (int i = 0; i < result1.length; i++) {
  61.             if (result1[i].length() != 0) {
  62.                 b1 = result1[i].substring(0, result1[i].indexOf(" "));
  63.                 b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));
  64.                 b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);
  65.                 results[i][0] = b1;
  66.                 results[i][1] = b2;
  67.                 results[i][2] = b3;
  68.             }
  69.         }
  70.         return results;
  71. }
  72.   
  73.    
  74.     public String[][] getData() {
  75.         try {
  76.             FRLogger.getLogger().error("进入了");
  77.             String url = "";
  78.             EndpointReference targetEPR = new EndpointReference(url);
  79.             //创建一个OMFactory,下面的namespace、方法与参数均需由它创建
  80.             OMFactory fac = OMAbstractFactory.getOMFactory();
  81.             // 命名空间
  82.             OMNamespace omNs = fac.createOMNamespace("/", "a");
  83.             //下面创建的是参数对数
  84.              
  85.             OMElement symbol = fac.createOMElement("mobileCode", omNs);
  86.             symbol.addChild(fac.createOMText(symbol, "18651038607"));
  87.             
  88.             OMElement symbol2 = fac.createOMElement("userID", omNs);
  89.             symbol2.addChild(fac.createOMText(symbol2, ""));
  90.             
  91.             
  92.              
  93.             //下面创建一个method对象 ,方法
  94.             OMElement method = fac.createOMElement("getMobileCodeInfo", omNs);
  95.             method.addChild(symbol);
  96.             method.addChild(symbol2);
  97.             Options options = new Options();
  98.             options.setTo(targetEPR);
  99.             options.setAction("/getMobileCodeInfo");
  100.             ServiceClient sender = new ServiceClient();
  101.             sender.setOptions(options);
  102.             OMElement result1 = sender.sendReceive(method);
  103.             String[][] result = getResults(result1);
  104.            return result;
  105.         } catch (org.apache.axis2.AxisFault e) {
  106.             e.printStackTrace();
  107.         } catch (java.rmi.RemoteException e) {
  108.             e.printStackTrace();
  109.         }
  110.         return new String[][]{{}};
  111.     }
  112.     
  113.     public static void main(String[] args) {
  114.         MobileWsdlTableDataDemoPara ss = new MobileWsdlTableDataDemoPara();
  115.     
  116.         //ss.getData();
  117.     }
  118.    
  119. }

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

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

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

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

通过axis2生成客户端调用

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

  • wsdl2java.bat生成代码

wsdl2java -uri -p mobile -o mobile

如下图:

uriwsdl文件地址,可以是本地路径,也可以是网络路径;

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

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

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

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

  • 通过生成的WebService代码取数

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

 

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

修改前:

 

修改后:

 

修改前:

修改后:

 

修改前:

 

修改后:

 

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

点击(此处)折叠或打开

  1. try {
  2.       String url = "";
  3.       MobileCodeWSStub stub = new MobileCodeWSStub(url);
  4. //     MobileCodeWSStub.GetMobileCodeInfo aa = new MobileCodeWSStub.GetMobileCodeInfo();
  5.       MobileCodeWSStub.GetDatabaseInfo bb = new MobileCodeWSStub.GetDatabaseInfo();
  6. //     aa.setMobileCode("18795842832");
  7. //     String rs=stub.getMobileCodeInfo(aa).getGetMobileCodeInfoResult();
  8.      String[] p=stub.getDatabaseInfo(bb).getGetDatabaseInfoResult().getString();
  9.      String result[][] = new String[p.length][3];
  10.      String b1,b2,b3;
  11.      for(int i = 0;i<p.length;i++)
  12.      {    
  13.          if(p[i].length()!=0)
  14.          {
  15.        b1 = p[i].substring(0, p[i].indexOf(" "));
  16.        b2 = p[i].substring(p[i].indexOf(" ")+1).substring(0,p[i].substring(p[i].indexOf(" ")+1).indexOf(" "));
  17.        b3 = p[i].substring(p[i].indexOf(" ")+1).substring(p[i].substring(p[i].indexOf(" ")+1).indexOf(" ")+1);
  18.        result[i][0] = b1;
  19.        result[i][1] = b2;
  20.        result[i][2] = b3;
  21. }
  22.    }
  23.      return result;
  24. } catch (org.apache.axis2.AxisFault e) {
  25. e.printStackTrace();
  26. } catch (java.rmi.RemoteException e) {
  27. e.printStackTrace();
  28. }
  29. return new String[][] { {} };
  30. }

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

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

点击(此处)折叠或打开

  1. package com.fr.data;
  2.   
  3. import java.util.logging.Logger;
  4.   
  5. import mobile.MobileCodeWSStub;
  6. import org.apache.axis2.AxisFault;
  7. import org.apache.axis2.addressing.EndpointReference;
  8. import org.apache.axis2.client.Options;
  9. import org.apache.axis2.rpc.client.RPCServiceClient;
  10.   
  11. import com.fr.data.AbstractTableData;
  12. import com.fr.general.data.TableDataException;
  13. import com.fr.third.javax.xml.namespace.QName;
  14.   
  15. public class WebServiceWsdlTableDataDemo2 extends AbstractTableData{
  16.     /**
  17.      *
  18.      */
  19.     private static final long serialVersionUID = 1L;
  20.     private String[][] data;
  21.       
  22.     public WebServiceWsdlTableDataDemo2() {
  23.         this.data = this.getData();
  24.     }
  25.       
  26.     public int getColumnCount() throws TableDataException {
  27.         return data[0].length;
  28.     }
  29.     
  30.     //获取列的名称为数组中第一行的值
  31.     public String getColumnName(int columnIndex) throws TableDataException {
  32.         return data[0][columnIndex];
  33.     }
  34.     
  35.     //获取行数为数据的长度-1
  36.     public int getRowCount() throws TableDataException {
  37.         return data.length - 1;
  38.     }
  39.     
  40.     //获取值
  41.     public Object getValueAt(int rowIndex, int columnIndex) {
  42.         return data[rowIndex + 1][columnIndex];
  43.     }
  44.     
  45.     public String[][] getData() {
  46.          try {
  47.               String url = "";
  48.               MobileCodeWSStub stub = new MobileCodeWSStub(url);
  49. // MobileCodeWSStub.GetMobileCodeInfo aa = new MobileCodeWSStub.GetMobileCodeInfo();
  50.               MobileCodeWSStub.GetDatabaseInfo bb = new MobileCodeWSStub.GetDatabaseInfo();
  51. // aa.setMobileCode("18795842832");
  52. // String rs=stub.getMobileCodeInfo(aa).getGetMobileCodeInfoResult();
  53.              String[] p=stub.getDatabaseInfo(bb).getGetDatabaseInfoResult().getString();
  54.              String result[][] = new String[p.length][3];
  55.              String b1,b2,b3;
  56.              for(int i = 0;i<p.length;i++)
  57.              {
  58.                  if(p[i].length()!=0)
  59.                  {
  60.                b1 = p[i].substring(0, p[i].indexOf(" "));
  61.                b2 = p[i].substring(p[i].indexOf(" ")+1).substring(0,p[i].substring(p[i].indexOf(" ")+1).indexOf(" "));
  62.                b3 = p[i].substring(p[i].indexOf(" ")+1).substring(p[i].substring(p[i].indexOf(" ")+1).indexOf(" ")+1);
  63.                result[i][0] = b1;
  64.                result[i][1] = b2;
  65.                result[i][2] = b3;
  66.             }
  67.            }
  68.              return result;
  69.         } catch (org.apache.axis2.AxisFault e) {
  70.             e.printStackTrace();
  71.         } catch (java.rmi.RemoteException e) {
  72.             e.printStackTrace();
  73.         }
  74.         return new String[][] { {} };
  75.     }
  76.     public static void main(String[] args) {
  77.         for(int i=0; i<new WebServiceWsdlTableDataDemo2().getData().length; i++) {
  78.             System.out.println(new WebServiceWsdlTableDataDemo2().getData()[i]);
  79.         }
  80.     }
  81.     }

将编译好的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目录下,否则预览是没有数据的。

 

阅读(2724) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~