CXF實現(xiàn)webService服務(wù)

一、背景

WebService基本概念

Web Service也叫XML Web Service,WebService是一種可以接收從Internet或者Internet上的其它系統(tǒng)中傳遞過來的請求,輕量級的獨立的通訊技術(shù)。是:通過SOAP在Web上提供的軟件服務(wù),使用WSDL文件進行說明,并通過UDDI進行注冊。

XML:(Extensible Markup Language)擴展型可標記語言。面向短期的臨時數(shù)據(jù)處理、面向萬維網(wǎng)絡(luò),是Soap的基礎(chǔ)。

Soap:(Simple Object Access Protocol)簡單對象存取協(xié)議。是XML Web Service 的通信協(xié)議。當用戶通過UDDI找到你的WSDL描述文檔后,他通過可以SOAP調(diào)用你建立的Web服務(wù)中的一個或多個操作。SOAP是XML文檔形式的調(diào)用方法的規(guī)范,它可以支持不同的底層接口,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 文件是一個 XML 文檔,用于說明一組 SOAP 消息以及如何交換這些消息。大多數(shù)情況下由軟件自動生成和使用。

UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務(wù)供應商和使用者的新項目。在用戶能夠調(diào)用Web服務(wù)之前,必須確定這個服務(wù)內(nèi)包含哪些商務(wù)方法,找到被調(diào)用的接口定義,還要在服務(wù)端來編制軟件,UDDI是一種根據(jù)描述文檔來引導系統(tǒng)查找相應服務(wù)的機制。UDDI利用SOAP消息機制(標準的XML/HTTP)來發(fā)布,編輯,瀏覽以及查找注冊信息。它采用XML格式來封裝各種不同類型的數(shù)據(jù),并且發(fā)送到注冊中心或者由注冊中心來返回需要的數(shù)據(jù)。

自己按照網(wǎng)上參考搭建了一遍CXF環(huán)境。過程中也有遇到的問題,也做了簡單的整理。
對于CXF是干什么用的,我不想多說,大家都知道這是我們在Java編程中webService技術(shù)的一種實現(xiàn)工具。我們說說為什么用CXF來實現(xiàn)webService:

  1.  Java的webService實現(xiàn)本身就是一個很耗性能的實現(xiàn)方案(xml與java對象之間在服務(wù)端以及客戶端的互轉(zhuǎn)比較消耗性能)
    
  1.  目前java主流的webService應用以CXF、AXIS2為主;
    
  2.  通過網(wǎng)絡(luò)渠道的了解,目前CXF的效率要比AXIS2高出至少50%;
    
  3.  另外有一個webService的工具metro的效率比CXF高出10%;
    
  4.  CXF的實現(xiàn)資料網(wǎng)上可以隨便找出一大堆,metro的資料相對少一些;
    
  5.  CXF在java應用實現(xiàn)中已經(jīng)很成熟,企業(yè)更傾向于用這樣一個成熟的解決方案;
    

基于以上原因,我選擇CXF來實現(xiàn)webService。

二、 以annotation注解方式實現(xiàn)發(fā)布webService應用

首先先建好Web Service工程如下:

1.png
點擊finish創(chuàng)建完成

下圖是我配置完成后的整個工程目錄,這是我們接下來的目標:

工程目錄

1、 基礎(chǔ)環(huán)境

新建java web工程cxf之后,下載cxf工具包。解壓CXF之后,把cxf工具包lib下的jar包全部放到工程的lib下。
此處用到的cxf工具包版本為:apache-cxf-3.1.12(我選擇的是3.1.12的,大家可以參考,我選擇的是最高版本的)
下載地址:http://cxf.apache.org/download.html

2、 編寫服務(wù)接口

見文件HelloWorld.java

package com.cetc50.server;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.cetc50.user.User;
@WebService
public interface HelloWorld {
    String sayHi(@WebParam(name="text")String text);
    String sayHiToUser(User user);
    String[] SayHiToUserList(List<User> userList);
}

3、 服務(wù)接口實現(xiàn)

見文件HelloWorldImpl.java

package com.cetc50.server;
import java.util.LinkedHashMap;  
import java.util.List;  
import java.util.Map;    
import javax.jws.WebParam;  
import javax.jws.WebService;
import com.cetc50.user.User;

@WebService(endpointInterface="com.cetc50.server.HelloWorld",serviceName="HelloWorld")  
public class HelloWorldImpl implements HelloWorld {  
    Map<Integer, User> users = new LinkedHashMap<Integer, User>();    
    public String sayHi(@WebParam(name = "text") String text) {  
        return "Hello,"+text;  
    }    
    public String sayHiToUser(User user) {  
        users.put(users.size()+1, user);  
        return "Hello,"+user.getName();  
    }   
    public String[] SayHiToUserList(List<User> userList) {  
        String[] result = new String[userList.size()];  
        int i = 0;  
        for(User u:userList){  
            result[i] = "Hello " + u.getName();  
            i++;  
        }  
        return result;  
    }    
} 

