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頂級項目。html
Apache CXF 是一個開源的Services 框架,CXF 幫助您利用 Frontend 編程 API 來構建和開發 Services ,像 JAX-WS 。這些 Services 能夠支持多種協議,好比:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,而且能夠在多種傳輸協議上運行,好比:HTTP、JMS 或者 JBI,CXF 大大簡化了 Services 的建立,同時它繼承了 XFire 傳統,同樣能夠自然地和 Spring 進行無縫集成。java
咱們使用MyEclipse集成開發環境學習CXF。web
首先是服務接口:spring
這裏的接口須要使用Annotation @WebService 描述,接口中的方法若是有參數,須要使用@WebParam來修飾,並使用屬性name來定義名字,否則發佈後,參數會使用默認的args0…apache
[java] view plaincopyprint?編程
package ws; 服務器
import javax.jws.WebService; app
import ws.medo.User; 框架
@WebService frontend
public interface HelloWorld {
public User sayHello(String name,User user);
}
package ws; import javax.jws.WebService; import ws.medo.User; @WebService public interface HelloWorld { public User sayHello(String name,User user); }
接下來寫一個接口的實現類:
[java] view plaincopyprint?
package ws.impl;
import javax.jws.WebService;
import ws.HelloWorld;
import ws.medo.Cat;
import ws.medo.User;
@WebService (endpointInterface = "ws.HelloWorld",serviceName="HelloGT")
public class HelloWorldImpl implements HelloWorld{
@Override
public User sayHello(String name, User user) {
System.out.println(user.getName());
user.getList().add(new Cat("1"));
user.getList().add(new Cat("2"));
return user;
}
}
package ws.impl; import javax.jws.WebService; import ws.HelloWorld; import ws.medo.Cat; import ws.medo.User; @WebService(endpointInterface = "ws.HelloWorld",serviceName="HelloGT") public class HelloWorldImpl implements HelloWorld{ @Override public User sayHello(String name, User user) { System.out.println(user.getName()); user.getList().add(new Cat("1")); user.getList().add(new Cat("2")); return user; } }
在WEB-INF文件夾下新建一個beans.xml。
這是一個Spring的配置文件,首先要導入幾個cxf使用的xml文件,而後定義咱們剛纔寫好的服務。
[html] view plaincopyprint?
<?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" />
<bean id="service1" class="ws.impl.HelloWorldImpl"></bean>
<jaxws:endpoint id="hello" implementor="#service1" address="/HelloWorldService" />
</beans>
<?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" /> <bean id="service1" class="ws.impl.HelloWorldImpl"></bean> <jaxws:endpoint id="hello" implementor="#service1" address="/HelloWorldService" /> </beans>
咱們來看一下web.xml的配置
[html] view plaincopyprint?
<?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>
<?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>
將項目成功部署到Tomcat後,啓動Tomcat,訪問
http://localhost:8080/Cxf_webService/services,會看到如圖 3所示的頁面
ok 服務器端就打工告成了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
1,首先建立客戶端項目,而後同上導入jar包,無需spring的
2,獲取服務服務接口類(相似於C/C++中的.h頭文件)
1) 安裝cxf,設置環境變量,如:D:/Apache/apache-cxf-2.2.4;同時,PATH後加上「;%CXF_HOME%/bin」(可選)。wsdl2java的用法以下:
wsdl2java –p 包名 –d 目錄名 wsdl路徑
如:wsdl2java –p demo.service.client –d e:/src htt://localhost:8080/helloWorld?wsdl
-p 指定其wsdl的命名空間,也就是要生成代碼的包名
-d 指定要產生代碼所在目錄
-client 生成客戶端測試web service的代碼
-server 生成服務器啓動web service的代碼
-impl 生成web service的實現代碼
-ant 生成build.xml文件
-compile 生成代碼後編譯
-quient 靜默模式,不輸出警告與錯誤信息
-all 生成全部開始端點代碼:types,service proxy,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
2) 執行wsdl2java批處理程序,如:
wsdl2java -p cxf.test -d d:/src -server http://localhost:8080/CXFTomcat/services/ HelloWorld?wsdl
3) 將java接口類導入項目。
上一步生成的java類文件不少,通常的應用中只要將說明接口的那個類文件導入項目便可,如上例生成的HelloWorld.java文件。
注意:有些版本拷貝後,類中的super()會出錯,要加上-frontend jaxws21
本實例的//wsdl2java -frontend jaxws21 –p gt.client –d e:\myeclipse\Cxf_Client\src http://localhost:8080/Cxf_webService/services/HelloWorldService?wsdl
拷貝完畢後以下圖:
3,調用類
[java] view plaincopyprint?
import gt.client.HelloGT;
import gt.client.HelloWorld;
import gt.client.User;
public class ClientStartMain {
//wsdl2java -frontend jaxws21 –p gt.client –d e:\myeclipse\Cxf_Client\src http://localhost:8080/Cxf_webService/services/HelloWorldService?wsdl
public static void main(String[] args)
{
HelloGT gt=new HelloGT();
HelloWorld hello=gt.getHelloWorldImplPort();
User user=new User();
user.setName("123");
//System.out.println(hello.sayHello("1",user));
System.out.println(hello.sayHello("1",user).getList().size()+":"+hello.sayHello("1",user).getList().get(0).getName());
}
}
import gt.client.HelloGT; import gt.client.HelloWorld; import gt.client.User; public class ClientStartMain { //wsdl2java -frontend jaxws21 –p gt.client –d e:\myeclipse\Cxf_Client\src http://localhost:8080/Cxf_webService/services/HelloWorldService?wsdl public static void main(String[] args) { HelloGT gt=new HelloGT(); HelloWorld hello=gt.getHelloWorldImplPort(); User user=new User(); user.setName("123"); //System.out.println(hello.sayHello("1",user)); System.out.println(hello.sayHello("1",user).getList().size()+":"+hello.sayHello("1",user).getList().get(0).getName()); } }
打印內容以下:
2013-2-23 13:03:35 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
信息: Creating Service {http://impl.ws/}HelloGT from WSDL: http://localhost:8080/Cxf_webService/services/HelloWorldService?wsdl
2:1
ok 客戶端也ok了