Apache CXF =Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,如今已經正式改名爲 Apache CXF 了,如下簡稱爲 CXF。CXF 繼承了 Celtix 和 XFire 兩大開源項目的精華,提供了對 JAX-WS 全面的支持,而且提供了多種 Binding 、DataBinding、Transport 以及各類 Format 的支持,而且能夠根據實際項目的須要,採用代碼優先(Code First)或者 WSDL 優先(WSDL First)來輕鬆地實現 Web Services 的發佈和使用。Apache CXF已是一個正式的Apache頂級項目。java
Apache CXF 是一個開源的Services 框架,CXF 幫助您利用 Frontend 編程 API 來構建和開發 Services ,像 JAX-WS 。這些 Services 能夠支持多種協議,好比:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,而且能夠在多種傳輸協議上運行,好比:HTTP、JMS 或者 JBI,CXF 大大簡化了 Services 的建立,同時它繼承了 XFire 傳統,同樣能夠自然地和 Spring 進行無縫集成。web
咱們使用MyEclipse集成開發環境學習CXF。spring
圖1 依賴包
apache
首先是服務接口:編程
這裏的接口須要使用Annotation @WebService 描述,接口中的方法若是有參數,須要使用@WebParam來修飾,並使用屬性name來定義名字,否則發佈後,參數會使用默認的args0…app
package org.ygy.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface HelloWorldService { public String sayHello(); public String sayHelloWithName(@WebParam(name="name") String name); }
接下來寫一個接口的實現類:框架
package org.ygy.service.impl; import org.ygy.service.HelloWorldService; public class HelloWorldServiceImpl implements HelloWorldService { @Override public String sayHello() { System.out.println("sayHello()"); return "Hello World !"; } @Override public String sayHelloWithName(String name) { System.out.println("sayHello(" + name + ")"); return "Hello , " + name; } }
在WEB-INF文件夾下新建一個beans.xml。jsp
這是一個Spring的配置文件,首先要導入幾個cxf使用的xml文件,而後定義咱們剛纔寫好的服務。ide
注:若項目中bean被spring管理,則implemorimplemor="#HelloWorldServiceImpl"這樣拿的是spring管理的bean,不然拿到的是null學習
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxws:endpoint id="hello" implementor="org.ygy.service.impl.HelloWorldServiceImpl" address="/HelloWorldService" /> </beans>
咱們來看一下web.xml的配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/beans.xml</param-value> </context-param> <servlet> <servlet-name>HelloWorldService</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloWorldService</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
package org.ygy.test; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import org.junit.Test; import org.ygy.service.HelloWorldService; public class HelloClient { @Test public void testSayHello() throws MalformedURLException { URL wsdlURL = new URL("http://localhost:8080/CXFTest_HelloWorld/services/HelloWorldService?wsdl"); QName SERVICE_NAME = new QName("http://impl.service.ygy.org/", "HelloWorldServiceImplService"); Service service = Service.create(wsdlURL, SERVICE_NAME); HelloWorldService client = service.getPort(HelloWorldService.class); String result = client.sayHello(); System.out.println("result==>" + result); } @Test public void testSayHelloWithName() throws MalformedURLException { URL wsdlURL = new URL("http://localhost:8080/CXFTest_HelloWorld/services/HelloWorldService?wsdl"); QName SERVICE_NAME = new QName("http://impl.service.ygy.org/", "HelloWorldServiceImplService"); Service service = Service.create(wsdlURL, SERVICE_NAME); HelloWorldService client = service.getPort(HelloWorldService.class); String result = client.sayHelloWithName("路飛"); System.out.println("result-->" + result); result = client.sayHello(); System.out.println(result); } }
至此,咱們的項目結構如圖 2所示。
圖2 項目目錄結構
將項目成功部署到Tomcat後,啓動Tomcat,訪問
http://localhost:8080/CXFTest_HelloWorld/services,會看到如圖 3所示的頁面
圖3 發佈的WebService
單擊連接,能夠打開WSDL。
圖4 WSDL文件
至此,咱們的第一個WebService發佈完成。