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序列化对象就可以了。
如下是序列化对象的代码。
try { /** * 取得前台的参数 1、航班日期 2、航班号 */ String planDate = request.getParameter("day"); String flyNo = request.getParameter("hanbanno"); /** * 按照最新版本制作,最新位置在:http://10.2.10.62/OPCFltWS/SearchFlightInfo.asmx */ SearchFlightInfo service = new SearchFlightInfoLocator(); SearchFlightInfoSoap client = service.getSearchFlightInfoSoap(); _GetFlightInfoResponse_GetFlightInfoResult FOCInfo=client.getFlightInfo(planDate, flyNo); String ErrorInfo = client.getstrFlightInfo(planDate, flyNo);//错误警告信息 MessageElement[] FOCElement = FOCInfo.get_any();//取得xml信息 List FOCElementHead = FOCElement[0].getChildren();//消息头,DataSet对象 List FOCElementBody = FOCElement[1].getChildren();//消息体信息,DataSet对象 if (FOCElementBody.size() <= 0){ //无返回记录,则无输出 return mapping.findForward("NoRecord"); } String nn = FOCElementBody.get(0).toString();//消息体的字符串形式 String path = request.getRealPath(""); CommonTools.saveXMLString(nn,path+"\\FOC\\heweiya1.xml");//保存为XML形式,其中FOC目录做为固定目录 /** * 使用DOM4J来解析这个序列化的对象 */ //String path = request.getRealPath(""); Vector OutFoc = CommonTools.LoadXML(path + "\\FOC\\heweiya1.xml"); request.setAttribute("OutFoc", OutFoc); if (request.getParameter("as") != null) { return mapping.findForward("Foc1"); } return mapping.findForward("Foc"); } catch (Exception e) { /** * 服务有异常,或者服务没有启动! */ request.setAttribute("UserMsg", "Public.FocError"); return mapping.findForward("Fail"); }
package com.travelsky.kams.front.foc.webservices; public class FocBean implements java.io.Serializable{ private String acown;//航班1 private String fltid;//航班2 private String datop;//查询日期 private String std; private String sta; private String etd;// private String eta;// private String atd; private String toff;//滑出时间 private String tdwn;//滑到位时间 private String ata;//飞行状态 private String actyp;//机型 private String depstn;//起始机场 private String arrstn;//到达机场 private String plnid;//机号 /** default constructor */ public FocBean() { } public String getAcown() { return this.acown; } public void setAcown(String acown) { this.acown = acown; } public String getDatop() { return this.datop; } public void setDatop(String datop) { this.datop = datop; } public String getFltid() { return this.fltid; } public void setFltid(String fltid) { this.fltid = fltid; } public String getStd() { return this.std; } public void setStd(String std) { this.std = std; } public String getSta() { return this.sta; } public void setSta(String sta) { this.sta = sta; } public String getEtd() { return this.etd; } public void setEtd(String etd) { this.etd = etd; } public String getEta() { return this.eta; } public void setEta(String eta) { this.eta = eta; } public String getAtd() { return this.atd; } public void setAtd(String atd) { this.atd = atd; } public String getToff() { return this.toff; } public void setToff(String toff) { this.toff = toff; } public String getTdwn() { return this.tdwn; } public void setTdwn(String tdwn) { this.tdwn = tdwn; } public String getAta() { return this.ata; } public void setAta(String ata) { this.ata = ata; } public String getActyp() { return this.actyp; } public void setActyp(String actyp) { this.actyp = actyp; } public String getDepstn() { return this.depstn; } public void setDepstn(String depstn) { this.depstn = depstn; } public String getArrstn() { return this.arrstn; } public void setArrstn(String arrstn) { this.arrstn = arrstn; } public String getPlnid() { return this.plnid; } public void setPlnid(String plnid) { this.plnid = plnid; } }
如下是解析XML文件变换成一个序列化的对象的JAVA代码:(其中Vecto就相关于安全的LIST了)
/** * 读取XML文件所有信息 */ public static Vector LoadXML(String path) throws Exception { Vector xmlVector = null; FileInputStream fi = null; try { fi = new FileInputStream(path); xmlVector = new Vector(); SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(fi); Element root = doc.getRootElement(); // 得到根元素 List focs = root.getChildren(); // 得到根元素所有子元素的集合 Element foc = null; FocBean xml = null; /** * 从1开始,因为0为错误警告信息 */ for (int i = 1; i < focs.size(); i++) { xml = new FocBean(); foc = (Element) focs.get(i); // 得到第一本书元素 /* xml.setAta(foc.getChild("ATA").getText()); xml.setAtd(foc.getChild("ATD").getText()); xml.setEta(foc.getChild("ETA").getText()); xml.setEtd(foc.getChild("ETD").getText()); xml.setFltid(foc.getChild("FLTID").getText()); xml.setSta(foc.getChild("STA").getText()); xml.setStd(foc.getChild("STD").getText()); xml.setTdwn(foc.getChild("TDWN").getText()); xml.setToff(foc.getChild("TOFF").getText());*/ /** * 如下是最新版本的取得实体对象的方法 * modify by heweiya 2006-12-14 */ xml.setAta(foc.getChild("ATA").getText()); xml.setAtd(foc.getChild("ATD").getText()); xml.setEta(foc.getChild("ETA").getText()); xml.setEtd(foc.getChild("ETD").getText()); xml.setFltid(foc.getChild("FLTID").getText()); xml.setSta(foc.getChild("STA").getText()); xml.setStd(foc.getChild("STD").getText()); xml.setTdwn(foc.getChild("TDWN").getText()); xml.setToff(foc.getChild("TOFF").getText()); xml.setAcown(foc.getChild("ACOWN").getText()); xml.setActyp(foc.getChild("ACTYP").getText()); xml.setArrstn(foc.getChild("ARRSTN").getText()); xml.setDatop(foc.getChild("DATOP").getText()); xml.setDepstn(foc.getChild("DEPSTN").getText()); xml.setPlnid(foc.getChild("Plnid").getText()); xmlVector.add(xml); } } catch (Exception e) { System.err.println(e + "error"); } finally { try { fi.close(); } catch (Exception e) { e.printStackTrace(); } } return xmlVector; }
还有一个代码如下:
// 把String 保存为文件 public static void saveXMLString(String XMLString, String fileName) throws IOException { File file = new File(fileName); if (file.exists()) { file.delete(); } file.createNewFile(); if (file.canWrite()) { FileWriter fileOut = new FileWriter(file); fileOut.write(XMLString); fileOut.close(); } }
以上所述是作者调试通过。使用STRUTS做为前台,然后输出就可以了。本文章只讨论技术问题,示例当中的代码
只做为研究学习使用,并无它意。