1、CXF是什么
cxf是一个开源框架,实现webservice开发,它支持多种协议,比如:SOAP1.1,1,2、XML/HTTP、RESTful HTTP 或者 CORBA。
cxf开发的webservice可以通过tomcat运行,cxf开发的webservice服务接口可以和javaweb应用程序部署在一块儿,共同使用一个端口80。
cxf基于SOA面向服务架构理念。依赖spring进行各各cxf模块整合。
2、CXF的下载和安装
2.1 下载
从官网下载最新的CXF的版本http://cxf.apache.org/download.html
2.2 安装
由于需要使用到bin目录下的文件,需要配置下面的环境变量。
JAVA_HOME,
CXF_HOME=cxf的目录
Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;
CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar
3、需求
开发一个用户管理的WebService服务端,对外提供用户的增删改查操作。
4、服务端的开发 (利用CXF开发,是在接口上加上@WebService注解)
4.1.1 新建一个Java项目,名称叫UserCXFWebService
将CXF中的jar包全部导入
4.1.2 传输的实体类要实现Serializable接口
public class User implements Serializable {
private int id;
private String name;
private int age;
//setter getter
}
4.2 关于服务接口的定义如下
//targetNamespace:指定命名空间
//name:portType的名称
//portName:port的名称
//serviceName:服务名称
//作为发布WebService的类
@WebService(targetNamespace = "http://user.namager.cn", name = "IUserServiceSoap", portName = "IUserServicePort", serviceName = "IUserService")
public interface IUserService {
// 增加用户
public void add(@WebParam(name = "user") User user);
// 删除用户
public void delete(@WebParam(name = "user") User user);
// 查询用户
public User findById(@WebParam(name = "id") int id);
}
4.3 关于接口的实现类
public class UserServiceImpl implements IUserService {
// 持有IUserDao的引用,便于操作数据库
private IUserDao userDao = new UserDaoImpl();
public IUserDao getUserDao() {
return userDao;
}
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
@Override
public void add(User user) {
userDao.add(user);
}
@Override
public void delete(User user) {
userDao.delete(user);
}
@Override
public User findById(int id) {
return userDao.findById(id);
}
}
4.3 利用CXF发布WebService的代码如下
public class PublicTest {
public static void main(String[] args) {
// 利用cxf的工厂bean发布webservice服务
// 通过spring配置方式发布服务,实现了下面的代码
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
// 设置webservice服务
jaxWsServerFactoryBean.setAddress("http://localhost:8888/usermanager");
// 设置SEI(接口类型)
jaxWsServerFactoryBean.setServiceClass(IUserService.class);
// 设置服务提供者即service对象
jaxWsServerFactoryBean.setServiceBean(new UserServiceImpl());
// 发布服务
jaxWsServerFactoryBean.create();
}
}
5、客户端的开发
5.1 新建Java项目,名称为UserCXFClient
将CXF中的jar包全部导入
5.2 利用CXF中bin目录下的wsdl2java命令,生成客户端的调用代码
5.3 编写客户端的调用代码
1、第一种调用方法 CXF的调用
public class ClientTest1 {
public static void main(String[] args) {
// 通过JaxWsProxyFactoryBean实现客户端调用
JaxWsProxyFactoryBean wsProxyFactoryBean = new JaxWsProxyFactoryBean();
// 设置调用的webService的地址
wsProxyFactoryBean.setAddress("http://localhost:8888/usermanager?wsdl");
// 设置SEI(接口类型portType)
wsProxyFactoryBean.setServiceClass(IUserServiceSoap.class);
// 创建客户端调用对象(也是portType,与上面的接口是一致的)
IUserServiceSoap port = wsProxyFactoryBean
.create(IUserServiceSoap.class);
// 调用webservice发布的方法
User user = port.findById(1);
System.out.println(user);
}
}
2、第二个调用方法 原始的调用方法
public class ClientTest2 {
public static void main(String[] args) throws MalformedURLException {
// wsdl地址
URL wsdlDocumentLocation = new URL(
"http://localhost:8888/usermanager?wsdl");
// 名称空间,serviceName
QName serviceName = new QName("http://user.namager.cn", "IUserService");
// 通过手动指定wsdl地址和服务名称来创建服务视图
Service service = Service.create(wsdlDocumentLocation, serviceName);
// portType的class来创建接口,然后调用服务方法
IUserServiceSoap port = service.getPort(IUserServiceSoap.class);
// 通过服务来调用方法
User user = port.findById(1);
System.out.println(user);
}
}
6、利用CXF实现WebService代码的下载