【springmvc+mybatis项目实战】杰信商贸-35.业务出口报运WebService2

我们上一次创建了出口报运的WebService的搭建,测试的时候,我们仅仅得到了WebService给我们回复的soap结构的XML对象,但是我们没有去解析。下面我们来完成soap的XML的解析,并把相应的数据通过javascript安插在table中。

我们先来分析一下之前我们saop发出的XML请求和得到的XML回复的例子
请求:
[html]  view plain copy
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://impl.service.jk.hpu.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
  2. <soapenv:Body>  
  3. <q0:get>  
  4.   <arg0>39cd8f20-50f8-4bc1-96d5-de6de3d7c8b4</arg0>   
  5. </q0:get>  
  6. </soapenv:Body>  
  7. </soapenv:Envelope>  

回复:
[html]  view plain copy
  1. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
  2. <soap:Body>  
  3. <ns2:getResponse xmlns:ns2="http://impl.service.jk.hpu.cn/">  
  4. <return>  
  5.   <consignee>南京</consignee>   
  6.   <contractIds>392bf3b2-cb0e-4e7a-ba02-c91ce83e9fe1,55743f24-f092-47ac-b149-358785437238</contractIds>   
  7.   <customerContract>3 2</customerContract>   
  8.   <destinationPort>深圳港</destinationPort>   
  9.   <id>39cd8f20-50f8-4bc1-96d5-de6de3d7c8b4</id>   
  10.   <inputDate>2015-10-09T00:00:00+08:00</inputDate>   
  11.   <lcno>T/T</lcno>   
  12.   <marks>11</marks>   
  13.   <priceCondition>2</priceCondition>   
  14.   <remark>22</remark>   
  15.   <shipmentPort>连云港</shipmentPort>   
  16.   <transportMode>1</transportMode>   
  17. </return>  
  18.   </ns2:getResponse>  
  19.   </soap:Body>  
  20.   </soap:Envelope>  

我们来分析回复以便于我们来解析:
<soap:Envelope>是头文件不需要解析。可以发现我们需要的信息都是在<return>标签对中放置的,我们要从<return>的子元素中找到我们需要的信息。

