一、概述
1、WebService集中解決的問(wèn)題
遠(yuǎn)程調(diào)用、跨平臺(tái)調(diào)用、跨語(yǔ)言調(diào)用。-
2、在實(shí)際中的用途
- (1)同一個(gè)公司新、舊系統(tǒng)的整合。
- (2)不同公司的業(yè)務(wù)整合。
- (3)內(nèi)容聚合:如天氣預(yù)報(bào)、股票行情等的應(yīng)用需要調(diào)用大量不同平臺(tái)、不同語(yǔ)言編寫(xiě)的應(yīng)用的方法。
3、CXF
CXF(XFire+Celtrix)號(hào)稱是SOA框架。SOA框架是一種面向服務(wù)的架構(gòu),是由IBM提出的,希望以“組裝電腦”的方式來(lái)開(kāi)發(fā)軟件。主要包括兩種服務(wù):一是各種提供服務(wù)的組件(WebService);另一種是企業(yè)服務(wù)總線(Enterprise Service Bus, ESB),當(dāng)然我們主要講WebService部分,即XFire部分。
二、使用
2.1、入門(mén)
每個(gè)WebService組件需要兩個(gè)部分:接口和實(shí)現(xiàn)類。將CXF的E:\API\CXF3\apache-cxf-3.1.5\bin目錄加入到環(huán)境變量PATH中,然后在命令行使用wsdl2java驗(yàn)證是否成功。
2.1.1準(zhǔn)備
- 需要的依賴包(使用
CXF3.1.5版本) -
Servlet規(guī)范包:geronimo-servlet_3.0_spec-1.0.jar
注意:這個(gè)規(guī)范包在Tomcat中也存在,但是這里我們是開(kāi)發(fā)一個(gè)獨(dú)立的應(yīng)用,不用tomcat。 -
Jetty Web服務(wù)器相關(guān)包
jetty-continuation-9.2.11.v20150529.jar
jetty-http-9.2.11.v20150529.jar
jetty-io-9.2.11.v20150529.jar
jetty-security-9.2.11.v20150529.jar
jetty-server-9.2.11.v20150529.jar
jetty-util-9.2.11.v20150529.jar
- 其他包:
asm-5.0.4.jar
commons-logging-1.2.jar(在此版本CXF中未找見(jiàn))
neethi-3.0.3.jar
wsdl4j-1.6.3.jar
xmlschema-core-2.2.1.jar
核心包:cxf-core-3.1.5.jar
2.1.2 使用 CXF 開(kāi)發(fā) WebService 服務(wù)器端(工程WS_Server01)
- (1)開(kāi)發(fā)一個(gè)
WebService業(yè)務(wù)接口。該接口要用@WebService修飾。
HelloWorld.java
package org.fkjava.cxf.ws;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(String name);
}
- (2)開(kāi)發(fā)一個(gè)
WebService的實(shí)現(xiàn)類,實(shí)現(xiàn)類需要用@WebService修飾。
HelloWorldWs.java
package org.fkjava.cxf.ws.impl;
import java.util.Date;
import javax.jws.WebService;
import org.fkjava.cxf.ws.HelloWorld;
@WebService(endpointInterface = "org.fkjava.cxf.ws.HelloWorld", serviceName = "HelloWorldWs")
public class HelloWorldWs implements HelloWorld {
@Override
public String sayHi(String name) {
return name + "您好!" + "現(xiàn)在的時(shí)間是: " + new Date();
}
}
- (3)發(fā)布
WebService
MyService.java
package org.fkjava.cxf.ws.service;
import javax.xml.ws.Endpoint;
import org.fkjava.cxf.ws.HelloWorld;
import org.fkjava.cxf.ws.impl.HelloWorldWs;
public class MyService {
public static void main(String[] args) {
HelloWorld hw = new HelloWorldWs();
//調(diào)用此方法發(fā)布WebService
Endpoint.publish("http://localhost:8080/myService", hw);
System.out.println("Hello World!");
}
}
- (4)驗(yàn)證服務(wù)是否發(fā)布成功
使用地址http://localhost:8080/myService?wsdl訪問(wèn),如果出現(xiàn)以下信息,則表明成功。如若不成功,有可能是端口號(hào)被占用了,可以更改端口號(hào)再試。
1
2.1.3使用 CXF 開(kāi)發(fā) WebService 客戶端(工程WS_Client01)
-
(1)調(diào)用
CXF提供的wsdl2java工具,根據(jù)WSDL文檔生成相應(yīng)的java代碼,而WSDL就是Web Service Definition Language。任何語(yǔ)言實(shí)現(xiàn)WebService,都需要提供WSDL文檔。
首先我們?cè)?code>MyEclipse中新建一個(gè)新的java工程WS_Client01,然后我們使用cmd打開(kāi)DOS窗口,進(jìn)入到客戶端的src目錄中,使用dir命令發(fā)現(xiàn)沒(méi)有代碼,我們使用wsdl2java http://localhost:8080/myService?wsdl根據(jù)服務(wù)端的WSDL文檔生成相應(yīng)的java代碼。之后我們?cè)偈褂?code>dir可以看到src下多出一個(gè)org目錄。
2
在工程WS_Client01中我們也可以發(fā)現(xiàn)多出來(lái)幾個(gè)包:
2
注意:這里我們?cè)趫?zhí)行命令的時(shí)候服務(wù)端要開(kāi)啟。 (2)找到
wsdl2java所生成類中,一個(gè)繼承了Service的類,即HelloWorldWs類。該類的實(shí)例可當(dāng)成工廠來(lái)使用。(3)調(diào)用
Service子類的實(shí)例的getXxxPort()無(wú)參方法,返回遠(yuǎn)程WebService的代理。
MyClient.java
package org.fkjava.cxf.ws.client;
import org.fkjava.cxf.ws.HelloWorld;
import org.fkjava.cxf.ws.impl.HelloWorldWs;
public class MyClient {
public static void main(String[] args) {
HelloWorldWs factory = new HelloWorldWs();
HelloWorld hw = factory.getHelloWorldWsPort();
System.out.println(hw.sayHi("張三"));
}
}
說(shuō)明:這個(gè)程序中使用的HelloWorldWs.java和HelloWorld.java與服務(wù)端的類不是一樣的,這兩個(gè)類都是客戶端(本工程)的類。這里的HelloWorldWs.java可以當(dāng)作工廠來(lái)使用。然后我們就可以調(diào)用服務(wù)端的相關(guān)方法了。運(yùn)行如果打印出張三您好!現(xiàn)在的時(shí)間是: Fri Jun 24 21:25:20 CST 2016則表明成功。


