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

我们要为出口报运做一个WebService,来提供跨系统的信息查询功能。

我们使用的技术是 -------Apache CXF WebService

作用:两个异构系统,需要共享数据。
需求:我们要给客户提供合同追踪。在出口报运中增加一个WebService,用户可以通过它的系统来访问这个服务,展现出口报运单,主要可以浏览用户的订单状态(走到哪个流程)。查看出口报运单

开发步骤:将现有的Service改造成WebService
1)将CXF整合到项目中,加入jar包。依赖jar。我们系统才 CXF3.0里程碑版本
我们在pom.xml中下入下列依赖配置,利用Maven来自动导入下列jar包:
[html]  view plain copy
  1. <!-- 整合Apache CXF WebService -->  
  2. <dependency>  
  3.     <groupId>org.apache.cxf</groupId>  
  4.     <artifactId>cxf-rt-frontend-jaxws</artifactId>  
  5.     <version>3.0.0-milestone2</version>  
  6. </dependency>  
  7. <dependency>  
  8.     <groupId>org.apache.cxf</groupId>  
  9.     <artifactId>cxf-rt-transports-http</artifactId>  
  10.     <version>3.0.0-milestone2</version>  
  11. </dependency>  
  12. <!-- Jetty is needed if you're using the CXFServlet -->  
  13. <dependency>  
  14.     <groupId>org.apache.cxf</groupId>  
  15.     <artifactId>cxf-rt-transports-http-jetty</artifactId>  
  16.     <version>3.0.0-milestone2</version>  
  17. </dependency>  

保存更改后,可以看到依赖库中已将jar包加入:


2)改造现有的Service变成即支持Service原有的业务,还支持WebService

我们找到出口报运的Service实现类ExportService,加入@WebService注解:

