我们要为出口报运做一个WebService,来提供跨系统的信息查询功能。
我们使用的技术是 -------Apache CXF WebService
作用:两个异构系统,需要共享数据。
需求:我们要给客户提供合同追踪。在出口报运中增加一个WebService,用户可以通过它的系统来访问这个服务,展现出口报运单,主要可以浏览用户的订单状态(走到哪个流程)。查看出口报运单
开发步骤:将现有的Service改造成WebService
1)将CXF整合到项目中,加入jar包。依赖jar。我们系统才 CXF3.0里程碑版本
我们在pom.xml中下入下列依赖配置,利用Maven来自动导入下列jar包:
保存更改后,可以看到依赖库中已将jar包加入:
2)改造现有的Service变成即支持Service原有的业务,还支持WebService
由于我们实现了Serializable接口,这个类的方法的参数不能使用Serializable类型的(会报错),所以我们把ExportService中的所有Serializable的参数全部改为String。
由于我们出口报运现在是对外提供WebService服务,我们的Service层就不能再提供插入、删除等方法,所以我们要把之前的方法给屏蔽掉,我们使用
@WebMethod(exclude=true)注解将需要屏蔽的方法屏蔽掉,例子:
设置完毕后,我们ExportServiceImpl对外部只开放了一个get()方法。
观察ExportServiceImpl,我们在整合时候会出现一个大问题,可以发现,我们的get方法中使用了exportDao这个对象,我们现在有2个框架,一个是我们系统自己的框架,一个是Apache的CXF框架。我们现在这个exportDao是属于原有系统的,因为查询需要调用其中的方法,所以这个原有的Dao必须需要,这就出现了问题,因为我们原有系统只要是Spring容器,现在我们提供WebService使用的是CXF的容器,这两个容器之间要互相调用,也就是WebService的类去调用Spring的Dao,这个时候我们就要加一个单独的set方法:
我们的Service改造就完毕了
3)配置cxf-servlet.xml 核心配置文件
我们在工程的resources文件夹下建立cxf-servlet.xml文件
接下来我们要在<beans></beans>标签对中注入我们需要的bean,然后发布WebService:
我们的cxf-servlet.xml配置文件搞定
4)发布WebService方法供客户的系统进行调用 web.xml
我们在工程的Web.xml中加入CXF的Servlet的配置:
我们重启服务器来测试一下,首先看看我们报运的原有业务还是不是正常的:
列表显示正常,我们看一下修改功能:
修改也是正常的,说明我们加入的WebService并没有影响我们系统正常功能的运行。
那我们怎么验证我们的WebService已经好了呢?
我们访问下面的路径:
http://localhost/jx-Maven-Webapp/cxf/ExportServiceImpl?wsdl
发现我们工程报错了:
java.lang.ClassNotFoundException: org.apache.cxf.transport.servlet.CXFServlet
原因:
当使用maven工程时,修改了pom.xml加了新的依赖的jar,必须重新发布。
所以我们这个时候重新发布我们的工程,然后重新访问这个路径,结果网页显示:
说明我们的WebService已经发布成功!
那我们怎么访问WebService的信息呢?一般我们使用ajax去调用WebService,接下来我们就在下面的5)中模拟用户使用Ajax来访问我们的WebService。因为我们没有其他项目,就在这个项目里去测试调用。
5)模拟用户调用ajax;soap 发送xml;接收xml
我们先建一个Controller来取访问WebService的链接:
我们在工程的货运管理界面左侧菜单栏加入WebService测试的链接。首先在WEB-INF/pages/cargo的left.jap中添加以下代码:
WSDL Page界面,在这个界面上输入我们的WebService地址,然后点击“go”:
我们就得到如下的界面,我们选择左侧菜单下的“get”方法,可以看到需要我们输入一个值,这里我们ExportServiceImpl的get()方法需要一个参数id,所以我们从数据库已有数据中找到一个测试数据的id输入进去,点击“go”:
此时在下面的status界面中就会出现请求结果:
点击Source,就可以看到saop发出的XML请求和得到的XML回复:
于是我们就得到了saop发出的XML请求和得到的XML回复
请求:
回复:
然后编辑我们的/ws/export/ajaxExport.jsp页面:
由上面的js代码大家可以看到,我们现在先获取XML信息将它alert出来,看看是不是能得到WebService的反馈,点击查看按钮:
得到弹窗回复:
这就证实了我们的soap的XML请求成功发送给了WebService,然后WebService也给予我们soap的XML回复。
我们使用的技术是 -------Apache CXF WebService
作用:两个异构系统,需要共享数据。
需求:我们要给客户提供合同追踪。在出口报运中增加一个WebService,用户可以通过它的系统来访问这个服务,展现出口报运单,主要可以浏览用户的订单状态(走到哪个流程)。查看出口报运单
开发步骤:将现有的Service改造成WebService
1)将CXF整合到项目中,加入jar包。依赖jar。我们系统才 CXF3.0里程碑版本
我们在pom.xml中下入下列依赖配置,利用Maven来自动导入下列jar包:
- <!-- 整合Apache CXF WebService -->
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-rt-frontend-jaxws</artifactId>
- <version>3.0.0-milestone2</version>
- </dependency>
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-rt-transports-http</artifactId>
- <version>3.0.0-milestone2</version>
- </dependency>
- <!-- Jetty is needed if you're using the CXFServlet -->
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-rt-transports-http-jetty</artifactId>
- <version>3.0.0-milestone2</version>
- </dependency>
保存更改后,可以看到依赖库中已将jar包加入:
2)改造现有的Service变成即支持Service原有的业务,还支持WebService
我们找到出口报运的Service实现类ExportService,加入@WebService注解:
- package cn.hpu.jk.service.impl;
- import java.io.Serializable;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.UUID;
- import javax.annotation.Resource;
- import javax.jws.WebService;
- import org.springframework.beans.BeanUtils;
- import org.springframework.stereotype.Service;
- import cn.hpu.jk.Util.UtilFuns;
- import cn.hpu.jk.dao.ContractDao;
- import cn.hpu.jk.dao.ExportDao;
- import cn.hpu.jk.dao.ExportProductDao;
- import cn.hpu.jk.dao.ExtEproductDao;
- import cn.hpu.jk.domain.Contract;
- import cn.hpu.jk.domain.Export;
- import cn.hpu.jk.domain.ExportProduct;
- import cn.hpu.jk.domain.ExtEproduct;
- import cn.hpu.jk.pagination.Page;
- import cn.hpu.jk.service.ExportService;
- import cn.hpu.jk.vo.ContractProductVO;
- import cn.hpu.jk.vo.ContractVO;
- import cn.hpu.jk.vo.ExtCproductVO;
- @Service
- @WebService
- public class ExportServiceImpl implements ExportService{
- @Resource
- ExportDao exportDao;
- @Resource
- ExportProductDao exportProductDao;
- @Resource
- ExtEproductDao extEproductDao;
- @Resource
- ContractDao contractDao;
- @Override
- public List<Export> find(Map paraMap) {
- // TODO Auto-generated method stub
- return exportDao.find(paraMap);
- }
- @Override
- public List<Export> findPage(Page page) {
- // TODO Auto-generated method stub
- return exportDao.findPage(page);
- }
- @Override
- public Export get(Serializable id) {
- // TODO Auto-generated method stub
- return exportDao.get(id);
- }
- @Override
- public void insert(String [] contractIds) {
- //步骤
- //1.根据合同id获得合同对象,获取合同号
- //2.将合同下的货物信息搬到报运下的货物表中
- //2.将合同下的附件信息搬到报运下的附件表中
- //拼接合同号,报运号
- String contractNos="";
- for (int i = 0; i < contractIds.length; i++) {
- ContractVO contract=contractDao.view(contractIds[i]);
- contractNos+=contract.getContractNo()+" ";//以空格作为分割符
- }
- contractNos=UtilFuns.delLastChar(contractNos);//删除最后一个空格
- Export export=new Export();
- export.setId(UUID.randomUUID().toString());
- //将String数组拼成“x,y,z”形式的字符串
- export.setContractIds(UtilFuns.joinStr(contractIds,","));//工具类,拼接字符串
- export.setCustomerContract(contractNos);
- export.setState(0);//默认是草稿状态
- exportDao.insert(export);
- //处理货物以及附件信息
- for (int i = 0; i < contractIds.length; i++) {
- ContractVO contract=contractDao.view(contractIds[i]);
- for(ContractProductVO cp : contract.getContractProducts()){
- //处理货物信息
- ExportProduct ep=new ExportProduct();
- ep.setId(UUID.randomUUID().toString());
- ep.setExportId(export.getId());
- //数据搬家,将合同下的对应的货物信息写入到报运下的货物信息中
- ep.setFactoryId(cp.getFactory().getId());
- ep.setFactoryName(cp.getFactoryName());
- ep.setProductNo(cp.getProductNo());
- ep.setPackingUnit(cp.getPackingUnit());
- ep.setCnumber(cp.getCnumber());
- ep.setBoxNum(Integer.parseInt(cp.getBoxNum()));
- ep.setPrice(cp.getPrice());
- exportProductDao.insert(ep);
- //处理附件信息
- for (ExtCproductVO extcp : cp.getExtCproducts()) {
- ExtEproduct extep=new ExtEproduct();
- //BeanUtils是Spring提供的工具类,实现数据的拷贝
- BeanUtils.copyProperties(extcp, extep);
- //拷贝的数据并不能完全使用,我们要修改其中的部分数据
- extep.setId(UUID.randomUUID().toString());
- extep.setExportProductId(ep.getId());//绑定外键
- extep.setFactoryId(extcp.getFactory().getId());
- extep.setFactoryName(extcp.getFactory().getFactoryName());
- extEproductDao.insert(extep);
- }
- }
- }
- }
- @Override
- public void update(Export export,String [] mr_id,
- Integer [] mr_orderNo,Integer [] mr_cnumber,
- Double [] mr_grossWeight,Double [] mr_netWeight,
- Double [] mr_sizeLength,Double [] mr_sizeWidth,
- Double [] mr_sizeHeight,Double [] mr_exPrice,
- Double [] mr_tax,Integer [] mr_changed) {
- exportDao.update(export);
- //批量修改货物信息
- for (int i = 0; i < mr_id.length; i++) {
- System.out.println(mr_changed[i]+"#####################");
- if(mr_changed[i]!=null && mr_changed[i]==1){ //修改标识,只有用户修改的才进行更新
- ExportProduct ep=exportProductDao.get(mr_id[i]);
- ep.setOrderNo(mr_orderNo[i].toString());
- ep.setCnumber(mr_cnumber[i]);
- ep.setGrossWeight(mr_grossWeight[i]);
- ep.setNetWeight(mr_netWeight[i]);
- ep.setSizeLength(mr_sizeLength[i]);
- ep.setSizeWidth(mr_sizeWidth[i]);
- ep.setSizeHeight(mr_sizeHeight[i]);
- ep.setExPrice(mr_exPrice[i]);
- ep.setTax(mr_tax[i]);
- exportProductDao.update(ep);
- }
- }
- }
- @Override
- public void delete(Serializable[] ids) {
- exportDao.delete(ids);
- }
- @Override
- public void deleteById(Serializable id) {
- exportDao.deleteById(id);
- }
- @Override
- public void submit(Serializable[] ids) {
- Map map=new HashMap();
- map.put("state",1);//1启用
- map.put("ids", ids);
- exportDao.updateState(map);
- }
- @Override
- public void cancel(Serializable[] ids) {
- Map map=new HashMap();
- map.put("state",0);//0启用
- map.put("ids", ids);
- exportDao.updateState(map);
- }
- @Override
- public List<Contract> getContractList() {
- Map paraMap=new HashMap();
- paraMap.put("state", 1);//1 已上报
- return contractDao.find(paraMap);
- }
- //拼接javascript方法串
- //addTRRecord(objId, id, productNo, cnumber, grossWeight, netWeight, sizeLength, sizeWidth, sizeHeight, exPrice, tax)
- @Override
- public String getMrecordData(String exportId){
- Map paraMap=new HashMap();
- paraMap.put("exportId", exportId);
- List<ExportProduct> oList=exportProductDao.find(paraMap);
- StringBuffer sBuf=new StringBuffer();
- for (ExportProduct ep:oList) {
- sBuf.append("addTRRecord(\"mRecordTable\", \"")
- .append(ep.getId()).append("\", \"").append(ep.getProductNo())
- .append("\", \"").append(ep.getCnumber()).append("\", \"").append(UtilFuns.convertNull(ep.getGrossWeight()))
- .append("\", \"").append(UtilFuns.convertNull(ep.getNetWeight())).append("\", \"").append(UtilFuns.convertNull(ep.getSizeLength()))
- .append("\", \"").append(UtilFuns.convertNull(ep.getSizeWidth())).append("\", \"").append(UtilFuns.convertNull(ep.getSizeHeight()))
- .append("\", \"").append(UtilFuns.convertNull(ep.getExPrice())).append("\", \"").append(UtilFuns.convertNull(ep.getTax())).append("\");");
- }
- return sBuf.toString();
- }
- }
因为我们Service改变成WebService,所以我们的实体类Export也要发生改变,要求我们的实体类必须进行序列化(Serializable):
- public class Export implements Serializable{
- //代码省略
- }
由于我们实现了Serializable接口,这个类的方法的参数不能使用Serializable类型的(会报错),所以我们把ExportService中的所有Serializable的参数全部改为String。
由于我们出口报运现在是对外提供WebService服务,我们的Service层就不能再提供插入、删除等方法,所以我们要把之前的方法给屏蔽掉,我们使用
@WebMethod(exclude=true)注解将需要屏蔽的方法屏蔽掉,例子:
- @WebMethod(exclude=true)
- public void delete(String[] ids) {
- exportDao.delete(ids);
- }
设置完毕后,我们ExportServiceImpl对外部只开放了一个get()方法。
观察ExportServiceImpl,我们在整合时候会出现一个大问题,可以发现,我们的get方法中使用了exportDao这个对象,我们现在有2个框架,一个是我们系统自己的框架,一个是Apache的CXF框架。我们现在这个exportDao是属于原有系统的,因为查询需要调用其中的方法,所以这个原有的Dao必须需要,这就出现了问题,因为我们原有系统只要是Spring容器,现在我们提供WebService使用的是CXF的容器,这两个容器之间要互相调用,也就是WebService的类去调用Spring的Dao,这个时候我们就要加一个单独的set方法:
- @Service
- @WebService
- public class ExportServiceImpl implements ExportService{
- @Resource
- ExportDao exportDao;
- //利用set方法,在cxf中注入Dao,这样cxf的WebService才可以查询我们系统的数据
- @WebMethod(exclude=true)
- public void setExportDao(ExportDao exportDao) {
- this.exportDao = exportDao;
- }
- //下面代码省略
- }
我们的Service改造就完毕了
3)配置cxf-servlet.xml 核心配置文件
我们在工程的resources文件夹下建立cxf-servlet.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:jaxws="http://cxf.apache.org/jaxws"
- xsi:schemaLocation=" http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
- <import resource="classpath:META-INF/cxf/cxf.xml"/>
- <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
- </beans>
接下来我们要在<beans></beans>标签对中注入我们需要的bean,然后发布WebService:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:jaxws="http://cxf.apache.org/jaxws"
- xsi:schemaLocation=" http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
- <import resource="classpath:META-INF/cxf/cxf.xml"/>
- <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
- <span style="white-space:pre"> </span><!-- 声明WebService Bean,发布WebService -->
- <bean id="exportService" class="cn.hpu.jk.service.impl.ExportServiceImpl">
- <property name="exportDao">
- <ref bean="exportDaoImpl"/>
- </property>
- </bean>
- <!-- 发布WebService -->
- <!-- http://localhost:8080/jk/cxf/ExportServiceImpl -->
- <jaxws:endpoint implementor="#exportService" address="/ExportServiceImpl"/>
- </beans>
我们的cxf-servlet.xml配置文件搞定
4)发布WebService方法供客户的系统进行调用 web.xml
我们在工程的Web.xml中加入CXF的Servlet的配置:
- <!-- 3.配置CXF webserice -->
- <servlet>
- <servlet-name>cxf</servlet-name>
- <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
- <init-param>
- <param-name>config-location</param-name>
- <param-value>classpath:cxf-servlet.xml</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>cxf</servlet-name>
- <url-pattern>/cxf/*</url-pattern>
- </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,必须重新发布。
所以我们这个时候重新发布我们的工程,然后重新访问这个路径,结果网页显示:
- <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/">
- <wsdl:types>
- <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">
- <xs:element name="get" type="tns:get"/>
- <xs:element name="getResponse" type="tns:getResponse"/>
- <xs:complexType name="get">
- <xs:sequence>
- <xs:element minOccurs="0" name="arg0" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="getResponse">
- <xs:sequence>
- <xs:element minOccurs="0" name="return" type="tns:export"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="export">
- <xs:sequence>
- <xs:element minOccurs="0" name="consignee" type="xs:string"/>
- <xs:element minOccurs="0" name="contractIds" type="xs:string"/>
- <xs:element minOccurs="0" name="createBy" type="xs:string"/>
- <xs:element minOccurs="0" name="createDept" type="xs:string"/>
- <xs:element minOccurs="0" name="createTime" type="xs:dateTime"/>
- <xs:element minOccurs="0" name="customerContract" type="xs:string"/>
- <xs:element minOccurs="0" name="destinationPort" type="xs:string"/>
- <xs:element minOccurs="0" name="epnum" type="xs:string"/>
- <xs:element minOccurs="0" name="extnum" type="xs:string"/>
- <xs:element minOccurs="0" name="grossWeight" type="xs:double"/>
- <xs:element minOccurs="0" name="id" type="xs:string"/>
- <xs:element minOccurs="0" name="inputDate" type="xs:dateTime"/>
- <xs:element minOccurs="0" name="lcno" type="xs:string"/>
- <xs:element minOccurs="0" name="marks" type="xs:string"/>
- <xs:element minOccurs="0" name="measurement" type="xs:string"/>
- <xs:element minOccurs="0" name="netWeight" type="xs:double"/>
- <xs:element minOccurs="0" name="priceCondition" type="xs:string"/>
- <xs:element minOccurs="0" name="remark" type="xs:string"/>
- <xs:element minOccurs="0" name="shipmentPort" type="xs:string"/>
- <xs:element minOccurs="0" name="state" type="xs:int"/>
- <xs:element minOccurs="0" name="transportMode" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
- </xs:schema>
- </wsdl:types>
- <wsdl:message name="getResponse">
- <wsdl:part element="tns:getResponse" name="parameters"></wsdl:part>
- </wsdl:message>
- <wsdl:message name="get">
- <wsdl:part element="tns:get" name="parameters"></wsdl:part>
- </wsdl:message>
- <wsdl:portType name="ExportServiceImpl">
- <wsdl:operation name="get">
- <wsdl:input message="tns:get" name="get"></wsdl:input>
- <wsdl:output message="tns:getResponse" name="getResponse"></wsdl:output>
- </wsdl:operation>
- </wsdl:portType>
- <wsdl:binding name="ExportServiceImplServiceSoapBinding" type="tns:ExportServiceImpl">
- <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
- <wsdl:operation name="get">
- <soap:operation soapAction="" style="document"/>
- <wsdl:input name="get">
- <soap:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="getResponse">
- <soap:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- </wsdl:binding>
- <wsdl:service name="ExportServiceImplService">
- <wsdl:port binding="tns:ExportServiceImplServiceSoapBinding" name="ExportServiceImplPort">
- <soap:address location="http://localhost/jx-Maven-Webapp/cxf/ExportServiceImpl"/>
- </wsdl:port>
- </wsdl:service>
- </wsdl:definitions>
说明我们的WebService已经发布成功!
那我们怎么访问WebService的信息呢?一般我们使用ajax去调用WebService,接下来我们就在下面的5)中模拟用户使用Ajax来访问我们的WebService。因为我们没有其他项目,就在这个项目里去测试调用。
5)模拟用户调用ajax;soap 发送xml;接收xml
我们先建一个Controller来取访问WebService的链接:
- package cn.hpu.jk.controller.ws;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- //在系统中调用cxf提供的WebService
- @Controller
- public class WSExportController {
- @RequestMapping("/ws/export/toedit.action")
- public String toedit(){
- return "/ws/export/ajaxExport.jsp";
- }
- }
我们在工程的货运管理界面左侧菜单栏加入WebService测试的链接。首先在WEB-INF/pages/cargo的left.jap中添加以下代码:
- <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信息。
WSDL Page界面,在这个界面上输入我们的WebService地址,然后点击“go”:
我们就得到如下的界面,我们选择左侧菜单下的“get”方法,可以看到需要我们输入一个值,这里我们ExportServiceImpl的get()方法需要一个参数id,所以我们从数据库已有数据中找到一个测试数据的id输入进去,点击“go”:
此时在下面的status界面中就会出现请求结果:
点击Source,就可以看到saop发出的XML请求和得到的XML回复:
于是我们就得到了saop发出的XML请求和得到的XML回复
请求:
- <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">
- <soapenv:Body>
- <q0:get>
- <arg0>39cd8f20-50f8-4bc1-96d5-de6de3d7c8b4</arg0>
- </q0:get>
- </soapenv:Body>
- </soapenv:Envelope>
回复:
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
- <soap:Body>
- <ns2:getResponse xmlns:ns2="http://impl.service.jk.hpu.cn/">
- <return>
- <consignee>南京</consignee>
- <contractIds>392bf3b2-cb0e-4e7a-ba02-c91ce83e9fe1,55743f24-f092-47ac-b149-358785437238</contractIds>
- <customerContract>3 2</customerContract>
- <destinationPort>深圳港</destinationPort>
- <id>39cd8f20-50f8-4bc1-96d5-de6de3d7c8b4</id>
- <inputDate>2015-10-09T00:00:00+08:00</inputDate>
- <lcno>T/T</lcno>
- <marks>11</marks>
- <priceCondition>2</priceCondition>
- <remark>22</remark>
- <shipmentPort>连云港</shipmentPort>
- <transportMode>1</transportMode>
- </return>
- </ns2:getResponse>
- </soap:Body>
- </soap:Envelope>
然后编辑我们的/ws/export/ajaxExport.jsp页面:
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ include file="../../base.jsp"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>出口报运跟踪</title>
- <script language="javascript" src="${ctx}/js/datepicker/WdatePicker.js"></script>
- <script type="text/javascript">
- /*
- 开发步骤
- 1.创建xmlHttpRquest对象
- 2.open('POST',url,true)链接
- 3.设置请求头
- 4.send(xml)
- 5.回调函数,接收响应xml
- 6.从返回的XML抓取我们相关的信息
- */
- var xmlHttpRequest;
- if(window.XMLHttpRequest){
- //针对FireFox、Mozillar、Opera、Safari、IE7、IE8
- xmlHttpRequest=new XMLHttpRequest();
- //修复类似Mozillar浏览器的bug
- if(xmlHttpRequest.overrideMimeType){
- xmlHttpRequest.overrideMimeType("text/xml");
- }
- }else if(window.ActiveXObject){
- //所有的IE中window.ActiveXObject条件都成立
- //针对IE6、IE5.5、IE5(现在没人用了,可以把这条if分支删除)
- //两个可以用于创建XMLHttpRequest对象的控件名称,保存在一个js的数组中
- //排在前面的版本最新
- var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
- for(var i=0;i<activeName.length;i++){
- try{
- //获取一个控件名进行创建,如果创建成功就终止循环
- //如果创建失败,会抛出异常,然后就可以继续循环,继续尝试创建
- xmlHttpRequest=new ActiveXObject(activeName[i]);
- break;
- }catch(e){
- //仍然不能创建,抛出异常后,给出友好提示
- }
- }
- }
- //发送soap请求
- function sendMsg(){
- var url="http://localhost/jx-Maven-Webapp/cxf/ExportServiceImpl";//WebService请求路径
- var reuqestBody="<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\">"
- +"<soapenv:Body><q0:get> <arg0>"
- +"39cd8f20-50f8-4bc1-96d5-de6de3d7c8b4"
- +"</arg0> </q0:get></soapenv:Body></soapenv:Envelope>";
- xmlHttpRequest.open("POST",url,true);//打开链接
- xmlHttpRequest.setRequestHeader("Content-Type","text/xml;charset=utf-8");//设置请求头
- xmlHttpRequest.send(reuqestBody);//发送soap请求
- xmlHttpRequest.onreadystatechange=_back;//在onreadystatechange事件上设置回调函数
- }
- //回调函数
- function _back(){
- if(xmlHttpRequest.readyState==4){//提交完成后
- if(xmlHttpRequest.status==200){
- alert(xmlHttpRequest.responseXML);
- }else{
- alert("访问失败!");
- }
- }
- }
- </script>
- </head>
- <body>
- <form method="post">
- <div id="menubar">
- <div id="middleMenubar">
- <div id="innerMenubar">
- <div id="navMenubar">
- <ul>
- <li id="save"><a href="#" onclick="sendMsg();">查看</a></li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- <div class="textbox" id="centerTextbox">
- <div class="textbox-header">
- <div class="textbox-inner-header">
- <div class="textbox-title">
- 出口报运跟踪
- </div>
- </div>
- </div>
- <div>
- <div>
- <table class="commonTable" cellspacing="1">
- <tr>
- <td class="columnTitle_mustbe">合同或确认书号:</td>
- <td class="tableContent">${obj.customerContract }</td>
- <td class="columnTitle_mustbe">制单日期:</td>
- <td class="tableContent">
- <fmt:formatDate value="${obj.inputDate }" pattern="yyyy-MM-dd"/>
- </td>
- </tr>
- <tr>
- <td class="columnTitle_mustbe">信用证号:</td>
- <td class="tableContent">${obj.lcno }</td>
- <td class="columnTitle_mustbe">收货人及地址:</td>
- <td class="tableContent">${obj.consignee}</td>
- </tr>
- <tr>
- <td class="columnTitle_mustbe">装运港:</td>
- <td class="tableContent">${obj.shipmentPort}</td>
- <td class="columnTitle_mustbe">目的港:</td>
- <td class="tableContent">${obj.destinationPort}</td>
- </tr>
- <tr>
- <td class="columnTitle_mustbe">价格条件:</td>
- <td class="tableContent">
- ${obj.priceCondition}
- </td>
- <td class="columnTitle_mustbe">运输方式:</td>
- <td class="tableContent">
- ${obj.transportMode}
- </td>
- </tr>
- <tr>
- <td class="columnTitle_mustbe">唛头:</td>
- <td class="tableContent">${obj.marks}</td>
- <td class="columnTitle_mustbe">备注:</td>
- <td class="tableContent">${obj.remark}</td>
- </tr>
- </table>
- </div>
- </div>
- </form>
- </body>
- </html>
由上面的js代码大家可以看到,我们现在先获取XML信息将它alert出来,看看是不是能得到WebService的反馈,点击查看按钮:
得到弹窗回复:
这就证实了我们的soap的XML请求成功发送给了WebService,然后WebService也给予我们soap的XML回复。