【WebService】使用CXF开发服务端与客户端

前言

        基于现阶段的Demo项目整理的CXF开发服务端与客户端的基本步骤与解析。java

WebService

WebService是什么

1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)web

2. 抽象的说,是一个跨语言、跨平台的规范spring

3. 实际的说,是多个跨平台、跨语言的应用间通讯整合的方案apache

以各个网站显示天气预报功能为例: 服务器

         气象中心的管理系统将收集的天气信息并将数据暴露出来(经过WebService Server), 而各大站点的应用就去调用它们获得天气信息并以不一样的样式去展现(WebService Client)。网站提供了天气预报的服务,但其实它们什么也没有作,只是简单了调用了一下气象中心服务器上的一个服务接口而已。框架

4. WebService的优势:可以解决跨平台,跨语言,以及远程调用之间的问题。frontend

5. WebService的应用场合ssh

      a. 同一家公司的新旧应用之间maven

      b. 不一样公司的应用之间,例如电商和物流之间的应用相互调用ide

      c.一些提供数据的内容聚合应用:天气预报、股票行情

WebService预备知识

几个重要术语

1.WSDL(web service definition language)

webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个惟一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程。

2.SOAP(simple object access protocal)

一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据,在webservice中分为请求消息和响应消息。

3.SEI(WebService EndPoint Interface)

webService服务器端用来处理请求的接口

4.CXF(Celtix + XFire)

一个apache的用于开发webservice服务器端和客户端的框架

WebService开发

组成:一、服务端开发

           二、客户端开发

使用CXF开发WebService服务器端口

首先说明开发步骤,而后详细解析。

开发步骤:

  1. 新建maven项目,jre使用1.7(这里用此Demo项目说明)
  2. 添加cxf依赖包(本项目中已添加,在下面列出)
  3. 根据规范,新建接口类,(本项目中是PersonService)
  4. 新建实现类(本项目中是PersonServiceImpl)
  5. 新建主类(本项目已经整合进SSH中)
  6. 调用接口地址: 以?wsdl结尾

解析(对应开发步骤):

  1. 以前已经说明,再也不叙述
  2. 在pom.xml中引入依赖以下:
<dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-core</artifactId>
        <version>3.1.5</version>
    </dependency>
     
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.1.5</version>
    </dependency>
     
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>3.1.5</version>
    </dependency>
  1. .PersonService中的注解解析

@WebService 此注解用来标明此java类定义了personWebService的接口

  1. PersonServiceImpl的注解解析

@Service 注解表示会被spring管理,自动注册到spring容器中

@WebService(endpointInterface ="cn.yangjieyu.service.PersonService")

endpointInterface属性是指服务接口全路径, 指定作SEI(Service EndPoint Interface)服务端点接口

@Component("personServiceImpl")

表示这个类是一个组件,会被spring管理

  1. 本项目中没有主类,是将WebService与SSH整合,添加了cxf-servlet.xml配置文件

Jaxws:endpoint标签订义了提供服务者,address属性表示具体的接口路径。

jaxws:inInterceptors和jaxws:outInterceptors指系统日志的入拦截器和出拦截器。

  1. 右击项目,Run as ->Run on Server 即启动项目,

访问地址:http://localhost:8080/ssh2/webservice/,能够看到Available SOAP services.

能够点击上图中对应的WSDL访问具体WebService接口。 效果以下:

下面是Demo主类,不在本项目中

发布WebService的Demo主类以下:

package com.fzhiy.webservice;

import com.fzhiy.webservice.impl.HelloWorldImpl;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import org.apache.cxf.interceptor.LoggingInInterceptor;

import org.apache.cxf.interceptor.LoggingOutInterceptor;

public class Server {

              public static void main(String[] args) {

                            System.out.println("web service start");

                            HelloWorld implementor = new HelloWorldImpl();

                            String address = "http://localhost:8082/helloWorld";

//                        Endpoint.publish(address, implementor); // JDK实现

                            JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();

                            factoryBean.setAddress(address); // 设置暴露地址

                            factoryBean.setServiceClass(HelloWorld.class); // 接口类

                            factoryBean.setServiceBean(implementor); // 设置实现类

                            // 添加请求消息拦截器

                            factoryBean.getInInterceptors().add(new LoggingInInterceptor());

                            // 添加响应消息拦截器

                            factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());

                            factoryBean.create();

                            System.out.println("web service started");

              }

}

使用CXF开发WebService客户端

这里简述开发步骤:

  1. 新建Maven项目做为模拟客户端
  2. 根据cxf提供的wsdl2java工具请求wsdl接口url生成代码(前提:cxf已经配置好了Path)
  3. 在dos窗口进入客户端项目路径,使用命令wsdl2java http://localhost:8080/ssh2/webservice/personWebService?wsdl

      随后在项目中生成了相应代码

      4.编写主类,运行