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做为前台,然后输出就可以了。本文章只讨论技术问题,示例当中的代码
只做为研究学习使用,并无它意。
另外个人意见:我在外包公司工作,很累。几乎没有学习新东西的时间,希望有远大志向的人或者想追赶技术潮流的人不要应聘这类公司。
1 楼 xly_971223 2006-12-14 国内公司都差不多,非外包公司也不一定能学到东西 2 楼 liusu 2006-12-30 我按照你的方法成功实现了调用,万分感谢! 3 楼 ray_linn 2006-12-30 这个字强~ 看了半天不知道怎么打出来的 4 楼 kiss.988 2007-03-11 好方法,值得我去认真思考一番。