具体代码(在上次的基础上):
[html]  view plain copy
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ include file="../../base.jsp"%>  
  3. <%@ include file="../../baselist.jsp"%>  
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>  
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6. <head>  
  7.     <title>出口报运跟踪</title>  
  8.     <script language="javascript" src="${ctx}/js/datepicker/WdatePicker.js"></script>  
  9.     <script type="text/javascript">  
  10.         /*  
  11.             开发步骤  
  12.             1.创建xmlHttpRquest对象  
  13.             2.open('POST',url,true)链接  
  14.             3.设置请求头  
  15.             4.send(xml)  
  16.             5.回调函数,接收响应xml  
  17.             6.从返回的XML抓取我们相关的信息  
  18.         */  
  19.   
  20.   
  21.         var xmlHttpRequest;  
  22.         if(window.XMLHttpRequest){  
  23.                 //针对FireFox、Mozillar、Opera、Safari、IE7、IE8  
  24.                 xmlHttpRequest=new XMLHttpRequest();  
  25.                 //修复类似Mozillar浏览器的bug  
  26.                 if(xmlHttpRequest.overrideMimeType){  
  27.                     xmlHttpRequest.overrideMimeType("text/xml");  
  28.                 }  
  29.             }else if(window.ActiveXObject){  
  30.                 //所有的IE中window.ActiveXObject条件都成立  
  31.                 //针对IE6、IE5.5、IE5(现在没人用了,可以把这条if分支删除)  
  32.                 //两个可以用于创建XMLHttpRequest对象的控件名称,保存在一个js的数组中  
  33.                 //排在前面的版本最新  
  34.                 var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];  
  35.                 for(var i=0;i<activeName.length;i++){  
  36.                     try{  
  37.                         //获取一个控件名进行创建,如果创建成功就终止循环  
  38.                         //如果创建失败,会抛出异常,然后就可以继续循环,继续尝试创建  
  39.                         xmlHttpRequest=new ActiveXObject(activeName[i]);  
  40.                         break;  
  41.                     }catch(e){  
  42.                         //仍然不能创建,抛出异常后,给出友好提示  
  43.                     }  
  44.                 }         
  45.         }  
  46.           
  47.         //发送soap请求  
  48.         function sendMsg(){  
  49.             var url="http://localhost/jx-Maven-Webapp/cxf/ExportServiceImpl";//WebService请求路径  
  50.               
  51.             var reuqestBody="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" "  
  52.             +"xmlns:q0=\"http://impl.service.jk.hpu.cn/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "  
  53.             +"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"  
  54.             +"<soapenv:Body><q0:get> <arg0>"  
  55.             +"39cd8f20-50f8-4bc1-96d5-de6de3d7c8b4"  
  56.             +"</arg0> </q0:get></soapenv:Body></soapenv:Envelope>";  
  57.               
  58.             xmlHttpRequest.open("POST",url,true);//打开链接  
  59.             xmlHttpRequest.setRequestHeader("Content-Type","text/xml;charset=utf-8");//设置请求头  
  60.           
  61.             xmlHttpRequest.send(reuqestBody);//发送soap请求  
  62.               
  63.             xmlHttpRequest.onreadystatechange=_back;//在onreadystatechange事件上设置回调函数  
  64.         }  
  65.           
  66.         //回调函数  
  67.         function _back(){  
  68.             if(xmlHttpRequest.readyState==4){//提交完成后  
  69.                 if(xmlHttpRequest.status==200){  
  70.                     var rerXml=xmlHttpRequest.responseXML;  
  71.                     var ret=rerXml.getElementsByTagName("return")[0];//获取return节点  
  72.                       
  73.                 //获取报运号  
  74.                     var customContract=ret.getElementsByTagName("customerContract");  
  75.                     var textNode=customContract[0].firstChild;  
  76.                     document.getElementById("customContract").innerHTML=textNode.nodeValue;  
  77.                       
  78.                     //获取制单日期  
  79.                     var inputDate=ret.getElementsByTagName("inputDate");  
  80.                     textNode=inputDate[0].firstChild;  
  81.                     document.getElementById("inputDate").innerHTML=textNode.nodeValue;  
  82.                       
  83.                     //获取信用证号  
  84.                     var lcno=ret.getElementsByTagName("lcno");  
  85.                     textNode=lcno[0].firstChild;  
  86.                     document.getElementById("lcno").innerHTML=textNode.nodeValue;  
  87.                       
  88.                     //获取收货人及地址  
  89.                     var consignee=ret.getElementsByTagName("consignee");  
  90.                     var textNode=consignee[0].firstChild;  
  91.                     document.getElementById("consignee").innerHTML=textNode.nodeValue;  
  92.                       
  93.                     //获取装运港  
  94.                     var shipmentPort=ret.getElementsByTagName("shipmentPort");  
  95.                     var textNode=shipmentPort[0].firstChild;  
  96.                     document.getElementById("shipmentPort").innerHTML=textNode.nodeValue;  
  97.                       
  98.                     //获取目的港  
  99.                     var destinationPort=ret.getElementsByTagName("destinationPort");  
  100.                     var textNode=destinationPort[0].firstChild;  
  101.                     document.getElementById("destinationPort").innerHTML=textNode.nodeValue;  
  102.                       
  103.                     //获取价格条件  
  104.                     var priceCondition=ret.getElementsByTagName("priceCondition");  
  105.                     var textNode=priceCondition[0].firstChild;  
  106.                     document.getElementById("priceCondition").innerHTML=textNode.nodeValue;  
  107.                       
  108.                     //获取运输方式  
  109.                     var transportMode=ret.getElementsByTagName("transportMode");  
  110.                     var textNode=transportMode[0].firstChild;  
  111.                     document.getElementById("transportMode").innerHTML=textNode.nodeValue;  
  112.                       
  113.                     //获取唛头  
  114.                     var marks=ret.getElementsByTagName("marks");  
  115.                     var textNode=marks[0].firstChild;  
  116.                     document.getElementById("marks").innerHTML=textNode.nodeValue;  
  117.                       
  118.                     //获取备注  
  119.                     var remark=ret.getElementsByTagName("remark");  
  120.                     var textNode=remark[0].firstChild;  
  121.                     document.getElementById("remark").innerHTML=textNode.nodeValue;  
  122.                       
  123.                     //获取备注  
  124.                     var state=ret.getElementsByTagName("state");  
  125.                     var textNode=state[0].firstChild;  
  126.                     document.getElementById("state").innerHTML=textNode.nodeValue;  
  127.                       
  128.                 }else{  
  129.                     alert("访问失败!");  
  130.                 }  
  131.             }  
  132.         }  
  133.           
  134.     </script>  
  135. </head>  
  136. <body>  
  137. <form method="post">  
  138.   
  139.   
  140. <div id="menubar">  
  141. <div id="middleMenubar">  
  142. <div id="innerMenubar">  
  143.     <div id="navMenubar">  
  144. <ul>  
  145. <li id="save"><a href="#" onclick="sendMsg();">查看</a></li>  
  146. </ul>  
  147.     </div>  
  148. </div>  
  149. </div>  
  150. </div>  
  151.        
  152. <div class="textbox" id="centerTextbox">  
  153.       
  154.     <div class="textbox-header">  
  155.     <div class="textbox-inner-header">  
  156.     <div class="textbox-title">  
  157.         出口报运跟踪  
  158.     </div>   
  159.     </div>  
  160.     </div>  
  161. <div>  
  162.    
  163.     <div>  
  164.         <table class="commonTable" cellspacing="1">  
  165.                 <tr>  
  166.                     <td class="columnTitle_mustbe">合同或确认书号:</td>  
  167.                     <td class="tableContent" id="customContract"></td>  
  168.                     <td class="columnTitle_mustbe">制单日期:</td>  
  169.                     <td class="tableContent" id="inputDate">  
  170.                        
  171.                     </td>  
  172.                 </tr>  
  173.                   
  174.                 <tr>  
  175.                     <td class="columnTitle_mustbe">信用证号:</td>  
  176.                     <td class="tableContent" id="lcno"></td>  
  177.                     <td class="columnTitle_mustbe">收货人及地址:</td>  
  178.                     <td class="tableContent" id="consignee"></td>  
  179.                 </tr>  
  180.                   
  181.                 <tr>  
  182.                     <td class="columnTitle_mustbe">装运港:</td>  
  183.                     <td class="tableContent" id="shipmentPort"></td>  
  184.                     <td class="columnTitle_mustbe">目的港:</td>  
  185.                     <td class="tableContent" id="destinationPort"></td>  
  186.                 </tr>  
  187.                   
  188.                 <tr>  
  189.                     <td class="columnTitle_mustbe">价格条件:</td>  
  190.                     <td class="tableContent" id="priceCondition">  
  191.                     </td>  
  192.                     <td class="columnTitle_mustbe">运输方式:</td>  
  193.                     <td class="tableContent" id="transportMode">  
  194.                     </td>  
  195.                 </tr>  
  196.                   
  197.                 <tr>  
  198.                     <td class="columnTitle_mustbe">唛头:</td>  
  199.                     <td class="tableContent" id="marks"></td>  
  200.                     <td class="columnTitle_mustbe">备注:</td>  
  201.                     <td class="tableContent" id="remark"></td>  
  202.                 </tr>  
  203.             </table>  
  204.     </div>  
  205. </div>  
  206.   
  207.   
  208. </form>  
  209. </body>  
  210. </html>  

