標籤:
其實開發服務端, 大體分為2種方式:
一: 採用jdk給我們提供的jas-ws中的服務類來發布服務
二: 採用第三方架構來開發webservice.
那麼為什麼我們要選擇第三方架構來發布一個webservice服務呢?
首先, 我們開發的項目大部分都是javase項目, jdk不能用於javaee項目的開發.
並且jdk目前僅僅支援soap1.1協議. 不支援soap1.2協議 而為了用戶端調用時能使用1.1協議, 也能使用1.2協議.
通常我們發布的服務都是1.2協議的.
下面, 就說下cxf開發服務端, 以及開發用戶端的最佳實務.
一: 利用cxf開發web服務端的最佳實務
在web.xml中配置cxfservlet共有3種方式:
1: 使用預設的設定檔
如果在配置cxfservlet的時候, 沒有指定cxf設定檔的位置. cxf預設會到WEB-INF目錄下去找一個叫cxf-servlet.xml的檔案.
不過這種方式很少很少使用...(我至今沒有發現有人採用這種方式的)
2: 配置cxfServlet的初始化參數指定設定檔(這種方式偶爾會用)
它存在2個問題: 一個是,servlet預設是在第一次訪問的時候才會進行初始化, 這個時候才會去讀取設定檔, 載入spring容器. 這就導致了第一次訪問的時候速度太慢.
不過這個問題呢, 可以通過配置load-on-startup讓cxfservlet在web容器啟動的時候就去初始化, 從而避免了第一次訪問速度太慢的問題.
第二個問題是, 我們開發常用ssh架構中, 已經在web.xml中配置了spring容器的監聽器, 又在cxfservlet中配置, 會導致載入2次.
當然, 你也可以去掉spring的載入監聽器.. 不過不建議使用.
3: 依賴spring的初始化監聽器
這個方式是最常用的. 上代碼
1 <!-- 配置spring的檔案位置 --> 2 <context-param> 3 <param-name>contextConfigLocation</param-name> 4 <param-value>classpath:applicationContext.xml</param-value> 5 </context-param> 6 7 <!-- 配置spring的容器監聽器 --> 8 <listener> 9 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 10 </listener> 11 12 <!-- 配置cxf核心servlet --> 13 <servlet> 14 <servlet-name>CXFServlet</servlet-name> 15 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 16 <load-on-startup></load-on-startup> 17 </servlet> 18 19 <servlet-mapping> 20 <servlet-name>CXFServlet</servlet-name> 21 <url-pattern>/cxf/*</url-pattern> 22 </servlet-mapping>
那麼spring的設定檔到底該如何寫呢?
在這之前, 先說下服務分類, 服務分為帶介面的服務和不帶介面的服務.
通常我們發布的服務都是帶介面的服務, 如下:
1 @WebService // 這個註解必須寫, 否則服務中沒有操作 2 @BindingType(SOAPBinding.SOAP12HTTP_BINDING)// 發布1.2soap協議 3 public interface IHiService { 4 5 String sayHi(String name); 6 } 7 8 [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 9 public class HiServiceImpl implements IHiService { 10 11 public String sayHi(String name) { 12 13 System.out.println("HiServiceImpl.sayHi()"); 14 return "hi " + name; 15 } 16 17 }
在spring設定檔中發服務,如下:
<!-- 匯入cxf需要的xml檔案 --> <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="hi" serviceClass="com.cxf.service.IHiService" serviceName="hiWS" address="/hi"> <jaxws:serviceBean> <bean class="com.cxf.service.impl.HiServiceImpl"></bean> </jaxws:serviceBean> </jaxws:server>
至此服務端開發完畢.
二:利用cxf開發web用戶端
注意這裡是web用戶端, 不是javase項目;
如果是javase項目,就 採用httpUrlConnection ,或者wsimport,或者手動構造soap請求協 等來進行開發.
如果是web項目, 最常用的發放有以下2種:
1: 利用spring的factory工廠來注入服務
2:利用cxf的標籤來注入服務
不過這2種方法之前, 都需要使用wsimport, 或者wsdl2java命令, 獲得web服務的介面.
獲得介面如下:
1 /** 2 * This class was generated by Apache CXF 2.4.0 3 * 2014-11-06T16:36:06.034+08:00 4 * Generated source version: 2.4.0 5 * 6 */ 7 8 @WebService(targetNamespace = "http://service.cxf.com/", name = "IHiService") 9 @XmlSeeAlso({}) 10 public interface IHiService { 11 12 @WebResult(name = "return", targetNamespace = "") 13 @RequestWrapper(localName = "sayHi", targetNamespace = "http://service.cxf.com/", className = "com.cxf.service.SayHi") 14 @WebMethod 15 @ResponseWrapper(localName = "sayHiResponse", targetNamespace = "http://service.cxf.com/", className = "com.cxf.service.SayHiResponse") 16 public java.lang.String sayHi( 17 @WebParam(name = "arg0", targetNamespace = "") 18 java.lang.String arg0 19 ); 20 }
然後, 再在spring的設定檔中配置:
1 <!-- 方式一:使用jaxws:client來獲得webservice服務 --> 2 <jaxws:client id="hiService" address="http://localhost:8080/cxf_javaee_0100_server/cxf/hi" serviceClass="com.cxf.service.IHiService"> 3 </jaxws:client> 4 5 6 <!-- 方式二: 使用spring的bean factory來獲得webservice服務 --> 7 <bean id="hiService2" class="com.cxf.service.IHiService" factory-bean="webServiceFactory" factory-method="create"></bean> 8 9 <bean id="webServiceFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> 10 <property name="address" value="http://localhost:8080/cxf_javaee_0100_server/cxf/hi"></property> 11 <property name="serviceClass" value="com.cxf.service.IHiService"></property> 12 </bean>
方式一和方式二相比, 明顯是方式一更加方便啊..
最後, 再啟動spring容器來獲得web服務, 然後調用服務了
1 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 2 IHiService hiService = (IHiService) context.getBean("hiService"); 3 System.out.println(hiService.sayHi("aa")); 4 5 IHiService hiService2 = (IHiService) context.getBean("hiService2"); 6 System.out.println(hiService2.sayHi("bb"));
控制台就會輸出:
hi aa
hi bb
原文地址:http://blog.csdn.net/wangfeiing/article/details/40864301
cxf開發基於web的webservice項目(轉載)