本文實現的需求如下:
有一個系統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>