运行之后的效果:


因为我们是出口报运跟踪,所以我们要添加一个“状态”的显示栏(加在备注下面):
[html]  view plain copy
  1. <tr>  
  2.     <td class="columnTitle_mustbe">状态:</td>  
  3.     <td class="tableContent" id="state"></td>        
  4. </tr>  

这个时候回馈的里面并没有state状态,原因是因为我们没有设默认值,我们在数据库中给它填写一个“0”(0-草稿,1-已上报,2-装修,3-委托,4-发票,5-财务):


这个时候在js方法中添加以下代码:
[javascript]  view plain copy
  1. //获取状态  
  2. var state=ret.getElementsByTagName("state");  
  3. var textNode=state[0].firstChild;  
  4. var s="";  
  5. if(textNode.nodeValue=='1'){  
  6.         s="已上报,待装箱";  
  7. }else if(textNode.nodeValue=='2'){  
  8.     <span style="white-space:pre">    </span>s="已装箱,待委托";  
  9. }else if(textNode.nodeValue=='3'){  
  10.         s="已委托,待发票通知";  
  11. }else if(textNode.nodeValue=='4'){  
  12.         s="已发票,流程顺利完成";  
  13. }else if(textNode.nodeValue=='5'){  
  14.         s="财务处理";  
  15. }else if(textNode.nodeValue=='0'){  
  16.         s="草稿处理状态";  
  17. }  
  18.                       
  19. document.getElementById("state").innerHTML="<font color='red'><b>"+s+"</b></font>";  