4、 發(fā)布服務(wù)app

見文件webServiceApp.java

package com.cetc50.server;
import javax.xml.ws.Endpoint;

public class webServiceApp {
    public static void main(String[] args) {
        System.out.println("web service start");
        HelloWorldImpl implementor= new HelloWorldImpl();
        String address="http://localhost:8080/helloWorld";
        Endpoint.publish(address, implementor);
        System.out.println("web service started");
    }
}

選中webServiceApp.java,右鍵 Run As 選擇Java Application發(fā)布服務(wù);然后在瀏覽器輸入地址:http://localhost:8080/helloWorld?wsdl
出現(xiàn)下圖說明webService服務(wù)發(fā)布成功。

webService服務(wù)發(fā)布成功。

問題來了:

剛開始按照網(wǎng)上參考步驟做了,結(jié)果在發(fā)布時出現(xiàn)如下很長一串英文錯誤:DefaultValidationEventHandler: [ERROR]: prefix wsdp is not bound to a namespace
Location: node: [wsd:Types: null]
解決辦法:經(jīng)過在網(wǎng)上查閱是因為我在引入CXF的jar包時,全加進去了,在lib中找到如下四個jar包,刪除即可。


再次選中webServiceApp.java,右鍵 Run As 選擇Java Application發(fā)布服務(wù);然后在瀏覽器輸入地址:http://localhost:8080/helloWorld?wsdl , 就會露出喜悅的表情,嘿嘿嘿!!!

5、 客戶端訪問服務(wù)

見文件HelloWorldClient.java

package com.cetc50.client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 
import com.cetc50.server.HelloWorld;  
import com.cetc50.user.User;

public class HelloWorldClient {   
    public static void main(String[] args) {            
        //首先右鍵run as 運行com.cetc50.server.webServiceApp類,然后再運行這段客戶端代碼  
        JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();  
        jwpfb.setServiceClass(HelloWorld.class);  
        jwpfb.setAddress("http://localhost:8080/helloWorld");  
        HelloWorld hw = (HelloWorld) jwpfb.create();  
        User user = new User();  
        user.setName("馬克思");  
        user.setDescription("懷念馬克思");  
        System.out.println(hw.sayHiToUser(user));            
    }   
} 

選中HelloWorldClient.java,右鍵 Run As 選擇Java Application運行,控制臺會打印如下圖:

客戶端訪問也成功啦

6、 不能忘記了User.java文件

package com.cetc50.user;
import java.io.Serializable;  

@SuppressWarnings("serial")  
public class User implements Serializable {  

    private String id;  
    private String name;  
    private String age;  
    private String description;  
  
    public User() {  
        super();  
    }  

    public String getId() {  
        return id;  
    }  

    public void setId(String id) {  
        this.id = id;  
    }  

    public String getName() {  
        return name;  
    }  

    public void setName(String name) {  
        this.name = name;  
    }  

    public String getAge() {  
        return age;  
    }  

    public void setAge(String age) {  
        this.age = age;  
    }  

    public String getDescription() {  
        return description;  
    }  

    public void setDescription(String description) {  
        this.description = description;  
    }      
}  

此篇實現(xiàn)了webService服務(wù)的發(fā)布以及在本工程下的客戶端調(diào)用服務(wù)的示例并不是很直觀,歡迎學習和指導。
本文參照了:CXF實現(xiàn)webService服務(wù)(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 一、Java基礎(chǔ) 1.寫出下面代碼的執(zhí)行結(jié)果 2.寫出下面代碼的執(zhí)行結(jié)果 3.寫出下面代碼的執(zhí)行結(jié)果 (此題需寫出...
    joshul閱讀 531評論 0 1
  • 概覽 CXF frontends 是一組編程的API,被用來開發(fā)和發(fā)布webservice。CXF支持兩種類型的f...
    JohnShen閱讀 1,328評論 2 2
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,823評論 0 11
  • 郁子的葬禮結(jié)束時,恒彥這樣問在身邊的澤田。這種提問太過愚直,而且是一個再自然不過的問題。 “我心里還在掛念著一個疑...
    九說閱讀 2,884評論 0 2
  • 真的 十年是煎熬 快樂 痛苦亦或是幸福 一切都那么清晰 男怕入錯行 女怕嫁錯男 我是真的體會到了 孩子是我最大的牽...
    ciskei閱讀 178評論 0 0