1. 程式人生 > >使用CXF編寫簡單客戶端與服務端

使用CXF編寫簡單客戶端與服務端

CXF是Apache的頂級專案,也是目前Java社群中用來實現WebService流行的一個開源框架(尤其是收編了xfire後)。基於CXF可以非常簡單地以WebService的方式來實現Java甚至是跨語言的遠端呼叫,CXF的工作原理如圖:

CXF對於WebService的伺服器端並沒做多少封裝,它仍然採用目前Java SE本身的WebService方式,只是提供了一個JaxWsServerFactoryBean類,從而可以在WebService被呼叫時增加一些 攔截器的處理。客戶端方面CXF則增加了封裝,以便能夠直接以介面的方式來呼叫遠端的WebService,簡化了呼叫WebService的複雜 性,CXF提供的類為JaxWsProxyFactoryBean,通過此類將WebService的介面類以及WebService的地址放入,即可獲取對應介面的代理類。


首先匯入:org.apache.cxf:apache-cxf:3.1.3的jar包。

服務端程式碼:

1:介面類程式碼:

package com.service;
import javax.jws.WebService;
/**
 * Created by ryh on 2015/10/9.
 */
@WebService
public interface HelloWorld {

    public String sayHello(String name);
}

注:通過註解@WebService申明為webservice介面 

關於@WebService註解說明可看以下文章:

http://blog.sina.com.cn/s/blog_551d2eea0101jwpv.html

2:介面實現類程式碼:
package com.service.impl;
import com.service.HelloWorld;
import javax.jws.WebService;
import java.util.Date;
/**
 * Created by ryh on 2015/10/9.
 */
@WebService(endpointInterface="com.service.HelloWorld",serviceName="HelloWorldWebService")
public class HelloWorldImpl implements HelloWorld {
    @Override
public String sayHello(String name) { return "Hello " + name +",it is " + new Date(); } }
3:服務端程式碼:

第一種:可用Endpoint的publish方法釋出service

package com.web;
import com.service.HelloWorld;
import com.service.impl.HelloWorldImpl;
import javax.xml.ws.Endpoint;
/**
 * Created by ryh on 2015/10/9.
 */
public class CxfTest {
    public static void main(String args[]) {
        HelloWorld helloWorld = new HelloWorldImpl();
String address = "http://localhost:8080/helloWorld";
//呼叫Endpointpublish方法釋出web service
Endpoint.publish(address, helloWorld);
System.out.println("publich success!");
}
}

第二種:使用webService客戶端代理工廠釋出Service

package com.web;
import com.service.HelloWorld;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
/**
 * Created by ryh on 2015/10/9.
 */
public class CxfTest {
    public static void main(String args[]) {
        //建立WebService客戶端代理工廠
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
//設定WebService地址
factory.setAddress("http://localhost:8080/helloWorld");
//註冊WebService介面
factory.setServiceClass(HelloWorld.class);
Server server = factory.create();
server.start();
System.out.println("publich success!");
}
}

寫完右鍵run執行顯示如圖:



在瀏覽器訪問http://localhost:8080/helloWorld?wsdl此地址並顯示如下圖:



則服務端介面釋出成功。

客戶端程式碼:

package com.web;
import com.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
 * Created by ryh on 2015/10/9.
 */
public class CxfClient {

    public static void main(String args[]) {
        //建立WebService客戶端代理工廠
JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();
//註冊WebService介面
jwpfb.setServiceClass(HelloWorld.class);
//設定WebService地址
jwpfb.setAddress("http://localhost:8080/helloWorld");
HelloWorld hw = (HelloWorld) jwpfb.create();
System.out.println(hw.sayHello("ryh"));
}
}
先執行服務端的main方法 再執行客戶端程式碼,後臺顯示如下:



客戶端呼叫服務端成功。

注:關於webservice原理 可參考以下文章:http://www.blogjava.net/freeman1984/archive/2012/12/25/393439.html