[java]  view plain copy
  1. package cn.hpu.jk.service.impl;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7. import java.util.UUID;  
  8.   
  9. import javax.annotation.Resource;  
  10. import javax.jws.WebService;  
  11.   
  12. import org.springframework.beans.BeanUtils;  
  13. import org.springframework.stereotype.Service;  
  14.   
  15. import cn.hpu.jk.Util.UtilFuns;  
  16. import cn.hpu.jk.dao.ContractDao;  
  17. import cn.hpu.jk.dao.ExportDao;  
  18. import cn.hpu.jk.dao.ExportProductDao;  
  19. import cn.hpu.jk.dao.ExtEproductDao;  
  20. import cn.hpu.jk.domain.Contract;  
  21. import cn.hpu.jk.domain.Export;  
  22. import cn.hpu.jk.domain.ExportProduct;  
  23. import cn.hpu.jk.domain.ExtEproduct;  
  24. import cn.hpu.jk.pagination.Page;  
  25. import cn.hpu.jk.service.ExportService;  
  26. import cn.hpu.jk.vo.ContractProductVO;  
  27. import cn.hpu.jk.vo.ContractVO;  
  28. import cn.hpu.jk.vo.ExtCproductVO;  
  29.   
  30.   
  31. @Service  
  32. @WebService  
  33. public class ExportServiceImpl implements ExportService{  
  34.   
  35.   
  36.     @Resource  
  37.     ExportDao exportDao;  
  38.     @Resource  
  39.     ExportProductDao exportProductDao;  
  40.     @Resource  
  41.     ExtEproductDao extEproductDao;  
  42.     @Resource  
  43.     ContractDao contractDao;  
  44.   
  45.   
  46.     @Override  
  47.     public List<Export> find(Map paraMap) {  
  48.         // TODO Auto-generated method stub  
  49.         return exportDao.find(paraMap);  
  50.     }  
  51.   
  52.   
  53.     @Override  
  54.     public List<Export> findPage(Page page) {  
  55.         // TODO Auto-generated method stub  
  56.         return exportDao.findPage(page);  
  57.     }  
  58.   
  59.   
  60.     @Override  
  61.     public Export get(Serializable id) {  
  62.         // TODO Auto-generated method stub  
  63.         return exportDao.get(id);  
  64.     }  
  65.   
  66.   
  67.     @Override  
  68.     public void insert(String [] contractIds) {  
  69.         //步骤  
  70.         //1.根据合同id获得合同对象,获取合同号  
  71.         //2.将合同下的货物信息搬到报运下的货物表中  
  72.         //2.将合同下的附件信息搬到报运下的附件表中  
  73.           
  74.         //拼接合同号,报运号  
  75.         String contractNos="";  
  76.         for (int i = 0; i < contractIds.length; i++) {  
  77.             ContractVO contract=contractDao.view(contractIds[i]);  
  78.             contractNos+=contract.getContractNo()+" ";//以空格作为分割符  
  79.               
  80.         }  
  81.         contractNos=UtilFuns.delLastChar(contractNos);//删除最后一个空格  
  82.           
  83.         Export export=new Export();  
  84.         export.setId(UUID.randomUUID().toString());  
  85.           
  86.         //将String数组拼成“x,y,z”形式的字符串  
  87.         export.setContractIds(UtilFuns.joinStr(contractIds,","));//工具类,拼接字符串  
  88.         export.setCustomerContract(contractNos);  
  89.         export.setState(0);//默认是草稿状态  
  90.           
  91.         exportDao.insert(export);  
  92.           
  93.         //处理货物以及附件信息  
  94.         for (int i = 0; i < contractIds.length; i++) {  
  95.             ContractVO contract=contractDao.view(contractIds[i]);  
  96.               
  97.             for(ContractProductVO cp : contract.getContractProducts()){  
  98.                 //处理货物信息  
  99.                 ExportProduct ep=new ExportProduct();  
  100.                 ep.setId(UUID.randomUUID().toString());  
  101.                 ep.setExportId(export.getId());  
  102.                   
  103.                 //数据搬家,将合同下的对应的货物信息写入到报运下的货物信息中  
  104.                 ep.setFactoryId(cp.getFactory().getId());  
  105.                 ep.setFactoryName(cp.getFactoryName());  
  106.                 ep.setProductNo(cp.getProductNo());  
  107.                 ep.setPackingUnit(cp.getPackingUnit());  
  108.                 ep.setCnumber(cp.getCnumber());  
  109.                 ep.setBoxNum(Integer.parseInt(cp.getBoxNum()));  
  110.                 ep.setPrice(cp.getPrice());  
  111.                   
  112.                 exportProductDao.insert(ep);  
  113.                   
  114.                 //处理附件信息  
  115.                 for (ExtCproductVO extcp : cp.getExtCproducts()) {  
  116.                     ExtEproduct extep=new ExtEproduct();  
  117.                       
  118.                     //BeanUtils是Spring提供的工具类,实现数据的拷贝  
  119.                     BeanUtils.copyProperties(extcp, extep);  
  120.                     //拷贝的数据并不能完全使用,我们要修改其中的部分数据  
  121.                     extep.setId(UUID.randomUUID().toString());  
  122.                     extep.setExportProductId(ep.getId());//绑定外键  
  123.                     extep.setFactoryId(extcp.getFactory().getId());  
  124.                     extep.setFactoryName(extcp.getFactory().getFactoryName());  
  125.                       
  126.                     extEproductDao.insert(extep);   
  127.                 }  
  128.             }  
  129.               
  130.         }  
  131.     }  
  132.   
  133.   
  134.     @Override  
  135.     public void update(Export export,String [] mr_id,  
  136.             Integer [] mr_orderNo,Integer [] mr_cnumber,  
  137.             Double [] mr_grossWeight,Double [] mr_netWeight,  
  138.             Double [] mr_sizeLength,Double [] mr_sizeWidth,  
  139.             Double [] mr_sizeHeight,Double [] mr_exPrice,  
  140.             Double [] mr_tax,Integer [] mr_changed) {  
  141.           
  142.         exportDao.update(export);  
  143.         //批量修改货物信息  
  144.           
  145.         for (int i = 0; i < mr_id.length; i++) {  
  146.             System.out.println(mr_changed[i]+"#####################");  
  147.             if(mr_changed[i]!=null && mr_changed[i]==1){        //修改标识,只有用户修改的才进行更新  
  148.                 ExportProduct ep=exportProductDao.get(mr_id[i]);  
  149.                 ep.setOrderNo(mr_orderNo[i].toString());  
  150.                 ep.setCnumber(mr_cnumber[i]);  
  151.                 ep.setGrossWeight(mr_grossWeight[i]);  
  152.                 ep.setNetWeight(mr_netWeight[i]);  
  153.                 ep.setSizeLength(mr_sizeLength[i]);  
  154.                 ep.setSizeWidth(mr_sizeWidth[i]);  
  155.                 ep.setSizeHeight(mr_sizeHeight[i]);  
  156.                 ep.setExPrice(mr_exPrice[i]);  
  157.                 ep.setTax(mr_tax[i]);  
  158.                   
  159.                 exportProductDao.update(ep);  
  160.             }  
  161.         }  
  162.           
  163.     }  
  164.       
  165.   
  166.   
  167.     @Override  
  168.     public void delete(Serializable[] ids) {  
  169.         exportDao.delete(ids);  
  170.     }  
  171.   
  172.   
  173.     @Override  
  174.     public void deleteById(Serializable id) {  
  175.         exportDao.deleteById(id);  
  176.           
  177.     }  
  178.   
  179.   
  180.     @Override  
  181.     public void submit(Serializable[] ids) {  
  182.          Map map=new HashMap();  
  183.          map.put("state",1);//1启用  
  184.          map.put("ids", ids);  
  185.            
  186.          exportDao.updateState(map);  
  187.     }  
  188.       
  189.     @Override  
  190.     public void cancel(Serializable[] ids) {  
  191.         Map map=new HashMap();  
  192.          map.put("state",0);//0启用  
  193.          map.put("ids", ids);  
  194.            
  195.          exportDao.updateState(map);  
  196.           
  197.     }  
  198.   
  199.   
  200.     @Override  
  201.     public List<Contract> getContractList() {  
  202.         Map paraMap=new HashMap();  
  203.         paraMap.put("state"1);//1 已上报  
  204.         return contractDao.find(paraMap);  
  205.     }  
  206.       
  207.     //拼接javascript方法串  
  208.     //addTRRecord(objId, id, productNo, cnumber, grossWeight, netWeight, sizeLength, sizeWidth, sizeHeight, exPrice, tax)  
  209.     @Override  
  210.     public String getMrecordData(String exportId){  
  211.         Map paraMap=new HashMap();  
  212.         paraMap.put("exportId", exportId);  
  213.           
  214.         List<ExportProduct> oList=exportProductDao.find(paraMap);  
  215.       
  216.         StringBuffer sBuf=new StringBuffer();  
  217.           
  218.         for (ExportProduct ep:oList) {  
  219.             sBuf.append("addTRRecord(\"mRecordTable\", \"")  
  220.             .append(ep.getId()).append("\", \"").append(ep.getProductNo())  
  221.             .append("\", \"").append(ep.getCnumber()).append("\", \"").append(UtilFuns.convertNull(ep.getGrossWeight()))  
  222.             .append("\", \"").append(UtilFuns.convertNull(ep.getNetWeight())).append("\", \"").append(UtilFuns.convertNull(ep.getSizeLength()))  
  223.             .append("\", \"").append(UtilFuns.convertNull(ep.getSizeWidth())).append("\", \"").append(UtilFuns.convertNull(ep.getSizeHeight()))  
  224.             .append("\", \"").append(UtilFuns.convertNull(ep.getExPrice())).append("\", \"").append(UtilFuns.convertNull(ep.getTax())).append("\");");  
  225.         }  
  226.           
  227.         return sBuf.toString();  
  228.           
  229.     }  
  230. }  

