<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-126  評論-247  文章-5  trackbacks-0

    WebService 是一套標準,而不是一種具體的技術。不同的平臺,不同的語言,大都提供了對 WebService 的開發實現。

    在 JAVA 領域里,WebService 的框架有不少,常用的就有 AXIS,XFire , CXF 等 .

    Apache CXF 是一個開源的 Services 框架 , 它 的前身是 Apache CeltiXfire , 繼承自 Celtix 和 XFire 兩大開源項目 ,
     
    CXF 實現了 JAX-WS (Java API  For XML-WebService) API,對 JAX-WS 提供了全面的支持 , 而且可以和 Spring 進行無縫集成。

    CXF 支持多種標準 : 

        支持 JAX-WS 、 JAX-WSA 、JSR-181 和 SAAJ;

        支持 SOAP 1.1 、1.2 、WS-I BasicProfile 、WS-Security 、WS-Addressing 、WS-RM 和 WS-Policy;

        支持 WSDL ( Web Services Description Language ) 1.1 、2.0;

        支持 MTOM;

    為幫助理解,下面引用一段摘自網絡的文字內容 :

    "  什么是 WebServices

        從表面上看,Webservice 就是一個應用程序,它向外界暴露出一個能夠通過 Web 進行調用的 API 。也就是說,可以利用編程的方法通過 Web 來調用這個應用程序。

        對 Webservice 更精確的解釋 : Webservice 是建立可互操作的分布式應用程序的新平臺。Webservice 平臺是一套標準,它定義了應用程序如何在 Web 上實現互操作性。

        你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫 Webservice ,只要我們可以通過 Webservice 標準對這些服務進行查詢和訪問。

        不管你的 Webservice 是用什么工具,什么語言寫出來的,只要你用 SOAP 協議通過 HTTP 來調用它,總體結構都一致。通常,你用你自己喜歡的語言(如VB 6或者VB.NET)

        來構建你的 Webservice,然后用 SOAP Toolkit 或者 .NET 的內建支持來把它暴露給 Web 客戶。于是,任何語言,任何平臺上的客戶都可以閱讀其WSDL文檔,

        以調用這個 Webservice。客戶根據 WSDL 描述文檔,會生成一個 SOAP 請求消息。Webservice 都是放在 Web 服務器 (如IIS) 后面的,客戶生成的 SOAP 請求

        會被嵌入在一個 HTTP POST 請求中,發送到 Web 服務器來。Web 服務器再把這些請求轉發給 Webservice 請求處理器。請求處理器的作用在于,解析收到的 SOAP 請求,

        調用 Webservice,然后再生成相應的 SOAP 應答。Web 服務器得到 SOAP 應答后,會再通過 HTTP 應答的方式把它送回到客戶端。   "

    環境 :

     
    JDK   1.6
    eclipse   3.6
    CXF   2.5.3
    spring   3.0
     

    編寫 HelloWorld :

    下載 Apache CXF :   http://cxf.apache.org/download.html

    導入 CXF 所需的 jar 包 : 
        commons-logging-1.1.1.jar
        cxf-2.5.3.jar
        geronimo-activation_1.1_spec-1.1.jar
        geronimo-annotation_1.0_spec-1.1.1.jar
        geronimo-javamail_1.4_spec-1.7.1.jar
        geronimo-jaxws_2.2_spec-1.1.jar
        geronimo-jms_1.1_spec-1.1.1.jar
        geronimo-servlet_2.5_spec-1.1.2.jar
        geronimo-stax-api_1.0_spec-1.0.1.jar
        geronimo-ws-metadata_2.0_spec-1.1.3.jar
        jaxb-api-2.2.3.jar
        jaxb-impl-2.2.4-1.jar
        neethi-3.0.2.jar
        saaj-api-1.3.4.jar
        saaj-impl-1.3.12.jar
        wsdl4j-1.6.2.jar
        wss4j-1.6.5.jar
        xml-resolver-1.2.jar
        xmlschema-core-2.0.2.jar

    也可以將 CXF lib 下的 jar 包全部導入,以及導入 spring 所需 jar 包 .

    服務器端 ( web project,項目名 : ws ) ---

    1 . 編寫 HelloWorld 接口,并將其標注成 WebService 的標準 java 接口

     
    package com.fancy.service;

    import javax.jws.WebService;

    @WebService
    public interface HelloWorld {

        
    public String sayHi(String message);

    }
     

     
    2 . 編寫 HelloWorld 的實現類

     
    package com.fancy.service.impl;

    import javax.jws.WebService;
    import com.fancy.service.HelloWorld;

    @WebService(endpointInterface 
    = "com.fancy.service.HelloWorld")
    public class HelloWorldImpl implements HelloWorld {

        
    public String sayHi(String message) {
            
            
    return "Hi " + message + " !";
            
        }

    }
     


    applicationContext.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:p
    ="http://www.springframework.org/schema/p"
          xmlns:tx
    ="http://www.springframework.org/schema/tx"
          xmlns:aop
    ="http://www.springframework.org/schema/aop"
          xmlns:jaxws
    ="http://cxf.apache.org/jaxws"
          xmlns:cxf
    ="http://cxf.apache.org/core"
          xsi:schemaLocation
    ="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
          http://cxf.apache.org/jaxws    
          http://cxf.apache.org/schemas/jaxws.xsd"
    >
        
        
    <!-- 配置請參考官網: http://cxf.apache.org/docs/jax-rs-and-jax-ws.html -->
        
    <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="helloWorld" class="com.fancy.service.impl.HelloWorldImpl" />
           
        
    <!-- JAX-WS -->
        
    <!-- implementor 指定 WebService 實現類, address 指定訪問地址 -->
        
    <jaxws:endpoint implementor="#helloWorld" address="/helloworld" publish="true" />
            
    </beans>
     

    以上配置中的 cxf.xml,cxf-extension-soap.xml,cxf-servlet.xml 實際上是放在 cxf-2.5.3.jar 里面的 META-INF 文件夾的 cxf 目錄下,由于我們已經導入了這個 jar 包,

    所以在這里,我們只需要這樣配置就行,其他的就可以不用管了,至于更多的詳細信息,請參考幫助文檔 :  http://cxf.apache.org/docs/jax-rs-and-jax-ws.html



    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/applicationContext.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>
      
    </servlet>
      
    <servlet-mapping>
        
    <servlet-name>CXFServlet</servlet-name>
        
    <url-pattern>/webservice/*</url-pattern>
      
    </servlet-mapping>
        
      
    <welcome-file-list>
        
    <welcome-file>index.jsp</welcome-file>
      
    </welcome-file-list>
      
    </web-app>
     


    OK,到此服務器端已經開發完成,部署運行,打開你最熟悉的瀏覽器,訪問 :   http://localhost:8080/ws/webservice/helloworld?wsdl

    如果能查看到 WSDL 文件的內容信息如下,說明服務器端已經沒問題了 :



    客戶端 ( web project,項目名 : ws_client ) ---

    如果你對 CXF 或 Axis 比較熟悉的話,可以使用 wsdl2java 命令來根據 wsdl 文件直接生成客戶端的 java 代碼,其中,CXF 的 WSDL to Java 的命令參數

    請自行參考官網文檔  :   https://cwiki.apache.org/CXF20DOC/wsdl-to-java.html      順便說一下,使用 CXF 的 wsdl2java 命令需要配置一下環境變量,

    下面采用手工方式編寫客戶端測試代碼 :

    1 . 首先需要創建一個與服務器端相同的 HelloWorld 接口,這是服務端給我們暴露的服務,客戶端的這個 HelloWorld 接口代碼的編寫需與服務端的一致 .

     
    package com.fancy.service.client;

    import javax.jws.WebService;

    @WebService
    public interface HelloWorld {

        
    public String sayHi(String message);
    }
     


    2 . applicationContext.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:p
    ="http://www.springframework.org/schema/p"
          xmlns:tx
    ="http://www.springframework.org/schema/tx"
          xmlns:aop
    ="http://www.springframework.org/schema/aop"
          xmlns:jaxws
    ="http://cxf.apache.org/jaxws"
          xmlns:cxf
    ="http://cxf.apache.org/core"
          xsi:schemaLocation
    ="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
          http://cxf.apache.org/jaxws    
          http://cxf.apache.org/schemas/jaxws.xsd"
    >
        
        
    <bean id="wsclient" class="com.fancy.service.client.HelloWorld" factory-bean="wsclientFactory" factory-method="create" />   
               
        
    <bean id="wsclientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">   
            
    <property name="serviceClass" value="com.fancy.service.client.HelloWorld" />   
            
    <property name="address" value="http://192.168.1.113:8080/ws/webservice/helloworld" />       
        
    </bean>
            
    </beans>
     

    Tips : 這里配置的 <property name="address" value="http://192.168.1.113:8080/ws/webservice/helloworld" />,其中 address 的屬性值 value 要與服務器端
                applicationContext.xml 配置中的 <jaxws:endpoint implementor="#helloWorld" address="/helloworld" publish="true" /> 的 address 對應起來。

    3 . Junit 測試

     
    package junit.test;

    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import com.fancy.service.client.HelloWorld;
    /**
     * -----------------------------------------
     * @描述  客戶端測試
     * @作者  fancy
     * @郵箱  fancydeepin@yeah.net
     * @日期  2012-10-4 <p>
     * -----------------------------------------
     
    */
    public class ClientTestApp {

        
    private static ApplicationContext context = null;
        
        @BeforeClass
        
    public static void setUpBeforeClass() throws Exception {
            
            context 
    = new ClassPathXmlApplicationContext("applicationContext.xml");

        }

        @AfterClass
        
    public static void tearDownAfterClass() throws Exception {
            
            context 
    = null;

        }
        
        @Test
        
    public void clientTest(){
            
            HelloWorld helloworld 
    = (HelloWorld)context.getBean("wsclient");
            String message 
    = helloworld.sayHi("fancy");
            System.out.println(message);
            
        }

    }
     

    測試的時候,必須保證服務器是開著的,后臺打印輸出結果 : 

    Hi fancy !




      
    posted on 2012-10-04 16:13 fancydeepin 閱讀(6847) 評論(4)  編輯  收藏

    評論:
    # re: CXF + Spring 開發 Webservices 2012-10-08 18:20 | muzibobo
    我感覺有個小bug,在客戶端的applicationContext.xml配置文件中
    <bean id="wsclientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
    <property name="serviceClass" value="com.fancy.service.client.HelloWorld" />
    <property name="address" value="http://localhost:8080/ws/webservice/helloworld" />
    </bean>
    address的value值應該改為你的服務器項目的ip地址,不能是localhost  回復  更多評論
      
    # re: CXF + Spring 開發 Webservices 2012-10-11 15:50 | fancydeepin
    回復 @muzibobo

    感謝你的來訪和評論 ;
    是這樣的,由于本人在寫測試的時候,服務器端和客戶端都是在本人的機子上,
    故而才將以上的配置寫成了 localhost,但在文章中忘了提這點,很感謝你細心的發現,現已在文章中追加說明,之前文章若是對其他讀者也造成困擾,本人在這里表示抱歉。  回復  更多評論
      
    # re: CXF + Spring 開發 Webservices 2014-02-11 22:41 | 暗示
    客戶端代碼的包名應該與服務端一致。  回復  更多評論
      
    # re: CXF + Spring 開發 Webservices[未登錄] 2016-05-29 22:26 | abc
    講得很好,難得有一篇中文教程比英文教程更加清楚明了的。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国内精品99亚洲免费高清| 一级毛片在线免费观看| 麻豆最新国产剧情AV原创免费| 久久久久亚洲AV无码专区首| 中文字幕无线码免费人妻| 伊人久久综在合线亚洲91| 国产成人无码精品久久久免费 | 精品国产污污免费网站| 国产亚洲精品无码专区| 亚洲精品黄色视频在线观看免费资源| 亚洲高清免费视频| 久99久无码精品视频免费播放| 久久久青草青青国产亚洲免观 | 亚洲中文字幕无码久久2020| 97在线观免费视频观看| 亚洲精品精华液一区二区| 国产一级淫片a免费播放口之 | 亚洲18在线天美| 美女被免费视频网站a国产| 美女视频黄a视频全免费网站色| 亚洲国产天堂久久综合| 中国国语毛片免费观看视频| 激情内射亚洲一区二区三区| 久久精品无码一区二区三区免费 | 亚洲色在线无码国产精品不卡| 日韩人妻无码免费视频一区二区三区 | 18女人水真多免费高清毛片| 亚洲五月综合缴情婷婷| 国产免费人视频在线观看免费| 一级毛片免费在线| 精品亚洲国产成AV人片传媒| 天天操夜夜操免费视频| 一区二区三区免费视频观看| 亚洲AV无码一区二区三区DV| 毛片视频免费观看| 国产精品免费久久久久影院| 亚洲成年人电影网站| 免费一区二区视频| 久久精品人成免费| 久久精品国产亚洲av天美18 | 久久精品国产亚洲AV高清热|