此时我们再次点击“查看”,就可以得到出口报运当前的“状态”了:


我们可以注意到,我们的id是写死的,下面我们让用户录入查询的报运号,我们去进行查询:

我们修改html,添加报运编号输入框:
[html]  view plain copy
  1. <tr>  
  2.     <td class="columnTitle_mustbe">报运编号:</td>  
  3.     <td class="tableContent"><input type="text" name="id" id="id"/></td>  
  4. </tr>  

然后js修改:
[javascript]  view plain copy
  1. //发送soap请求  
  2. function sendMsg(){  
  3.               
  4.             var id=document.getElementById("id").value;//用户输入的条件  
  5.             var url="http://localhost/jx-Maven-Webapp/cxf/ExportServiceImpl";//WebService请求路径  
  6.               
  7.             var reuqestBody="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" "  
  8.             +"xmlns:q0=\"http://impl.service.jk.hpu.cn/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "  
  9.             +"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"  
  10.             +"<soapenv:Body><q0:get> <arg0>"  
  11.             +id  
  12.             +"</arg0> </q0:get></soapenv:Body></soapenv:Envelope>";  
  13.               
  14.             xmlHttpRequest.open("POST",url,true);//打开链接  
  15.             xmlHttpRequest.setRequestHeader("Content-Type","text/xml;charset=utf-8");//设置请求头  
  16.           
  17.             xmlHttpRequest.send(reuqestBody);//发送soap请求  
  18.               
  19.             xmlHttpRequest.onreadystatechange=_back;//在onreadystatechange事件上设置回调函数  
  20. }  

我们修改的部分是得到input框输入的id值,然后拼接到soap的XML请求中。

我们试验一下,输入之前那个id号,我们得到了相应的出口报运信息:


但是当我们输入一个不存在的id号的时候,是不可以查询出来信息的,我们要检测一下我们的数据是不是已经查到了。