因为我们Service改变成WebService,所以我们的实体类Export也要发生改变,要求我们的实体类必须进行序列化(Serializable):
[java]  view plain copy
  1. public class Export implements Serializable{  
  2.     //代码省略  
  3. }  

由于我们实现了Serializable接口,这个类的方法的参数不能使用Serializable类型的(会报错),所以我们把ExportService中的所有Serializable的参数全部改为String。

由于我们出口报运现在是对外提供WebService服务,我们的Service层就不能再提供插入、删除等方法,所以我们要把之前的方法给屏蔽掉,我们使用
@WebMethod(exclude=true)注解将需要屏蔽的方法屏蔽掉,例子:
[java]  view plain copy
  1. @WebMethod(exclude=true)  
  2. public void delete(String[] ids) {  
  3.     exportDao.delete(ids);  
  4. }  

设置完毕后,我们ExportServiceImpl对外部只开放了一个get()方法。

观察ExportServiceImpl,我们在整合时候会出现一个大问题,可以发现,我们的get方法中使用了exportDao这个对象,我们现在有2个框架,一个是我们系统自己的框架,一个是Apache的CXF框架。我们现在这个exportDao是属于原有系统的,因为查询需要调用其中的方法,所以这个原有的Dao必须需要,这就出现了问题,因为我们原有系统只要是Spring容器,现在我们提供WebService使用的是CXF的容器,这两个容器之间要互相调用,也就是WebService的类去调用Spring的Dao,这个时候我们就要加一个单独的set方法:
[java]  view plain copy
  1. @Service  
  2. @WebService  
  3. public class ExportServiceImpl implements ExportService{  
  4.   
  5.     @Resource  
  6.     ExportDao exportDao;  
  7.       
  8.     //利用set方法,在cxf中注入Dao,这样cxf的WebService才可以查询我们系统的数据  
  9.     @WebMethod(exclude=true)  
  10.     public void setExportDao(ExportDao exportDao) {  
  11.         this.exportDao = exportDao;  
  12.     }  
  13.     //下面代码省略  
  14. }  

