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

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

我们使用的技术是 -------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信息。

MyEclipse有一个工具,我们点击Launch SAOP Web Service Explorer,然后选择
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回复。

我们下一篇总结再来谈如何解析回复的XML信息。

转载请注明出处:http://blog.csdn.net/acmman/article/details/49070705

时间: 2024-10-01 21:48:10

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

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

我们上一次创建了出口报运的WebService的搭建,测试的时候,我们仅仅得到了WebService给我们回复的soap结构的XML对象,但是我们没有去解析.下面我们来完成soap的XML的解析,并把相应的数据通过javascript安插在table中. 我们先来分析一下之前我们saop发出的XML请求和得到的XML回复的例子 请求: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/&quo

【springmvc+mybatis项目实战】杰信商贸-1.项目背景

1.项目背景 杰信项目物流行业的项目, 杰信商贸是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.公司总部位于十一个朝代的帝王之都西安,业务遍及欧美.随着公司不断发展壮大,旧的信息系统已无法满足公司的快速发展需求,妨碍公司成长,在此背景下,公司领导决定研发<杰信商贸综合管理平台>. <杰信商贸综合管理平台>分三期完成.一期完成仓储管理(包括:采购单.仓库.货物.条形码.入库.出库.退货.盘点.库存.库存上限报警.统计查询)和展会管理(包括:展会管理.出单管理),形成货物统一数字化

【springmvc+mybatis项目实战】杰信商贸-30.出口报运增删查修mapper+Dao+Service+Controller

我们接下来做我们项目的下一个环节,就是出口报运的业务,首先我们来看看两个设计方式 a)大型项目设计方式 传统设计方式,基于对象关联,数据量小时,系统无碍:当数据随着系统的使用,线性增长,系统变的越来越慢,到达一定数据量时,性能急剧下降. b)新的设计方式:打断设计 在表中增加一个字段,这个字段用来存储关联表的主键集合:在报运业务中要查询合同下的货物信息.直接通过这个关联字段,利用in子查询直接去查询货物表,这样查询效率提高很多.而且数据量越大,查询效率越高.这种方式,业务关联层级越多,这种设计方

【springmvc+mybatis项目实战】杰信商贸-13.购销合同列表

我们接下来开始编写购销合同的列表业务 首先我们现往我们的FACTORY_C和基础表中倒入一些数据方便我们测试 导入数据的SQL文件:jk.sql (点击下载) 然后我们看到数据已经插入 启动服务器查看我们的数据已经插入 接下来我们开始做购销合同的业务.首先我们的数据库表已经建立(CONTRACT_C),我们首先创建购销合同的实体类Contract.java: package cn.hpu.jk.domain; import java.util.Date; public class Contrac

【springmvc+mybatis项目实战】杰信商贸-31.出口报运业务-购销合同查询与上报

我们上一篇完成了出口报运增删查修的mapper+Dao+Service+Controller,而且在Controller中添加和获取出口报运的列表的方法,然后成功获取了出口报运的列表: 然后我们这次要添加出口报运的"新增"方法,但是这个"新增"和以往的新增方法不同,这个要与之前的购销合同关联在一起. 我们出口报运的"新增"是这样的: 用户要选择多个合同,然后进行报运.(体现出业务关联) 报运新增时,报运专责只能看到已上报的购销合同. (操作出口报

【springmvc+mybatis项目实战】杰信商贸-33.出口报运修改+报运货物批量展现-批量修改控件2

具体批量修改的几个要点: 1)批量展示 mrecord控件(自定义) 也就是在html界面上的table表格中添加新的行,这个时候我们使用javascript来实现这种效果就行了,innerHTML 实现往一个区域div增加一段html代码,table,tr,td都用利用js动态插入.这里我们使用控件来完成. 下面我们来实现 我们来修改我们的jExportupdate.jsp,在修改出口报运信息下添加报运下货物的列表信息,并且将需要添加的货物列表添加上去,并且将动态表格的js文件和javascr

【springmvc+mybatis项目实战】杰信商贸-11.购销合同业务

生产厂家我们做完了,接下来我们要做一个更加复杂的业务,就是"货运管理" 首先我们先了解一下业务,什么是"货运管理"? "货运管理"是国际物流的概念,往常我们货物送到国内没有那么多事情,但是货物发往国外就多了很多手续,依靠小物流公司我们是很不可能的,需要行业的大背景的支撑.下面我们来看看它是怎么做的 a)业务:购销合同 当我们的客户通过展会.其它渠道跟杰信公司联系上以后,他们看上杰信的货物样品,他们会跟杰信签订一个购买合同(样式要求,货物数量),客

【springmvc+mybatis项目实战】杰信商贸-15.细粒度的权限控制+业务上报取消

上一篇总结我们完成了购销合同的增删改查业务,这一篇我们首先完成权限控制以及业务的上报取消的设置功能. 先说我们的权限控制 1.细粒度的权限控制 a)日常权限框架: 基于角色权限,用户.角色.权限(URL.主菜单.左侧菜单.按钮) b)数据权限: 纵向的数据权限过滤:对数据进行过滤 1)本人(专责):登录后只能看到自己的信息Where条件 create_by = #{当前登录者id} 2)部门(集团公司):登录后登录人是经理级别A.只能看本部门Where条件 create_dept=#{当前登录者

【springmvc+mybatis项目实战】杰信商贸-12.重点知识回顾

1.回顾重点知识 a)Oracle安装 在本机安装oracle客户端,创建一个本地服务,程序或者控制台(PL/SQL)就可以访问数据库. PL/SQL绿色版,第一次运行它自动扫描本机安装的oracle,tnsnames.ora,同时记录下配置信息.如果把绿色版换个路径,就无法连接数据库.(TNS侦听无法连接)绿色版只能在放回原来第一次访问的路径.就可以访问. Oracle相当的脆弱.蓝屏,游戏导入异常电脑自动重启,台式机突然断电.都会导致oracle你再次连接时,直接报错.一般只要重启服务即可.