根据soap规则(我们可以用上一次我们的测试用具去测试一个空的id),如果发送的请求中id不存在,我们返回的XML数据中没有<return>标签。所以我们要检测return标签,存不存在,给予用户提示:
[javascript]  view plain copy
  1. //回调函数  
  2.         function _back(){  
  3.             if(xmlHttpRequest.readyState==4){//提交完成后  
  4.                 if(xmlHttpRequest.status==200){  
  5.                     var rerXml=xmlHttpRequest.responseXML;  
  6.                     var ret=rerXml.getElementsByTagName("return")[0];//获取return节点  
  7.   
  8.   
  9.                     if(ret!=null){  
  10.                         //获取报运号  
  11.                         var customContract=ret.getElementsByTagName("customerContract");  
  12.                         var textNode=customContract[0].firstChild;  
  13.                         document.getElementById("customContract").innerHTML=textNode.nodeValue;  
  14.                           
  15.                         //获取制单日期  
  16.                         var inputDate=ret.getElementsByTagName("inputDate");  
  17.                         textNode=inputDate[0].firstChild;  
  18.                         document.getElementById("inputDate").innerHTML=textNode.nodeValue;  
  19.                           
  20.                         //获取信用证号  
  21.                         var lcno=ret.getElementsByTagName("lcno");  
  22.                         textNode=lcno[0].firstChild;  
  23.                         document.getElementById("lcno").innerHTML=textNode.nodeValue;  
  24.                           
  25.                         //获取收货人及地址  
  26.                         var consignee=ret.getElementsByTagName("consignee");  
  27.                         var textNode=consignee[0].firstChild;  
  28.                         document.getElementById("consignee").innerHTML=textNode.nodeValue;  
  29.                           
  30.                         //获取装运港  
  31.                         var shipmentPort=ret.getElementsByTagName("shipmentPort");  
  32.                         var textNode=shipmentPort[0].firstChild;  
  33.                         document.getElementById("shipmentPort").innerHTML=textNode.nodeValue;  
  34.                           
  35.                         //获取目的港  
  36.                         var destinationPort=ret.getElementsByTagName("destinationPort");  
  37.                         var textNode=destinationPort[0].firstChild;  
  38.                         document.getElementById("destinationPort").innerHTML=textNode.nodeValue;  
  39.                           
  40.                         //获取价格条件  
  41.                         var priceCondition=ret.getElementsByTagName("priceCondition");  
  42.                         var textNode=priceCondition[0].firstChild;  
  43.                         document.getElementById("priceCondition").innerHTML=textNode.nodeValue;  
  44.                           
  45.                         //获取运输方式  
  46.                         var transportMode=ret.getElementsByTagName("transportMode");  
  47.                         var textNode=transportMode[0].firstChild;  
  48.                         document.getElementById("transportMode").innerHTML=textNode.nodeValue;  
  49.                           
  50.                         //获取唛头  
  51.                         var marks=ret.getElementsByTagName("marks");  
  52.                         var textNode=marks[0].firstChild;  
  53.                         document.getElementById("marks").innerHTML=textNode.nodeValue;  
  54.                           
  55.                         //获取备注  
  56.                         var remark=ret.getElementsByTagName("remark");  
  57.                         var textNode=remark[0].firstChild;  
  58.                         document.getElementById("remark").innerHTML=textNode.nodeValue;  
  59.                           
  60.                         //获取状态  
  61.                         var state=ret.getElementsByTagName("state");  
  62.                         var textNode=state[0].firstChild;  
  63.                         var s="";  
  64.                         if(textNode.nodeValue=='1'){  
  65.                             s="已上报,待装箱";  
  66.                         }else if(textNode.nodeValue=='2'){  
  67.                             s="已装箱,待委托";  
  68.                         }else if(textNode.nodeValue=='3'){  
  69.                             s="已委托,待发票通知";  
  70.                         }else if(textNode.nodeValue=='4'){  
  71.                             s="已发票,流程顺利完成";  
  72.                         }else if(textNode.nodeValue=='5'){  
  73.                             s="财务处理";  
  74.                         }else if(textNode.nodeValue=='0'){  
  75.                             s="草稿处理状态";  
  76.                         }  
  77.                           
  78.                         document.getElementById("state").innerHTML="<font color='red'><b>"+s+"</b></font>";  
  79.                     }else{  
  80.                         alert("没有查询到数据!");  
  81.                         //清空所有数据  
  82.                         document.getElementById("customContract").innerHTML="";  
  83.                         document.getElementById("inputDate").innerHTML="";  
  84.                         document.getElementById("lcno").innerHTML="";  
  85.                         document.getElementById("consignee").innerHTML="";  
  86.                         document.getElementById("shipmentPort").innerHTML="";  
  87.                         document.getElementById("destinationPort").innerHTML="";  
  88.                         document.getElementById("priceCondition").innerHTML="";  
  89.                         document.getElementById("transportMode").innerHTML="";  
  90.                         document.getElementById("marks").innerHTML="";  
  91.                         document.getElementById("remark").innerHTML="";       
  92.                         document.getElementById("state").innerHTML="";                
  93.                     }  
  94.                       
  95.                 }else{  
  96.                     alert("访问失败!");  
  97.                 }  
  98.             }  
  99.         }  

然后进行测试:


友好提示也已经完成!
最后一个问题,我们肯定最后不能让用户去输入我们的id(UUID的我们自己都记不住,怎么可能让用户去记,而且会有安全隐患),我们之后可以去新增一个专门用来服务WebService的get方法,我们专门设置一个Mapper去服务它。我们可以使用其他的字段(报运号或信用证号)来查询。

至此,我们的WebService业务编写完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值