我们的Service改造就完毕了

3)配置cxf-servlet.xml 核心配置文件
我们在工程的resources文件夹下建立cxf-servlet.xml文件


并加入文件头:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"   
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.         xmlns:jaxws="http://cxf.apache.org/jaxws"   
  5.         xsi:schemaLocation=" http://www.springframework.org/schema/beans   
  6.                             http://www.springframework.org/schema/beans/spring-beans.xsd   
  7.                             http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
  8.     <import resource="classpath:META-INF/cxf/cxf.xml"/>  
  9.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>  
  10.   
  11.       
  12. </beans>  

接下来我们要在<beans></beans>标签对中注入我们需要的bean,然后发布WebService:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"   
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.         xmlns:jaxws="http://cxf.apache.org/jaxws"   
  5.         xsi:schemaLocation=" http://www.springframework.org/schema/beans   
  6.                             http://www.springframework.org/schema/beans/spring-beans.xsd   
  7.                             http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
  8.     <import resource="classpath:META-INF/cxf/cxf.xml"/>  
  9.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>  
  10.       
  11. <span style="white-space:pre">    </span><!-- 声明WebService Bean,发布WebService -->  
  12.     <bean id="exportService" class="cn.hpu.jk.service.impl.ExportServiceImpl">  
  13.         <property name="exportDao">  
  14.             <ref bean="exportDaoImpl"/>  
  15.         </property>  
  16.     </bean>  
  17.       
  18.     <!-- 发布WebService -->  
  19.     <!-- http://localhost:8080/jk/cxf/ExportServiceImpl -->  
  20.     <jaxws:endpoint implementor="#exportService" address="/ExportServiceImpl"/>  
  21.       
  22. </beans>  

我们的cxf-servlet.xml配置文件搞定

