使用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
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 { @Override3:服務端程式碼:public String sayHello(String name) { return "Hello " + name +",it is " + new Date(); } }
第一種:可用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"; //呼叫Endpoint的publish方法釋出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