zoukankan      html  css  js  c++  java
  • Web Service——CXF

    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支持数据格式:XMLJSON(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();

    控制台打印如下

  • 相关阅读:
    Linux curl命令详解
    php技能树---大神的进阶之路
    PHP Socket 编程之9个主要函数的使用之测试案例
    史上最全的PHP正则表达式
    php 简单使用redis 队列示例
    PHP中使用 Memcached 的测试案例
    机动车驾驶(1)--- 禁令标志汇总 by John
    闵可夫斯基和(Mincowsky sum)
    二维平面上判断点是否在三角形内
    计算任意多边形的面积
  • 原文地址:https://www.cnblogs.com/zjfjava/p/9017391.html
Copyright © 2011-2022 走看看