這篇隨筆內容是CXF發布webService服務以及客戶端調用的方法
CXF是什么?
開發工作之前需要下載CXF和安裝
安裝過程:
<1>下載解壓到一個目錄(不能有中文,特殊字符)
<2>配置環境變量(我使用的是2.6.15版本,針對不同的版本配置環境變量)
CXF_HOME=D:\DevIDE\Java\apache-cxf-2.6.15
path=%CXF_HOME%/bin;
<3>測試是否安裝成功?
CXF安裝好了,就可以進行webService的開發工作,不管用什么技術,盡量可以先參考官方文檔
在cxf解壓目錄中有samples目錄,都是參考例子
我們可以通過java工程來發布一個webService服務,也可以通過web工程發布一個webService服務,下面分別寫一個Demo
通過java工程發布一個webService
1、創建一個java工程
2、導入jar包
將目錄中的jar都引入到工程即可。(注意一個目錄和一個which_jar不要拷貝進去)
3、寫webservice接口類
1 package com.esb.ws.server; 2 3 import javax.jws.WebService; 4 5 @WebService 6 public interface MobileAddress { 7 public String getAddressByMobile(String mobile); 8 }
4、寫一個sei,服務接口實現類
1 package com.esb.ws.server; 2 3 public class MobileAddressImpl implements MobileAddress { 4 5 @Override 6 public String getAddressByMobile(String mobile) { 7 return "電話號碼"+mobile+"屬於上海電信"; 8 } 9 }
5、發布服務
1 package com.esb.ws.server; 2 3 import org.apache.cxf.jaxws.JaxWsServerFactoryBean; 4 5 public class CXFServer { 6 public static void main(String[] args) { 7 //三步走 8 //1、實例化一個jaxws服務工廠 9 JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean(); 10 11 //設置三個屬性 12 //2.1設置SEI接口的class 13 sf.setServiceClass(MobileAddress.class); 14 //2.2設置SEI的實現者 15 sf.setServiceBean(new MobileAddressImpl()); 16 //2.3服務地址 17 sf.setAddress("http://127.0.0.1:8888/mobileService"); 18 19 //3創建並發布 20 sf.create(); 21 22 System.out.println("通過CXF創建服務成功!"); 23 } 24 }
測試的話可以通過訪問http://127.0.0.1:8888/mobileService?wsdl
客戶端程序開發
<1>生成樁,本地代理接口類(在dos窗口通過wsdl2java命令,具體的命令網上找)
將生成的類復制到工程中
2、編寫客戶端調用webservice服務
1 package com.esb.ws.client; 2 3 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 4 5 import com.esb.ws.server.MobileAddress; 6 7 public class CXFClient { 8 public static void main(String[] args) { 9 //三部走 10 //1、本地代理工廠實例 11 JaxWsProxyFactoryBean pf = new JaxWsProxyFactoryBean(); 12 13 //2、設置webservice服務端的地址,加上wsdl也可以 14 pf.setAddress("http://127.0.0.1:8888/mobileService"); 15 16 //3、創建的到本地代理類(樁) 17 MobileAddress address = pf.create(MobileAddress.class); 18 19 String result = address.getAddressByMobile("181xxxx7433"); 20 21 System.out.println(result); 22 } 23 }
打印結果:
通過web發布webService
Web服務發布webService,是將webservice服務和普通的web服務一起啟動,也就是說使用tomcat啟動webservice服務,而不是通過main方法。這里介紹的是CXF與Spring整合,使用web容器啟動,然后spring容器起來,spring容器管理者webservice服務類
官方Demo,參考sample目錄下的java_first_spring_support
webService服務端開發:
<1>新建web工程
<2>導入jar包
Spring的核心包+CXF相關和依賴
在CXF安裝包解壓目錄下的lib目錄下的jar包全部導入即可,需要注意的是:如果你的項目用的新版本,那么這里的spring的包就別拷貝了
<3>接口類,並在接口類加上注解
1 package com.esb.ws.server; 2 3 import javax.jws.WebMethod; 4 import javax.jws.WebParam; 5 import javax.jws.WebResult; 6 import javax.jws.WebService; 7 import javax.xml.ws.BindingType; 8 9 @WebService(name="MobileAddress" 10 ,serviceName="MobileAddressService" 11 ,portName="MobileAddressPort" 12 ,targetNamespace="http://ws.esb.com/" 13 ) 14 @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) 15 public interface MobileAddress { 16 17 @WebMethod(operationName="getAddressbyMobileNo") 18 public @WebResult(name="address")String getAddressByMobile(@WebParam(name="mobileNo")String mobile); 19 }
<4>接口實現類
1 package com.esb.ws.server; 2 3 public class MobileAddressImpl implements MobileAddress { 4 5 @Override 6 public String getAddressByMobile(String mobile) { 7 return "電話號碼"+mobile+"屬於上海電信"; 8 } 9 10 }
<5>配置web.xml文件,目的就是為了web容器啟動時,初始化CXF服務,是web服務發布webService的連接點。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>WebService_CXF_Web</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app>
<6>配置CXF服務端的配置文件
分析源代碼可以得出默認情況下,加載/WEB-INF/cxf-servlet.xml
配置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" xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd "> <!-- jaxws:server代表org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean,服務實例工廠 等價於JaxWsServiceFactoryBean jf = new JaxWsServiceFactoryBean(); address:寫服務的相對路徑 serviceClass:sei接口類 jaxws:serviceBean:sei的實現類 --> <jaxws:server address="/mobile" serviceClass="com.esb.ws.server.MobileAddress"> <jaxws:serviceBean> <ref bean="mobileAddress"/> </jaxws:serviceBean> </jaxws:server> <bean id="mobileAddress" class="com.esb.ws.server.MobileAddressImpl"></bean> </beans>
<7>發布服務,啟動tomcat
測試OK?
瀏覽器訪問 http://localhost:8080/WebService_CXF_Web/ws/mobile?wsdl(自己發布的地址)
開發客戶端調用webService
<1>生成樁,獲取接口代理類
拷貝生成的類到客戶端工程
2、配置客戶端的bean
配置文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 4 xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://cxf.apache.org/bindings/soap 8 http://cxf.apache.org/schemas/configuration/soap.xsd 9 http://cxf.apache.org/jaxws 10 http://cxf.apache.org/schemas/jaxws.xsd 11 http://cxf.apache.org/jaxrs 12 http://cxf.apache.org/schemas/jaxrs.xsd 13 "> 14 <jaxws:client id="mobileAddress" address="http://localhost:8080/WebService_CXF_Web/ws/mobile" serviceClass="com.esb.ws.stub.MobileAddress"> 15 16 </jaxws:client> 17 </beans>
<3>客戶端調用webService
1 package com.esb.ws.client; 2 3 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 4 import org.junit.Test; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 import com.esb.ws.stub.MobileAddress; 9 10 public class WebServiceCXFClient { 11 @Test 12 public void wsCXFTest(){ 13 ApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml"); 14 MobileAddress mobileAddress = (MobileAddress)context.getBean("mobileAddress"); 15 String result = mobileAddress.getAddressbyMobileNo("181xxxx7433"); 16 17 System.out.println(result); 18 } 19 20 }
當然也可以使用和前面一樣的方法(不使用spring獲取服務接口代理類)調用webService
package com.esb.ws.client; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.esb.ws.stub.MobileAddress; public class WebServiceCXFClient { @Test public void wdCXFTest2(){ JaxWsProxyFactoryBean ps = new JaxWsProxyFactoryBean(); ps.setAddress("http://localhost:8080/WebService_CXF_Web/ws/mobile"); ps.setServiceClass(MobileAddress.class); MobileAddress mobileAddress = (MobileAddress)ps.create(); String result = mobileAddress.getAddressbyMobileNo("181xxxx7433"); System.out.println(result); } }
簡單的Demo就是這些了。
jax-ws也可以開發webService,為什么使用CXF
jax-ws的優點,就是jdk自帶的,速度較快,但是開發麻煩,比如一些日志功能,web集成功能,以及與spring集成稍微麻煩
CXF可以解決,整合日志攔截器、天生和spring是整合的、還整合了其他一些功能。
作為一個java小白,寫寫隨筆,整理下知識點,積累下知識點。