apche CXF簡單應用

本文實現的需求如下:

有一個系統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 innerHTMLtd


-------------------------

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> 	





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章