一、概述
1、WebService集中解决的问题
远程调用、跨平台调用、跨语言调用。-
2、在实际中的用途
- (1)同一个公司新、旧系统的整合。
- (2)不同公司的业务整合。
- (3)内容聚合:如天气预报、股票行情等的应用需要调用大量不同平台、不同语言编写的应用的方法。
3、CXF
CXF(XFire+Celtrix)
号称是SOA
框架。SOA
框架是一种面向服务的架构,是由IBM提出的,希望以“组装电脑”的方式来开发软件。主要包括两种服务:一是各种提供服务的组件(WebService
);另一种是企业服务总线(Enterprise Service Bus, ESB
),当然我们主要讲WebService
部分,即XFire
部分。
二、使用
2.1、入门
每个WebService
组件需要两个部分:接口和实现类。将CXF
的E:\API\CXF3\apache-cxf-3.1.5\bin
目录加入到环境变量PATH
中,然后在命令行使用wsdl2java
验证是否成功。
2.1.1准备
- 需要的依赖包(使用
CXF3.1.5
版本) -
Servlet
规范包:geronimo-servlet_3.0_spec-1.0.jar
注意:这个规范包在Tomcat
中也存在,但是这里我们是开发一个独立的应用,不用tomcat
。 -
Jetty Web
服务器相关包
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中未找见)
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 开发 WebService 服务器端(工程WS_Server01
)
- (1)开发一个
WebService
业务接口。该接口要用@WebService
修饰。
HelloWorld.java
package org.fkjava.cxf.ws;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(String name);
}
- (2)开发一个
WebService
的实现类,实现类需要用@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 + "您好!" + "现在的时间是: " + new Date();
}
}
- (3)发布
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();
//调用此方法发布WebService
Endpoint.publish("http://localhost:8080/myService", hw);
System.out.println("Hello World!");
}
}
- (4)验证服务是否发布成功
使用地址http://localhost:8080/myService?wsdl
访问,如果出现以下信息,则表明成功。如若不成功,有可能是端口号被占用了,可以更改端口号再试。
2.1.3使用 CXF 开发 WebService 客户端(工程WS_Client01
)
-
(1)调用
CXF
提供的wsdl2java
工具,根据WSDL
文档生成相应的java
代码,而WSDL
就是Web Service Definition Language
。任何语言实现WebService
,都需要提供WSDL
文档。
首先我们在MyEclipse
中新建一个新的java
工程WS_Client01
,然后我们使用cmd
打开DOS
窗口,进入到客户端的src
目录中,使用dir
命令发现没有代码,我们使用wsdl2java http://localhost:8080/myService?wsdl
根据服务端的WSDL
文档生成相应的java
代码。之后我们再使用dir
可以看到src
下多出一个org
目录。
在工程WS_Client01
中我们也可以发现多出来几个包:
注意:这里我们在执行命令的时候服务端要开启。 (2)找到
wsdl2java
所生成类中,一个继承了Service
的类,即HelloWorldWs
类。该类的实例可当成工厂来使用。(3)调用
Service
子类的实例的getXxxPort()
无参方法,返回远程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("张三"));
}
}
说明:这个程序中使用的HelloWorldWs.java
和HelloWorld.java
与服务端的类不是一样的,这两个类都是客户端(本工程)的类。这里的HelloWorldWs.java
可以当作工厂来使用。然后我们就可以调用服务端的相关方法了。运行如果打印出张三您好!现在的时间是: Fri Jun 24 21:25:20 CST 2016
则表明成功。