apche CXF简单应用

来源:互联网 发布:php.ini在哪 编辑:程序博客网 时间:2024/06/06 00:56

本文实现的需求如下:

有一个系统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@WebServicepublic 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?wsdlvar 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;//返回的xmlvar 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> 





0 0