http://blog.csdn.net/cuihuaming198809/article/details/8243361
一、CXF介紹
Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire。CXF 繼承了 Celtix 和 XFire 兩大開源項目的精華,提供了對 JAX-WS 全面的支持,並且提供了多種 Binding 、DataBinding、Transport 以及各種 Format 的支持,並且可以根據實際項目的需要,採用代碼優先(Code First)或者 WSDL 優先(WSDL First)來輕鬆地實現 Web Services 的發佈和使用。Apache CXF已經是一個正式的Apache頂級項目。CXF支持多種協議,如:SOAP、XML/HTTP、RESTful HTTP 、 CORBA ,並且可以在多種傳輸協議上運行,比如:HTTP、JMS 、 JBI。CXF可以與Spring進行無縫集成。
CXF 框架是一種基於 Servlet 技術的 SOA 應用開發框架,要正常運行基於 CXF 應用框架開發的企業應用,除了 CXF 框架本身之外,還需要 JDK 和 Servlet 容器的支持。
CXF 下載地址:http://cxf.apache.org/download.html,選擇“File”列中的zip格式下載。解壓後可以看到一些文件夾:
└─apache-cxf-2.5.0├─bin 各種工具
├─docs API文檔
├─etc 各種配置文件
├─lib 開發所需jar包
├─licenses 說明
├─modules jar包
└─samples 使用例子
samples文件夾中給提供了在各種環境下使用的例子,個人感覺只需參照樣例即可。
二、使用CXF+Spring編寫併發布WebService
首先,新建一個Web項目,名字叫cxftest,將下載的壓縮包中lib文件夾下的jar包全部拷貝到項目的WEB-INF/lib中,在web.xml中配置如下:
- <servlet>
- <servlet-name>CXFServlet</servlet-name>
- <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>CXFServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- package com.test;
- import javax.jws.WebService;
- @WebService
- public interface TestService {
- public String sayHi(String name);
- }
接着,在創建TestServiceImpl.java,代碼如下:
- package com.test;
- import javax.jws.WebService;
- @WebService(endpointInterface="com.test.TestService")
- public class TestServiceImpl implements TestService {
- public String sayHi(String name) {
- return name+", welcome to here!";
- }
- }
@WebService:聲明webservice接口;
@WebService(endpointInterface="com.test.TestService"):聲明這個類是TestService接口的實現類。
其次,在WEB-INF下新建cxf-servlet.xml文件,代碼如下:
- <?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:server id="testService" serviceClass="com.test.TestService" address="/testService">
- <jaxws:serviceBean>
- <bean class="com.test.TestServiceImpl" />
- </jaxws:serviceBean>
- </jaxws:server>
- </beans>
然後,在web.xml中配置啓動時加載cxf-servlet.xml,並配置Spring的監聽器,代碼如下:
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/cxf-servlet.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
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">
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/cxf-servlet.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <servlet>
- <servlet-name>CXFServlet</servlet-name>
- <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>CXFServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- </web-app>
三、測試發佈的WebService,生成客戶端代碼調用WebService
在瀏覽器中輸入http://localhost:8080/cxftest/services/testService/sayHi?arg0=andy,返回內容正常,調用成功!這裏要注意一點,在瀏覽器中測試接口時,參數名一定要和WSDL文檔中的參數名一致,否則會出錯。
生成客戶端代碼,這裏使用CXF自帶的wsdl2java.bat工具生成客戶端代碼:wsdl2java.bat在bin文件夾中,在cmd窗口中進入到wsdl2java.bat所在目錄下,
使用如下命令生成客戶端代碼:wsdl2java -d src -all http://localhost:8080/cxftest/services/testService?wsdl
-d:表示將轉化後的代碼放到哪裏,如果不帶此參數,則默認放到wsdl2java.bat所在目錄下;
-all:以什麼樣的方式生成客戶端代碼,還有其他可選參數,這裏不加闡述了,可以直接使用wsdl2java名來查看其他參數。
生成的客戶端文件:ObjectFactory.java、package-info.java、SayHi.java、SayHiResponse.java、TestService.java、TestServiceImpl.java、
TestServiceService.java、TestService_TestServicePort_Client.java、TestService_TestServicePort_Server.java
TestService_TestServicePort_Client.java和TestService_TestServicePort_Server.java可以不要,前者是調用接口的例子,後者是發佈接口的例子。
新建一個InvokeService.java,代碼如下:
- import com.test.TestService;
- import com.test.TestServiceService;
- public class InvokeService {
- public static void main(String[] args) {
- TestService s = new TestServiceService().getTestServicePort();
- System.out.println(s.sayHi("andy"));
- }
- }