JAVA处理含有DataSet的web services

       本篇文章将讲述如何通过axis取得.net发布的Web services,并处理返回含有DataSet的处理结果,展现在页面上。
  涉及到的知识有:
  AXIS
        SAXBuilder
        xml

        步骤如下:
  1)、生成client stub文件。
     必备条件axis开源包。JDK
    A)、比如AXIS包放在你的C盘,则需要在环境变量当中设定的东东有:
                           AXIS_HOME=C:\AXIS
                           AXIS_CLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;%AXIS_HOME%\lib\activation.jar;%AXIS_HOME%\lib\mail.jar
                           然后加入到PATH当中:.;% AXIS_CLASSPATH%   (加入就可以了)
                          注意:很多人因为以上的配置不对,导致对AXIS学习的信心下降,其实,仔细一点就会发现在CLASSPATH当中找一找有没有版本区别。也就是每一个JAR包是不是真的存在就可以了。(哈哈,我曾为之付出了两天的时间娞!)
                 B)、进入DOS模式,转到D盘,执行如下代码:
      java org.apache.axis.wsdl.WSDL2Java -p <名称,最好是包名> http://10.2.10.80/FocService/FocService.asmx?wsdl,看到了吧。对.net发布为asmx的文件后面加入?wsdl就可以解决了。
      然后就会在这个<名称,最好是包名>下就会有一堆的JAVA文件,一般的话会有:
                       xxxx.java
                       xxxxLocator.java
                       xxxxSoap.java
                      xxxxSoapStub.java
                      其次还有以下划线_xxxx????.java的文件都是序列化的对象,也就是返回的结果对应元素。可以暂时不理它。下面就以作者生成的示例做一个引用webservice的操作。作者得到的文件如下:
                       SearchFlightInfo.java
                       SearchFlightInfoLocator.java
                       SearchFlightInfoSoap.java
                      SearchFlightInfoSoapStub.java
                       -----------------------------------------------------------------------
                       _GetFlightInfoResponse_GetFlightInfoResult.java
                      _GetstrFlightInfo.java
                     _GetstrFlightInfoResponse.java
                    C)、引用方法:
    

                               基本思想是从得到web services后取得他的主体信息(返回的数据信息),然后生成XML文件,然后再把XML文件转换成一个JAVA序列化对象就可以了。
        如下是序列化对象的代码。
                     

