作用:两个异构系统,需要共享数据。
需求:我们要给客户提供合同追踪。在出口报运中增加一个WebService,用户可以通过它的系统来访问这个服务,展现出口报运单,主要可以浏览用户的订单状态(走到哪个流程),查看出口报运单。
开发步骤:将现有的Service改造成WebService
1) 将CXF整合到项目中,加入jar包。依赖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>
2) 改造现有的Service变成即支持Service原有的业务,还支持WebService,其中Export要实现Serializable接口
3) 配置cxf.xml核心配置文件
<!-- 声明WebService Bean,发布WebService -->
<bean id="exportService" class="com.zsj.javaweb.jk.service.impl.ExportServiceImpl">
</bean>
<!-- http://localhost:9080/cxf/ExportServiceImpl -->
<jaxws:endpoint implementor="#exportService" address="/ExportServiceImpl"/>
<!-- 配置Mapper映射文件扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zsj.javaweb.jk.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
其中配置Mapper映射文件扫描器是为了使用spring的mapper,如上图中的exportMapper
4) 发布WebService方法供客户的系统进行调用web.xml
<!-- 3.整合CXF WebService -->
<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.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/cxf/*</url-pattern>
</servlet-mapping>
5) 模拟用户调用ajax;soap 发送xml;接收xml
使用Eclipse自带的WebService浏览器可以模拟soap 发送xml、接收xml
<script type="text/javascript">
/*
开发步骤:
1、创建xmlHttpRquest对象
2、open('POST', url, true)链接
3、设置请求头
4、send(xml)
5、回调函数,接受响应xml
6、从返回xml中抓取相关字段的信息
*/
var xmlHttpRequest;
if (window.ActiveXObject){
xmlHttpRequest = new ActiveXObject("Microsoft.XMLHttp");//创建XMLHTTP对象,IE11不支持
}
else if(window.XMLHttpRequest){
xmlHttpRequest = new XMLHttpRequest();
}
//发送消息
function sendMsg(){
var id = document.getElementById("id").value;//用户输入的条件
var url = "http://localhost:8080/jk/cxf/ExportServiceImpl";//webService访问链接
var requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:q0=\"http://impl.service.jk.javaweb.zsj.com/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
+ "<soapenv:Body><q0:get><arg0>" + id + "</arg0></q0:get></soapenv:Body></soapenv:Envelope>";
xmlHttpRequest.open("POST", url, true);//打开链接
xmlHttpRequest.setRequestHeader("Content-Type","text/xml;charset=utf-8"); //设置请求头
xmlHttpRequest.send(requestBody);//发起soap请求
xmlHttpRequest.onreadystatechange = _back;//在onreadystatechange事件绑定回调函数
}
//回调函数
function _back(){
//alert("sss");
if(xmlHttpRequest.readyState == 4){//提交完成
if(xmlHttpRequest.status == 200){//调用成功
//var parser = new DOMParser();
var retXml = xmlHttpRequest.responseXML;
//var retXml = parser.parseFromString(xmlHttpRequest.responseText, 'text/xml');
var ret = retXml.getElementsByTagName("return")[0];
if(ret != null){
var customerContract = ret.getElementsByTagName("customerContract")[0].firstChild.nodeValue;
alert(customerContract);
document.getElementById("customerContract").innerHTML = customerContract;
.......
}
else{
alert("没有查询到数据");
}
}
else{
// 无法正确访问出口报运服务!
}
}
}
</script>