4)发布WebService方法供客户的系统进行调用 web.xml
我们在工程的Web.xml中加入CXF的Servlet的配置:
[html]  view plain copy
  1. <!-- 3.配置CXF webserice -->  
  2.  <servlet>  
  3.     <servlet-name>cxf</servlet-name>  
  4.     <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
  5.     <init-param>  
  6.         <param-name>config-location</param-name>  
  7.         <param-value>classpath:cxf-servlet.xml</param-value>  
  8.     </init-param>  
  9.  </servlet>  
  10.  <servlet-mapping>  
  11.     <servlet-name>cxf</servlet-name>  
  12.     <url-pattern>/cxf/*</url-pattern>  
  13.  </servlet-mapping>  

我们重启服务器来测试一下,首先看看我们报运的原有业务还是不是正常的:

列表显示正常,我们看一下修改功能:

修改也是正常的,说明我们加入的WebService并没有影响我们系统正常功能的运行。

那我们怎么验证我们的WebService已经好了呢?

我们访问下面的路径:
http://localhost/jx-Maven-Webapp/cxf/ExportServiceImpl?wsdl

发现我们工程报错了:
java.lang.ClassNotFoundException: org.apache.cxf.transport.servlet.CXFServlet

原因:
当使用maven工程时,修改了pom.xml加了新的依赖的jar,必须重新发布。

所以我们这个时候重新发布我们的工程,然后重新访问这个路径,结果网页显示:
[html]  view plain copy
  1. <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.service.jk.hpu.cn/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="ExportServiceImplService" targetNamespace="http://impl.service.jk.hpu.cn/">  
  2. <wsdl:types>  
  3. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://impl.service.jk.hpu.cn/" elementFormDefault="unqualified" targetNamespace="http://impl.service.jk.hpu.cn/" version="1.0">  
  4. <xs:element name="get" type="tns:get"/>  
  5. <xs:element name="getResponse" type="tns:getResponse"/>  
  6. <xs:complexType name="get">  
  7. <xs:sequence>  
  8. <xs:element minOccurs="0" name="arg0" type="xs:string"/>  
  9. </xs:sequence>  
  10. </xs:complexType>  
  11. <xs:complexType name="getResponse">  
  12. <xs:sequence>  
  13. <xs:element minOccurs="0" name="return" type="tns:export"/>  
  14. </xs:sequence>  
  15. </xs:complexType>  
  16. <xs:complexType name="export">  
  17. <xs:sequence>  
  18. <xs:element minOccurs="0" name="consignee" type="xs:string"/>  
  19. <xs:element minOccurs="0" name="contractIds" type="xs:string"/>  
  20. <xs:element minOccurs="0" name="createBy" type="xs:string"/>  
  21. <xs:element minOccurs="0" name="createDept" type="xs:string"/>  
  22. <xs:element minOccurs="0" name="createTime" type="xs:dateTime"/>  
  23. <xs:element minOccurs="0" name="customerContract" type="xs:string"/>  
  24. <xs:element minOccurs="0" name="destinationPort" type="xs:string"/>  
  25. <xs:element minOccurs="0" name="epnum" type="xs:string"/>  
  26. <xs:element minOccurs="0" name="extnum" type="xs:string"/>  
  27. <xs:element minOccurs="0" name="grossWeight" type="xs:double"/>  
  28. <xs:element minOccurs="0" name="id" type="xs:string"/>  
  29. <xs:element minOccurs="0" name="inputDate" type="xs:dateTime"/>  
  30. <xs:element minOccurs="0" name="lcno" type="xs:string"/>  
  31. <xs:element minOccurs="0" name="marks" type="xs:string"/>  
  32. <xs:element minOccurs="0" name="measurement" type="xs:string"/>  
  33. <xs:element minOccurs="0" name="netWeight" type="xs:double"/>  
  34. <xs:element minOccurs="0" name="priceCondition" type="xs:string"/>  
  35. <xs:element minOccurs="0" name="remark" type="xs:string"/>  
  36. <xs:element minOccurs="0" name="shipmentPort" type="xs:string"/>  
  37. <xs:element minOccurs="0" name="state" type="xs:int"/>  
  38. <xs:element minOccurs="0" name="transportMode" type="xs:string"/>  
  39. </xs:sequence>  
  40. </xs:complexType>  
  41. </xs:schema>  
  42. </wsdl:types>  
  43. <wsdl:message name="getResponse">  
  44. <wsdl:part element="tns:getResponse" name="parameters"></wsdl:part>  
  45. </wsdl:message>  
  46. <wsdl:message name="get">  
  47. <wsdl:part element="tns:get" name="parameters"></wsdl:part>  
  48. </wsdl:message>  
  49. <wsdl:portType name="ExportServiceImpl">  
  50. <wsdl:operation name="get">  
  51. <wsdl:input message="tns:get" name="get"></wsdl:input>  
  52. <wsdl:output message="tns:getResponse" name="getResponse"></wsdl:output>  
  53. </wsdl:operation>  
  54. </wsdl:portType>  
  55. <wsdl:binding name="ExportServiceImplServiceSoapBinding" type="tns:ExportServiceImpl">  
  56. <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>  
  57. <wsdl:operation name="get">  
  58. <soap:operation soapAction="" style="document"/>  
  59. <wsdl:input name="get">  
  60. <soap:body use="literal"/>  
  61. </wsdl:input>  
  62. <wsdl:output name="getResponse">  
  63. <soap:body use="literal"/>  
  64. </wsdl:output>  
  65. </wsdl:operation>  
  66. </wsdl:binding>  
  67. <wsdl:service name="ExportServiceImplService">  
  68. <wsdl:port binding="tns:ExportServiceImplServiceSoapBinding" name="ExportServiceImplPort">  
  69. <soap:address location="http://localhost/jx-Maven-Webapp/cxf/ExportServiceImpl"/>  
  70. </wsdl:port>  
  71. </wsdl:service>  
  72. </wsdl:definitions>  

说明我们的WebService已经发布成功!

那我们怎么访问WebService的信息呢?一般我们使用ajax去调用WebService,接下来我们就在下面的5)中模拟用户使用Ajax来访问我们的WebService。因为我们没有其他项目,就在这个项目里去测试调用。

5)模拟用户调用ajax;soap 发送xml;接收xml
我们先建一个Controller来取访问WebService的链接:
[java]  view plain copy
  1. package cn.hpu.jk.controller.ws;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.   
  6. //在系统中调用cxf提供的WebService  
  7. @Controller  
  8. public class WSExportController {  
  9.       
  10.     @RequestMapping("/ws/export/toedit.action")  
  11.     public String toedit(){  
  12.         return "/ws/export/ajaxExport.jsp";  
  13.     }  
  14.       
  15. }  

我们在工程的货运管理界面左侧菜单栏加入WebService测试的链接。首先在WEB-INF/pages/cargo的left.jap中添加以下代码:
[html]  view plain copy
  1. <li><a href="${ctx }/ws/export/toedit.action" onclick="linkHighlighted(this)" target="main" id="aa_1">WS出口报运单</a></li>  

效果:


编辑/ws/export/ajaxExport.jsp页面之前,我们先了解一下如何soap发送xml和接收xml信息。


MyEclipse有一个工具,我们点击Launch SAOP Web Service Explorer,然后选择
WSDL Page界面,在这个界面上输入我们的WebService地址,然后点击“go”:


我们就得到如下的界面,我们选择左侧菜单下的“get”方法,可以看到需要我们输入一个值,这里我们ExportServiceImpl的get()方法需要一个参数id,所以我们从数据库已有数据中找到一个测试数据的id输入进去,点击“go”:


此时在下面的status界面中就会出现请求结果:



点击Source,就可以看到saop发出的XML请求和得到的XML回复:



于是我们就得到了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>  

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

由上面的js代码大家可以看到,我们现在先获取XML信息将它alert出来,看看是不是能得到WebService的反馈,点击查看按钮:

得到弹窗回复:


这就证实了我们的soap的XML请求成功发送给了WebService,然后WebService也给予我们soap的XML回复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值