1. 什么是CXF

Apache CXF = Celtix + Xfire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。Apache CXF 是一个开源的 web Services 框架,CXF 帮助您构建和开发 Web Services ,它支持多种协议,比如:SOAP1.1,SOAP1.2 、XML/HTTP、RESTful HTTP 或者CORBA。

RESTful:一种风格而不是一个协议。它理念是网络上的所有事物都被抽象为资源,每个资源对应一个唯一的资源标识符。

  • CXF是基于SOA总线结构,依靠spring完成模块的集成,实现SOA方式。
  • 灵活的部署:可以运行在Tomcat、Jboss、Jetty(内置)、weblogic上面。
  • CXF支持数据格式:XML,JSON(仅在REST方式下支持)。

2. 安装CXF

2.1 下载地址:http://cxf.apache.org/download.html下载

2.2 解压 apache-cxf-3.2.4.zip 到指定目录

2.3 创建系统变量CXF_HOME,变量值为解压目录,将CXF_HOME加入到Path路径下

2.4 cmd 下输入命令wsdl2java -h ,回车

3. CXF发布SOAP协议的服务

3.1 需求

服务端:发布服务,接收客户端的城市名,返回天气数据给客户端

客户端:发送城市名给服务端,接收服务端的响应信息,打印

3.2 服务端实现

第一步: 创建一个java工程

第二步: 导入cxf的jar包(%CXF_HOME%\lib目录下)。147个。

第三步: 编写SEI接口。需要在SEI接口上添加@Webservice注解。

import javax.jws.WebService;

@WebService
public interface WeatherInterface {
public String QueryWeather(String cityName);
}

第四步: 编写SEI实现类。不需要加注解。

public class WeatherInterfaceImpl implements WeatherInterface {
@Override
public String QueryWeather(String cityName) {
System.out.println("from client..." + cityName);
if ("北京".equals(cityName)) {
return "晴转多云";
} else {
return "雨转小雪";
}
}
}

第五步: 发布服务

1、创建一个JaxWsServerFactoryBean对象

2、设置SEI接口setServiceClass

3、设置SEI实现类对象。setServiceBean

4、设置服务发布地址。setAddress

5、发布服务。Create

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

public class WeatherServer {

    public static void main(String[] args) {
// JaxWsServerFactoryBean发布服务
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
// 设置服务接口
jaxWsServerFactoryBean.setServiceClass(WeatherInterface.class);
// 设置服务实现类
jaxWsServerFactoryBean.setServiceBean(new WeatherInterfaceImpl());
// 设置服务地址
jaxWsServerFactoryBean.setAddress("http://127.0.0.1:12345/weather");
// 发布
jaxWsServerFactoryBean.create();
}
}

此时直接访问使用说明书地址即可。

Tips:JaxWsServerFactoryBean实现特点:

  • JaxWsServerFactoryBean发布,设置3个参数,1.服务接口;2.服务实现类;3.服务地址;
  • Endpoint仅支持发布实现类,JaxWsServerFactoryBean支持发布接口。

CXF也能够实现基于SOAP1.2的服务端,实现方法如下

在接口上加入  @BindingType(SOAPBinding.SOAP12HTTP_BINDING)  注解,重新发布服务端即可

import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding; @WebService
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public interface WeatherInterface { public String QueryWeather(String cityName);
}

3.3 客户端实现

第一步:生成客户端代码

Wsdl2java命令是CXF提供的生成客户端的工具,他和wsimport类似,可以根据WSDL生成客户端代码

Wsdl2java常用参数:

  • d,指定输出目录
  • p,指定包名,如果不指定该参数,默认包名是WSDL的命名空间的倒序

Wsdl2java支持SOAP1.1和SOAP1.2

wsdl2java -p com.zang.cxf.weather -d . http://127.0.0.1:12345/weather?wsdl

第二步:使用说明书,使用生成代码调用服务端

JaxWsProxyFactoryBean调用服务端,设置2个参数,1.设置服务接口;2.设置服务地址

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.zang.cxf.weather.WeatherInterface; public class WeatherClient {
public static void main(String[] args) {
// JaxWsProxyFactoryBean调用服务端
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
// 设置服务接口
jaxWsProxyFactoryBean.setServiceClass(WeatherInterface.class);
// 设置服务地址
jaxWsProxyFactoryBean.setAddress("http://127.0.0.1:12345/weather");
// 获取服务接口实例
WeatherInterface weatherInterface = jaxWsProxyFactoryBean.create(WeatherInterface.class);
// 调用查询方法
String weather = weatherInterface.queryWeather("北京");
System.out.println(weather);
}
}

4. CXF拦截器

4.1 拦截器特点

  • 拦截器可以拦截请求和响应
  • 拦截器可以有多个
  • 拦截器可以根据需要自定义

