溫馨提示:您的每一次轉(zhuǎn)載,體現(xiàn)了我寫此文的意義!!!煩請您在轉(zhuǎn)載時注明出處http://www.aygfsteel.com/sxyx2008/謝謝合作!!!

          雪山飛鵠

          溫馨提示:您的每一次轉(zhuǎn)載,體現(xiàn)了我寫此文的意義!!!煩請您在轉(zhuǎn)載時注明出處http://www.aygfsteel.com/sxyx2008/謝謝合作!!!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            215 Posts :: 1 Stories :: 674 Comments :: 0 Trackbacks
                  最近由于項目需要,一直在學(xué)習(xí)OSGI,在學(xué)習(xí)OSGI的這段時間內(nèi),不斷的接觸到apache的一些優(yōu)秀的開源項目,比如說FelixCXF等。Felix是Apache對OSGI R4規(guī)范的一個輕量級實現(xiàn)。你使用eclipse創(chuàng)建的plugin(插件)工程都是可以正常運行在Felix中的。前提是你創(chuàng)建bundle的時候選擇標準選項這一欄。好了本篇文章主要是用來介紹CXF的,關(guān)于Felix就不再深入討論了,有興趣的可以自行去研究下。
                  關(guān)于CXF,不做過多的解釋。官方的解釋已經(jīng)夠清楚了。相信大家之前在Java環(huán)境下創(chuàng)建webservice程序大多數(shù)選擇的是xfire這個框架吧。后來好多專家不再推薦這個東東。都建議使用CXF。在未接觸到CXF之前,本人一向喜歡用xfire這個框架來創(chuàng)建自己的webservice。還了,廢話不多說,先來看個HelloWorld的程序,教大家快速上手。
                  首先去Apache網(wǎng)站下載CXF所需要的jar,我本人下載是apache-cxf-2.2.10.zip這個包。這里為了方便期間創(chuàng)建一個java工程。啊?java工程,這有點不可思議了,不是要創(chuàng)建webservice嗎?怎么是java工程?呵呵,這里就是CXF的神奇之處!
                  添加必須的jar到你的classpath路徑下。
                  cxf-2.2.10.jar 核心jar
                  jetty-6.1.21.jar 用來啟動jetty服務(wù)器
                  jetty-util-6.1.21.jar jetty輔助工具
                  wsdl4j-1.6.2.jar wsdl支持工具
                  XmlSchema-1.4.5.jar 
                  這就是CXF的最小配置,以上jar包缺一不可
                  創(chuàng)建一個接口
          package com.cxf.service;

          public interface HelloWorldCxfService {
              
              String sayHello(String username);
          }
                  創(chuàng)建該接口的實現(xiàn)類
          package com.cxf.service;

          public class HelloWorldCxfServiceImpl implements HelloWorldCxfService {

              
          public String sayHello(String username) {
                  
          return "Hello,"+username;
              }
          }
                  發(fā)布webservice
          package com.cxf.server;

          import org.apache.cxf.frontend.ServerFactoryBean;

          import com.cxf.service.HelloWorldCxfService;
          import com.cxf.service.HelloWorldCxfServiceImpl;

          public class Server {
              
              
          public static void main(String[] args){
                  HelloWorldCxfServiceImpl worldCxfServiceImpl
          =new HelloWorldCxfServiceImpl();
                  ServerFactoryBean factoryBean
          =new ServerFactoryBean();
                  factoryBean.setAddress(
          "http://localhost:8080/hello");
                  factoryBean.setServiceClass(HelloWorldCxfService.
          class);
                  factoryBean.setServiceBean(worldCxfServiceImpl);
                  factoryBean.create();
              }
          }
                  運行Server,注意不要關(guān)閉,在控制臺會打印如下信息:
          2010-9-10 9:44:16 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
          信息: Creating Service {http://service.cxf.com/}HelloWorldCxfService from class com.cxf.service.HelloWorldCxfService
          2010-9-10 9:44:16 org.apache.cxf.endpoint.ServerImpl initDestination
          信息: Setting the server's publish address to be http://localhost:8080/hello
          2010-09-10 09:44:16.296::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
          2010-09-10 09:44:16.296::INFO:  jetty-6.1.21
          2010-09-10 09:44:16.390::INFO:  Started SelectChannelConnector@localhost:8080
                  客戶端調(diào)用
          package com.cxf.server;

          import org.apache.cxf.frontend.ClientProxyFactoryBean;

          import com.cxf.service.HelloWorldCxfService;

          public class Client {
              
              
          public static void main(String[] args) {
                  ClientProxyFactoryBean factoryBean
          =new ClientProxyFactoryBean();
                  factoryBean.setAddress(
          "http://localhost:8080/hello");
                  factoryBean.setServiceClass(HelloWorldCxfService.
          class);
                  HelloWorldCxfService worldCxfService
          =(HelloWorldCxfService) factoryBean.create();
                  System.out.println(worldCxfService.sayHello(
          "張三"));
              }
          }
                  運行Client代碼,控制臺打印如下信息:
          2010-9-10 9:46:58 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
          信息: Creating Service {http://service.cxf.com/}HelloWorldCxfService from class com.cxf.service.HelloWorldCxfService
          Hello,張三
                  到此,我們的webservice,已經(jīng)成功調(diào)用了。大家是不是迫不及待的想看下wsdl文件是啥樣的呢?
          在瀏覽器中輸入http://localhost:8080/hello?wsdl,即可看到wsdl文件了。其中http://localhost:8080/hello部分為代碼里指定的Address。
                  wsdl文件信息:
            <?xml version="1.0" ?> 
          <wsdl:definitions name="HelloWorldCxfService" targetNamespace="http://service.cxf.com/" xmlns:ns1="http://schemas.xmlsoap.org/wsdl/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.cxf.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <wsdl:types>
          <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://service.cxf.com/" xmlns:tns="http://service.cxf.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            
          <xsd:element name="sayHello" type="tns:sayHello" /> 
          <xsd:complexType name="sayHello">
          <xsd:sequence>
            
          <xsd:element minOccurs="0" name="arg0" type="xsd:string" /> 
            
          </xsd:sequence>
            
          </xsd:complexType>
            
          <xsd:element name="sayHelloResponse" type="tns:sayHelloResponse" /> 
          <xsd:complexType name="sayHelloResponse">
          <xsd:sequence>
            
          <xsd:element minOccurs="0" name="return" type="xsd:string" /> 
            
          </xsd:sequence>
            
          </xsd:complexType>
            
          </xsd:schema>
            
          </wsdl:types>
          <wsdl:message name="sayHelloResponse">
            
          <wsdl:part element="tns:sayHelloResponse" name="parameters" /> 
            
          </wsdl:message>
          <wsdl:message name="sayHello">
            
          <wsdl:part element="tns:sayHello" name="parameters" /> 
            
          </wsdl:message>
          <wsdl:portType name="HelloWorldCxfServicePortType">
          <wsdl:operation name="sayHello">
            
          <wsdl:input message="tns:sayHello" name="sayHello" /> 
            
          <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse" /> 
            
          </wsdl:operation>
            
          </wsdl:portType>
          <wsdl:binding name="HelloWorldCxfServiceSoapBinding" type="tns:HelloWorldCxfServicePortType">
            
          <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
          <wsdl:operation name="sayHello">
            
          <soap:operation soapAction="" style="document" /> 
          <wsdl:input name="sayHello">
            
          <soap:body use="literal" /> 
            
          </wsdl:input>
          <wsdl:output name="sayHelloResponse">
            
          <soap:body use="literal" /> 
            
          </wsdl:output>
            
          </wsdl:operation>
            
          </wsdl:binding>
          <wsdl:service name="HelloWorldCxfService">
          <wsdl:port binding="tns:HelloWorldCxfServiceSoapBinding" name="HelloWorldCxfServicePort">
            
          <soap:address location="http://localhost:8080/hello" /> 
            
          </wsdl:port>
            
          </wsdl:service>
            
          </wsdl:definitions>
                          
          posted on 2010-09-10 09:51 雪山飛鵠 閱讀(5965) 評論(7)  編輯  收藏 所屬分類: webservice

          Feedback

          # re: Apache之CXF HelloWorld入門[未登錄] 2010-09-10 10:00 yang
          這不類似 xml-rpc 了么???  回復(fù)  更多評論
            

          # re: Apache之CXF HelloWorld入門 2010-09-10 12:57 cxh8318
          能否告知如何實現(xiàn)jar包的最小配置?是一個一個試嗎?  回復(fù)  更多評論
            

          # re: Apache之CXF HelloWorld入門 2010-09-10 13:47 @joe
          這是基于c/s的  回復(fù)  更多評論
            

          # re: Apache之CXF HelloWorld入門 2010-09-10 14:10 java小爬蟲
          沒任何技術(shù)含量,是cxf在線文檔的摘抄罷了...  回復(fù)  更多評論
            

          # re: Apache之CXF HelloWorld入門 2010-09-10 14:16 雪山飛鵠
          @java小爬蟲
          本人才學(xué)疏淺,剛開始接觸CXF。我已明確說了是CXF入門。再者,本人寫這篇博文的時候并未參考過CXF的在線文檔。  回復(fù)  更多評論
            

          # re: Apache之CXF HelloWorld入門 2010-09-10 14:21 雪山飛鵠
          @cxh8318
          關(guān)于jar包的最小配置,我一般是嘗試的。我一直不建議,將框架下的所有jar添加到工程中,這樣一來體積明顯較大,而且很容易出現(xiàn)jar包沖突。我一般是這么做的,先只添加核心jar,然后運行它。在運行過程中根據(jù)控制臺的異常信息,去添加對應(yīng)所需的jar。這樣即快又方便,還能加深印象。即使時間再長,也不會忘記它依賴那些jar。  回復(fù)  更多評論
            

          # re: Apache之CXF HelloWorld入門 2012-12-05 16:22 jungle
          有用有用,那個說“沒任何技術(shù)含量,是cxf在線文檔的摘抄”自己不分享還在那里叫叫叫,自私的要命。

          我可以運行成功。如果樓主有WEB方面的helloworld發(fā)我一份吧。要有JAR包哦~61917380@qq.com  回復(fù)  更多評論
            

          主站蜘蛛池模板: 板桥市| 临朐县| 晴隆县| 临潭县| 安化县| 大宁县| 宜阳县| 岗巴县| 积石山| 响水县| 武胜县| 丹东市| 新绛县| 涟水县| 潜江市| 宝丰县| 庆云县| 衡阳市| 临沂市| 闸北区| 济南市| 上栗县| 繁峙县| 克什克腾旗| 从化市| 呼伦贝尔市| 黎城县| 阿克苏市| 双桥区| 繁昌县| 昌吉市| 富阳市| 贺兰县| 恩平市| 泸水县| 常德市| 景洪市| 清苑县| 绥芬河市| 吉安县| 资兴市|