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> 	





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