4.2 拦截器的使用

获取拦截器列表,将自己的拦截器加入列表(拦截器必须加到服务端,在服务端发布之前)。

例如,在服务端添加日志拦截器,访问时打印日志

//略
//加入拦截器
jaxWsServerFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
jaxWsServerFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
// 发布
jaxWsServerFactoryBean.create();

控制台打印如下

Web Service——CXF的更多相关文章

  1. Web Service CXF的工作流程

    我们一起走进系统的内部,跟随每一个调用,去透视系统的每一个层面. 一.我们定义整个目录都在CXFServlet的监控之下 <servlet> <servlet-name>CXF ...

  2. Web Service——CXF发布REST服务

    1. 什么是REST REST,英文representational state transfer(表象性状态转变)或者表述性状态转移,REST是web服务的一种架构风格,使用HTTP.URI.XML ...

  3. Web Service——CXF+Spring 整合

    结合spring框架来实现CXF发布SOAP协议的服务,步骤基本相同,所不同的是的多了一些配置项,步骤如下 1. 服务端 第一步:创建web项目(引入jar包) 第二步:创建SEI接口 import ...

  4. Spring 4 集成Apache CXF开发JAX-RS Web Service

    什么是JAX-RS 在JSR-311规范中定义,即Java API for RESTful Web Services,一套Java API,用于开发 RESTful风格的Webservice. 工程概 ...

  5. 【转】基于CXF Java 搭建Web Service (Restful Web Service与基于SOAP的Web Service混合方案)

    转载:http://www.cnblogs.com/windwithlife/archive/2013/03/03/2942157.html 一,选择一个合适的,Web开发环境: 我选择的是Eclip ...

  6. Apache CXF实现Web Service(5)—— GZIP使用

    Apache CXF实现Web Service(5)-- GZIP使用 参考来源: CXF WebService整合Spring Apache CXF实现Web Service(1)--不借助重量级W ...

  7. Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service

    准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ...

  8. Apache CXF实现Web Service(3)——Tomcat容器和不借助Spring的普通Servlet实现JAX-RS(RESTful) web service

    起步 参照这一系列的另外一篇文章: Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 首先 ...

  9. Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service

    实现目标 http://localhost:9000/rs/roomservice 为入口, http://localhost:9000/rs/roomservice/room为房间列表, http: ...

随机推荐

  1. PHP 7.0 5.6 下安裝 phpLDAPadmin 发生错误的修正方法

    在稍具規模的網路環境中, 網管時常選用 LDAP 來進行帳號的統整管理, 一方面提供管理便利度, 另一方面使用者也不必因為不同系統而記憶不同帳號, phpLDAPadmin 是一套常見的 LDAP 管 ...

  2. Mantis邮件服务器配置

    1.在apache下的php.ini中修改(这里是以163的邮箱为例子):[mail function];For Win32 only.SMTP = smtp.163.com; //设置邮箱的发送地址 ...

  3. 在JTextField中监听回车键,并执行相应按钮

    在jbInit() 中加入jTextField1的按键监听,代码如下:    jTextField1.addKeyListener(new KeyAdapter(){       public voi ...

  4. CVPR14 图像检索papers

    CVPR14年关于图像检索方面的papers,汇总成一个list,方便阅读. 图像检索 Triangulation embedding and democratic aggregation for i ...

  5. 6 cocos2dx粒子效果,类图关系,系统原生粒子和自己定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果

     1 粒子 演示样例 2 类图关系 3 系统原生粒子 CCParticleSystem 全部粒子系统的父类 CCParticleSystemPoint. CCParticleSystemQuad ...

  6. 在Ubuntu 12.04 桌面上设置启动器(快捷方式)

    在Ubuntu 12.04 桌面上设置启动器(快捷方式)过程讲解: 如下图所示,Eclipse 和 SQLDeveloper 都可以直接双击打开,这些应用程序的启动器都在 /usr/share/app ...

  7. hdu 4107 Gangster(线段树,时间卡得很严)

    这道题目的数据卡得好厉害. 题目明显是考察线段树延迟标记的,但是因为要考虑到p的值,这种延迟是有条件的:在该节点下所有的数据对于p都应该位于p的同一侧.要么都比p大,要么都比p小. 开始的时候我用一个 ...

  8. go语言基础之指针做函数参数用地址传递

    1.指针做函数参数 示例: package main //必须有个main包 import "fmt" func swap(p1, p2 *int) { *p1, *p2 = *p ...

  9. scala 学习笔记六 推导

    1.介绍 在Scala中,推导将生成器.过滤器.和定义组合在一起. 2.例子 有一种将result用作val(而不是var)的方式,:“就地”构建result,而不是逐项构建,利用yield关键字,当 ...

  10. Android -- 打开本地图片且显示路径

    背景                                                                                          代码       ...