本文实现的需求如下:
有一个系统B想要从系统A中获取web service服务,系统A是我们开发的,系统B是别人开发的。那么.....
使用cxf步骤大致如下:
1、 修改类的方法发布出去,去除不向往公开的方法
2、 引入cxf-servlet.xml配置文件,主要发布对外公开的服务
http://localhost/项目名/cxf/XXXServiceImpl?wsdl SOAP
3、 调用webservice服务,ajax调用 发送soap xml,获得返回值soap xml
4、 做一个ajax调用页面,显示返回值。获取返回值后利用js innerHTML到td
-------------------------
1.在web.xml文件中配置:整合WebService CXF 。
<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>
引入cxf-servlet.xml配置文件
<!-- 1).声明发布的bean -->
<bean id="XXXService" class="cn.itcast.jk.service.impl.XXXServiceImpl">
<property name="XXXDao">
<ref bean="XXXDaoImpl"/> <!-- 有spring容器中获取bean -->
</property>
</bean>
<!-- 2).发布 实现者:webService实现类;地址:访问地址http://localhost:8080/jk0203/cxf/ -->
<jaxws:endpoint implementor="#xxxService" address="/XXXServiceImpl"/>
2.在service层,方法上面要加注解@WebService,不向外提供的方法要加@WebMethod(exclude=true),虽然sping注解 @Autowired注入了dao,但是为什么还有加上这个dao的setter方法呢?setter方法是由cxf注入,不写肯定报错。如下代码向外提供了一个findUser()方法。这个方参数不能是Map;参数调用的po,必须Implemrnts Serializble。
@Service
@WebService
public class XXXServiceImpl implements XXXService {
@Autowired //这个dao是由spring容器注入的
XXXDao XXXDao;
//cxf由spring注入bean //这个dao是由cfx容器注入
@WebMethod(exclude=true)
public void setXXXDao(XXXDao XXXDao) {
this.XXXDao = XXXDao;
}
public List<User> findUser(){
return XXXDao.find();
}
@WebMethod(exclude=true)
public void updateUser(){
XXXDao.update();
}
}
3.一切配置ok,下面启动服务输入: http://localhost:8080/jk0203/cxf。如下图(图1)说明配置成功。那么怎么去解析这个service方法请求到的数据呢?其实就是一个解析xml文件过程(你发布的方法返回的数据都封装在xml文件中,可以通过myeclipse中launch SOAP Web Service Exploert(图2)去请求连接和查看个xml格式)。图2
图1
4.js代码 想、XMLHttpRequest解析xml文件代码如下
<script type="text/javascript">
var requestXmlHttp;
$(document).ready(function(){
//创建XMLHTTP对象
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
requestXmlHttp=new XMLHttpRequest();
}else{// code for IE6, IE5
requestXmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
});
function sendMsg(){
var findId = document.getElementById("findId").value;
//http://localhost:8080/jk0203/cxf/ExportServiceImpl?wsdl
var url = "http://localhost:8080/jk0203/cxf/ExportServiceImpl"; //访问的链接地址
requestXmlHttp.open("POST", url, true); //以POST请求发生一个链接
requestXmlHttp.setRequestHeader("Content-Type","text/xml;charset:utf-8"); //设置请求头
var requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:q0=\"http://impl.service.jk.itcast.cn/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
+"<soapenv:Body><q0:get><arg0></arg0>"+findId+"</q0:get> </soapenv:Body></soapenv:Envelope>";
requestXmlHttp.onreadystatechange = _back; //回调函数
requestXmlHttp.send(requestBody); //SOAP XML请求
}
function _back(){
if(requestXmlHttp.readyState==4){ //完成
if(requestXmlHttp.status == 200){ //成功返回
var retXml = requestXmlHttp.responseXML; //返回的xml
var ret = retXml.getElementsByTagName("return")[0]; //获得retrun集合的第一个元素
var customerContract = document.getElementById("customerContract");
customerContract.innerHTML = ret.getElementsByTagName("customerContract")[0].text;
var inputDate = document.getElementById("inputDate");
inputDate.innerHTML = ret.getElementsByT8(0,10);
var consignee = document.getElementById("consignee");
consignee.innerHTML = ret.getElementsByTagName("consignee")[0].text;
var lcno = document.getElementById("lcno");
lcno.innerHTML = ret.getElementsByTagName("lcno")[0].text;
var shipmentPort = document.getElementById("shipmentPort");
shipmentPort.innerHTML = ret.getElementsByTagName("shipmentPort")[0].text;
var transportMode = document.getElementById("transportMode");
transportMode.innerHTML = ret.getElementsByTagName("transportMode")[0].text;
var priceCondition = document.getElementById("priceCondition");
priceCondition.innerHTML = ret.getElementsByTagName("priceCondition")[0].text;
var marks = document.getElementById("marks");
marks.innerHTML = ret.getElementsByTagName("marks")[0].text;
var remark = document.getElementById("remark");
remark.innerHTML = ret.getElementsByTagName("remark")[0].text;
}else{
alert("查询失败!");
}
}
}
</script>