CXF(使用CXF上傳服務,使用CXF當中的csdl2java.exe來解析客戶端代碼)

什麼是CXF
Apache CXF = Celtix + Xfire

CXF的優勢
(1)支持多種協議:
* SOAP1.1,1.2
* HTTP
* CORBA(Common Object Request Broker Architecture公共對象請求代理體系結構,早期語言使用的WS。C,c++,C#)
(2)並可以與Spring進行快速無縫的整合
(3)靈活的部署:可以運行有Tomcat,Jboss,Jetty(內置),IBMWS,BeaWS上面。

CXF的目錄結構
(1)bin目錄
CXF 框架中所提供的可執行工具和命令
(2)docs目錄
CXF 所有類(class)對應的 API 文檔
(3)etc目錄
包含一個基本的Service暴露所需要的web.xml文件,及其它的配置文件
(4)lib目錄
lib目錄中包含CXF及其運行時所需要的jar包
(5)licenses目錄
引用第三方jar包的相關許可協議。
(6)modules目錄
CXF框架根據不同特性分開進行編譯的二進制包文件。
發佈基於 CXF 框架的 Web 項目時,可以選擇使用該目錄下的所有 .jar 文件,也可以選擇 lib目錄中的 cxf-2.0.2-incubator.jar文件。
(7)samples目錄
示例,包含這些示例的源代碼和相關Web 應用配置文件
可以通過samples目錄和它各個子目錄下的 README.txt的文件來詳細瞭解示例的編譯與運行的步驟

使用CXF發佈服務和調用服務
1、配置環境變量
(1)JAVA_HOME
變量名:JAVA_HOME
變量值:C:\Program Files\Java\jdk1.8.0_181
cmd裏執行 java -version
能輸出對應的JDK信息

(2)CXF_HOME
變量名:CXF_HOME
變量值:E:\CXF\apache-cxf-2.4.2
將資料裏的apache-cxf-2.4.2.zip解壓出來的,放在了E盤的CXF文件夾裏

(3)Path
Path變量里加上剛新建的環境變量,指向裏面的bin目錄,如果JAVA_HOME配置過了就不需要了
;%JAVA_HOME%\bin;%CXF_HOME%\bin

(4)CLASSPATH
CLASSPATH里加上,如果前面打過.;了,就不要再打了
.;%CXF_HOME%\lib\cxf-manifest.jar;.\build\classes

使用CXF上傳服務

創建一個maven項目cxf導入以下依賴

<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>2.4.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

實體類

package com.xr.entity;

public class Users {
    private Integer id;
    private String name;

    public Users() {
    }

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

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }
}

編寫服務接口

package com.xr.server;

import com.xr.entity.Users;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import java.util.List;

@WebService
/*
* 接口上打webservice*/
public interface HelloWorld {

    public String sayHello(@WebParam(name = "name") String name);
    public void add(@WebParam(name = "users") Users users);

    public @WebResult(name = "javaList")
    List<Users> usersList();
}

實現接口

package com.xr.server.impl;

import com.xr.entity.Users;
import com.xr.server.HelloWorld;

import java.util.ArrayList;
import java.util.List;

public class HelloWorldImpl implements HelloWorld {
    private List<Users> usersList=new ArrayList<Users>();
    public String sayHello(String name) {
        return name+"Hello";
    }

    public void add(Users users) {
        usersList.add(users);
    }

    public List<Users> usersList() {
        return usersList;
    }
}

上傳測試

package com.xr;

import com.xr.server.impl.HelloWorldImpl;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

public class PublishMain {
    public static void main(String[] args) {
        //獲得發佈的工廠bin
        JaxWsServerFactoryBean jwsf=new JaxWsServerFactoryBean();
        //設置wsdl的地址
        jwsf.setAddress("http://localhost:9999/hello");
        //設置服務的類型
        jwsf.setServiceClass(HelloWorldImpl.class);
        //服務的提供者,具體的實例
        jwsf.setServiceBean(new HelloWorldImpl());
        //發佈服務
        jwsf.create();

    }
}

將地址放在瀏覽器中運行記得加上?wsdl
如果運行成功則會出現以下效果
在這裏插入圖片描述

使用CXF當中的csdl2java來生成客戶端代碼
首先在命令窗口中跳到一個空文件夾的位置
如E://wsCode文件夾
然後再寫命令

E:\wsCode>wsdl2java -d .http://localhost:9999/hello

之後就會在這個文件夾下生成相對應的文件
在這裏插入圖片描述
在原先的cxf項目當中同樣創建一個maven項目csfclient

將E盤中wsCode文件夾中的整個com複製進這個項目
在這裏插入圖片描述

然後再寫一個測試客戶最好是重新創一個包)TestClient

package com.xr.test;

import com.xr.server.HelloWorld;
import com.xr.server.Users;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import java.util.List;

public class TestClient {
    public static void main(String[] args) {
        //獲得代理的工廠類
        JaxWsProxyFactoryBean proxyFactoryBean=new JaxWsProxyFactoryBean();
        //設置服務的地址
        proxyFactoryBean.setAddress("http://localhost:9999/hello");
        //設置服務類的接口類型
        proxyFactoryBean.setServiceClass(HelloWorld.class);
        //創建服務具體的實例
       HelloWorld helloWorld= (HelloWorld) proxyFactoryBean.create();
       //調用具體的方法
        String info=helloWorld.sayHello("蔡徐坤");
        Users users=new Users();
        users.setId(1);
        users.setName("哈哈");
        helloWorld.add(users);
       List<Users> usersList= helloWorld.usersList();
        for (Users users1 : usersList) {
            System.out.println(users1.getName());
        }

    }
}

運行能輸出結果則成功,記得在運行這個時,前面的上傳服務那塊絕對不能關,不然爲什麼報錯你都不知道

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章