java 代码 
  1. try {   
  2.             /**  
  3.              * 取得前台的参数 1、航班日期 2、航班号  
  4.              */  
  5.             String planDate = request.getParameter("day");   
  6.             String flyNo = request.getParameter("hanbanno");   
  7.             /**  
  8.              * 按照最新版本制作,最新位置在:http://10.2.10.62/OPCFltWS/SearchFlightInfo.asmx  
  9.              */  
  10.             SearchFlightInfo service = new SearchFlightInfoLocator();   
  11.             SearchFlightInfoSoap client = service.getSearchFlightInfoSoap();   
  12.             _GetFlightInfoResponse_GetFlightInfoResult FOCInfo=client.getFlightInfo(planDate, flyNo);   
  13.             String ErrorInfo = client.getstrFlightInfo(planDate, flyNo);//错误警告信息
  14.             MessageElement[] FOCElement = FOCInfo.get_any();//取得xml信息   
  15.             List FOCElementHead = FOCElement[0].getChildren();//消息头,DataSet对象   
  16.             List FOCElementBody = FOCElement[1].getChildren();//消息体信息,DataSet对象 
  17.             if (FOCElementBody.size() <= 0){   
  18.                 //无返回记录,则无输出   
  19.                 return mapping.findForward("NoRecord");    
  20.             }   
  21.             String nn = FOCElementBody.get(0).toString();//消息体的字符串形式    
  22.             String path = request.getRealPath("");    
  23.             CommonTools.saveXMLString(nn,path+"\\FOC\\heweiya1.xml");//保存为XML形式,其中FOC目录做为固定目录   
  24.             /**  
  25.                  * 使用DOM4J来解析这个序列化的对象  
  26.                  */  
  27.             //String path = request.getRealPath("");   
  28.             Vector OutFoc = CommonTools.LoadXML(path + "\\FOC\\heweiya1.xml");   
  29.             request.setAttribute("OutFoc", OutFoc);   
  30.             if (request.getParameter("as") != null) {   
  31.                 return mapping.findForward("Foc1");   
  32.             }   
  33.             return mapping.findForward("Foc");   
  34.         } catch (Exception e) {   
  35.             /**  
  36.              * 服务有异常,或者服务没有启动!  
  37.              */  
  38.             request.setAttribute("UserMsg""Public.FocError");   
  39.             return mapping.findForward("Fail");   
  40.         }  

  

  1. package com.travelsky.kams.front.foc.webservices;   
  2.   
  3. public class FocBean implements java.io.Serializable{   
  4.   
  5.     private String acown;//航班1   
  6.     private String fltid;//航班2   
  7.     private String datop;//查询日期   
  8.     private String std;   
  9.     private String sta;   
  10.     private String etd;//   
  11.     private String eta;//   
  12.     private String atd;   
  13.     private String toff;//滑出时间   
  14.     private String tdwn;//滑到位时间   
  15.     private String ata;//飞行状态   
  16.     private String actyp;//机型   
  17.     private String depstn;//起始机场   
  18.     private String arrstn;//到达机场   
  19.     private String plnid;//机号   
  20.     /** default constructor */  
  21.     public FocBean() {   
  22.     }   
  23.       
  24.     public String getAcown() {   
  25.         return this.acown;   
  26.     }   
  27.        
  28.     public void setAcown(String acown) {   
  29.         this.acown = acown;   
  30.     }   
  31.     public String getDatop() {   
  32.         return this.datop;   
  33.     }   
  34.        
  35.     public void setDatop(String datop) {   
  36.         this.datop = datop;   
  37.     }      
  38.        
  39.        
  40.     public String getFltid() {   
  41.         return this.fltid;   
  42.     }   
  43.        
  44.     public void setFltid(String fltid) {   
  45.         this.fltid = fltid;   
  46.     }   
  47.     public String getStd() {   
  48.         return this.std;   
  49.     }   
  50.        
  51.     public void setStd(String std) {   
  52.         this.std = std;   
  53.     }   
  54.     public String getSta() {   
  55.         return this.sta;   
  56.     }   
  57.        
  58.     public void setSta(String sta) {   
  59.         this.sta = sta;   
  60.     }   
  61.     public String getEtd() {   
  62.         return this.etd;   
  63.     }   
  64.        
  65.     public void setEtd(String etd) {   
  66.         this.etd = etd;   
  67.     }   
  68.     public String getEta() {   
  69.         return this.eta;   
  70.     }   
  71.        
  72.     public void setEta(String eta) {   
  73.         this.eta = eta;   
  74.     }   
  75.     public String getAtd() {   
  76.         return this.atd;   
  77.     }   
  78.        
  79.     public void setAtd(String atd) {   
  80.         this.atd = atd;   
  81.     }   
  82.     public String getToff() {   
  83.         return this.toff;   
  84.     }   
  85.        
  86.     public void setToff(String toff) {   
  87.         this.toff = toff;   
  88.     }   
  89.     public String getTdwn() {   
  90.         return this.tdwn;   
  91.     }   
  92.        
  93.     public void setTdwn(String tdwn) {   
  94.         this.tdwn = tdwn;   
  95.     }   
  96.     public String getAta() {   
  97.         return this.ata;   
  98.     }   
  99.        
  100.     public void setAta(String ata) {   
  101.         this.ata = ata;   
  102.     }   
  103.     public String getActyp() {   
  104.         return this.actyp;   
  105.     }   
  106.        
  107.     public void setActyp(String actyp) {   
  108.         this.actyp = actyp;   
  109.     }   
  110.     public String getDepstn() {   
  111.         return this.depstn;   
  112.     }   
  113.        
  114.     public void setDepstn(String depstn) {   
  115.         this.depstn = depstn;   
  116.     }   
  117.     public String getArrstn() {   
  118.         return this.arrstn;   
  119.     }   
  120.        
  121.     public void setArrstn(String arrstn) {   
  122.         this.arrstn = arrstn;   
  123.     }   
  124.     public String getPlnid() {   
  125.         return this.plnid;   
  126.     }   
  127.        
  128.     public void setPlnid(String plnid) {   
  129.         this.plnid = plnid;   
  130.     }   
  131.   
  132. }   

                               如下是解析XML文件变换成一个序列化的对象的JAVA代码:(其中Vecto就相关于安全的LIST了)

  1. /**  
  2.      * 读取XML文件所有信息  
  3.      */  
  4.     public static Vector LoadXML(String path) throws Exception {   
  5.         Vector xmlVector = null;   
  6.         FileInputStream fi = null;   
  7.         try {   
  8.             fi = new FileInputStream(path);   
  9.             xmlVector = new Vector();   
  10.             SAXBuilder sb = new SAXBuilder();   
  11.             Document doc = sb.build(fi);   
  12.             Element root = doc.getRootElement(); // 得到根元素   
  13.             List focs = root.getChildren(); // 得到根元素所有子元素的集合   
  14.             Element foc = null;   
  15.             FocBean xml = null;   
  16.             /**  
  17.              * 从1开始,因为0为错误警告信息  
  18.              */  
  19.             for (int i = 1; i < focs.size(); i++) {   
  20.                 xml = new FocBean();   
  21.                 foc = (Element) focs.get(i); // 得到第一本书元素   
  22. /*              xml.setAta(foc.getChild("ATA").getText());  
  23.                 xml.setAtd(foc.getChild("ATD").getText());  
  24.                 xml.setEta(foc.getChild("ETA").getText());  
  25.                 xml.setEtd(foc.getChild("ETD").getText());  
  26.                 xml.setFltid(foc.getChild("FLTID").getText());  
  27.                 xml.setSta(foc.getChild("STA").getText());  
  28.                 xml.setStd(foc.getChild("STD").getText());  
  29.                 xml.setTdwn(foc.getChild("TDWN").getText());  
  30.                 xml.setToff(foc.getChild("TOFF").getText());*/  
  31.                 /**  
  32.                  * 如下是最新版本的取得实体对象的方法  
  33.                  * modify by heweiya 2006-12-14  
  34.                  */  
  35.                 xml.setAta(foc.getChild("ATA").getText());   
  36.                 xml.setAtd(foc.getChild("ATD").getText());   
  37.                 xml.setEta(foc.getChild("ETA").getText());   
  38.                 xml.setEtd(foc.getChild("ETD").getText());   
  39.                 xml.setFltid(foc.getChild("FLTID").getText());   
  40.                 xml.setSta(foc.getChild("STA").getText());   
  41.                 xml.setStd(foc.getChild("STD").getText());   
  42.                 xml.setTdwn(foc.getChild("TDWN").getText());   
  43.                 xml.setToff(foc.getChild("TOFF").getText());   
  44.                 xml.setAcown(foc.getChild("ACOWN").getText());   
  45.                 xml.setActyp(foc.getChild("ACTYP").getText());   
  46.                 xml.setArrstn(foc.getChild("ARRSTN").getText());   
  47.                 xml.setDatop(foc.getChild("DATOP").getText());   
  48.                 xml.setDepstn(foc.getChild("DEPSTN").getText());   
  49.                 xml.setPlnid(foc.getChild("Plnid").getText());   
  50.                    
  51.                 xmlVector.add(xml);   
  52.             }   
  53.         } catch (Exception e) {   
  54.             System.err.println(e + "error");   
  55.         } finally {   
  56.             try {   
  57.                 fi.close();   
  58.             } catch (Exception e) {   
  59.                 e.printStackTrace();   
  60.             }   
  61.         }   
  62.         return xmlVector;   
  63.     }  

          还有一个代码如下:
           

java 代码
  1. // 把String 保存为文件   
  2.     public static void saveXMLString(String XMLString, String fileName)   
  3.             throws IOException {   
  4.         File file = new File(fileName);   
  5.         if (file.exists()) {   
  6.             file.delete();   
  7.         }   
  8.         file.createNewFile();   
  9.         if (file.canWrite()) {   
  10.             FileWriter fileOut = new FileWriter(file);   
  11.             fileOut.write(XMLString);   
  12.             fileOut.close();   
  13.         }   
  14.     }  

           以上所述是作者调试通过。使用STRUTS做为前台,然后输出就可以了。本文章只讨论技术问题,示例当中的代码
只做为研究学习使用,并无它意。

      另外个人意见:我在外包公司工作,很累。几乎没有学习新东西的时间,希望有远大志向的人或者想追赶技术潮流的人不要应聘这类公司。 

你可能感兴趣的:(java,xml,Web,log4j,webservice)