WebService

原创 2018年04月16日 02:22:42

WebService

webservice概述

web Services是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换的数据。Web Services更多是一种标准,而不是一种具体的技术,不同的平台、语言大都提供Web Services的开发实现

cxf概叙

Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成

功能特性

CXF 包含了大量的功能特性,但是主要集中在以下几个方面:
1. 支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。
2. Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。
3. 容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。
4. 支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。

cxf目录结构

  • bin(目录)
  • bin 目录中是 CXF 框架中所提供的代码生成、校验、管理控制台工具:
  • Java to WSDL : java2wsdl
  • CXF Management Console Tool : mc
  • WSDL to Java : wsdl2java
  • WSDL to Service : wsdl2service
  • WSDL to SOAP : wsdl2soap
  • WSDL to XML : wsdl2xml
  • WSDL Validation : wsdlvalidator
  • XSD to WSDL : xsd2wsdl
  • docs(目录) CXF 所有类(class)对应的 API 文档,为开发者使用 CXF 完成应用开发提供应有的帮助。
  • etc(目录) 包含一个基本的 Service 暴露所需要的 web.xml 文件,及其它的配置文件。
  • lib(目录) lib 目录中包含 CXF 及其运行时所需要的和可选的第三方支持类包(.jar 文件),可以根据不同项目所需的 CXF 特性选择所需要的支持类包。如果不想一一去区分的话,可以直接在 Web 项目中包含所有的 CXF 及其运行时所需要的第三方支持类包(.jar 文件)即可。其中 cxf-2.0.2-incubator.jar 是 CXF 框架的二进制包文件,包含了全部的模块(modules),cxf-manifest-incubator.jar 是列表清单文件 manifest jar 。
    以下的 jar 包是所有 CXF 项目所必需的:
    • cxf.jar
    • commons-logging.jar
    • geronimo-activation.jar (Or the Sun equivalent)
    • geronimo-annotation.jar (Or the Sun equivalent)
    • geronimo-javamail.jar (Or the Sun equivalent)
    • neethi.jar
    • jaxb-api.jar
    • jaxb-impl.jar
    • stax-api.jar
    • XmlSchema.jar
    • wstx-asl.jar
    • xml-resolver.jar
      对于 Java2WSDL 和 WSDL2Java,除了必需的之外,还需要再增加如下 jar 包:
    • jaxb-xjc.jar
    • veliocity.jar
    • velocity-dep.jar
      为了支持 JAX-WS ,除了必需的之外,还需要再增加如下 jar 包:
    • jaxws-api.jar
    • saaj-api.jar
    • saaj-impl.jar
    • asm.jar (可选的,但是可以提升包装类型的性能)
      为了支持 XML 配置,除了必需的之外,还需要再增加如下 jar 包:
    • aopalliance.jar
    • spring-beans.jar
    • spring-context.jar
    • spring-core.jar
    • spring.web.jar
      为了独立的 HTTP 服务支持,除了必需的之外,还需要再增加如下 jar 包:
    • geronimo-servlet.jar
    • jetty.jar
    • jetty-sslengine.jar
    • jetty-util.jar
    • sl4j.jar & sl4j-jdk14.jar (可选的,但是可以提升日志 logging)
      为了支持 Aegis ,除了必需的之外,还需要再增加如下 jar 包:
    • jaxen.jar
    • jdom.jar
    • stax-utils.jar
      为了支持 WS-Security ,除了必需的之外,还需要再增加如下 jar 包:
    • bcprov-jdk14.jar
    • wss4j.jar
    • xalan.jar
    • xmlsec.jar
      为了支持 HTTP Binding ,除了必需的之外,还需要再增加如下 jar 包:
    • jra.jar
    • jettison.jar (仅为 JSON 服务所需的)
    • licenses(目录)
      列表了引用第三方 jar 包的相关许可协议。
  • modules(目录) modules 目录中包含了 CXF 框架根据不同特性分开进行编译的二进制包文件。发布基于 CXF 框架的 Web 项目时,可以选择使用该目录下的所有 .jar 文件,也可以选择 lib 目录中的 cxf-2.0.2-incubator.jar 文件。
  • samples(目录) samples 目录中包含了所有随 CXF 二进制包发布的示例,包含这些示例的源代码和相关 Web 应用配置文件,可以方便地用 Ant 来编译运行测试这些示例,来了解 CXF 的开发和使用的方法。可以通过 samples 目录和它各个子目录下的 README.txt 的文件来详细了解示例的编译与运行的步骤。
  • DISCLAIMER 由于仍是处于 Apache 孵化状态的项目,这里描述了一些说明。
  • LICENSE 文件中包含了 CXF 框架的授权协议 Apache License Version 2.0 。
  • NOTICE 罗列了 CXF 框架用到的相关第三方组件的授权协议以其它的相关信息。
  • README 文件中包含了 CXF 框架本身的一些简要说明。
  • release_notes.txt 包含了 CXF 发布时的一些信息,包括运行时所需要的环境,修复 BUG 的列表等。

cxf和servlet

CXF 是一种基于 Servlet 技术的 SOA 应用开发框架,需要 Servlet 容器的支持。CXF 支持在多种 Servlet 容器中运行,包括 WebSphere、WebLogic、Tomcat、Jetty 等
想要对要对CXF有个初步的认识,体验一下利用 CXF 进行发布与使用 Web Services,可以去看一samples\java_first_pojo的这个例子,很简单的将pojo发布成WebService,并展示了在客户端调用

cxf应用开发

添加依赖

  1. 将cxf解压目录下的lib文件夹下的jar包复制到项目中
  2. 接口类创建

    “`
    package ws.cxf;
    import javax.jws.WebService;
    @WebService
    public interface ISurveyService
    {
    /**

    • @param username 名字
    • @param point 分数
    • @return
      */
      public String vote(String username,int point);
      }

3. 实现类

    ```
    package ws.cxf.impl;
import javax.jws.WebService;
import ws.cxf.ISurveyService;
@WebService
public class SurveyService implements ISurveyService
{
    private String excludeName = "Michael";
    private int leastPonit = 5;
    public String vote(String username,int point)
    {
        String result = "";
        if(excludeName.equals(username))
        {
            result = " 您不能重复进行投票!";
        }
        else
        {
            result = " 谢谢您的投票!";
            if(point < leastPonit)
            {
                result += " 您的投票分数太低!";
            }
            else
            {
                result += " 您的投票分数通过审核!";
            }
        }
        return result;
    }
    // For IoC
    public String getExcludeName()
    {
        return excludeName;
    }
    public void setExcludeName(String excludeName)
    {
        this.excludeName = excludeName;
    }
    public int getLeastPonit()
    {
        return leastPonit;
    }
    public void setLeastPonit(int leastPonit)
    {
        this.leastPonit = leastPonit;
    }
}
    ```

4. spring配置
    在 src 目录中创建 beanRefServer.xml 文件,用来定义 SpringBean 的配置,CXF 支持 Spring 2.0 Schema 标签配置方式,并且提供快捷暴露 Web Services 的标签。

    ```
    <!--首先,我们需要引入 SpringCXF 的命名空间(namespace-->
    <beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://cxf.apache.org/jaxws 
        http://cxf.apache.org/schemas/jaxws.xsd">
        <!--需要引入我们所需要的 CXF 的 Bean 定义文件-->
            <!-- Import Apache CXF Bean Definition -->
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    <!--定义我们具体实现的 Bean ,这个 Bean 的定义与 Spring 普通的 Bean 定义一样-->
   <!-- SurveyService -->
    <bean id="surveyService" class="ws.cxf.impl.SurveyService">
        <property name="excludeName" value="Michael"/>
        <property name="leastPonit" value="10"/>
    </bean>
    <!--最后,将定义的 Bean 暴露出去成为 Web Service 服务,通过 CXF 提供的 Schema 标签配置 <jaxws:server> ,这样定义的配置显得更加简洁与方便-->
    <!--serviceClass 的值是我们的接口类的名称,address 为将要暴露出去的 Web Service 访问地址-->
    <!-- Expose SurveyWebService -->
    <jaxws:server id="surveyWebService" 
        serviceClass="ws.cxf.ISurveyService" 
        address="/SurveyWebService">
        <jaxws:serviceBean>
            <ref bean="surveyService"/> <!-- 要暴露的 bean 的引用 -->
            </jaxws:serviceBean>
    </jaxws:server>
    ```

5. 配置web.xml

    ```
        <!-- Spring Config Location -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/beanRefServer.xml</param-value>
    </context-param>
    <!-- Spring ContextLoaderListener -->
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
        <!-- Apache CXFServlet -->
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <display-name>CXF Servlet</display-name>
        <servlet-class>
            org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- CXFServlet Mapping -->
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

消费服务

开始编写消费服务相关的代码,首先通过 Spring 与 CXF 的配置来定义 Web Service 的客户端 Bean,在 src 目录下创建 beanRefClient.xml 配置文件,同样,我们也需要引入 Spring 与 CXF 命名空间的声明,并引入 CXF 的 Bean 的定义文件,最后通过与服务端配置相对的 CXF 标签 来定义客户端访问服务的声明,完整的定义内容如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- Import Apache CXF Bean Definition -->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<!-- SurveyWebService Client -->
<jaxws:client id="surveyServiceClient"
serviceClass="ws.cxf.ISurveyService"
address="http://localhost:8888/CXF_Spring_Survey/SurveyWebService"/>
</beans>

代码

package ws.cxf.client;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import ws.cxf.ISurveyService;

public class SurveyServiceClient
{
    public static void main(String[] args)
    {
        // 加载客户端的配置定义
        ApplicationContext context = new 
                ClassPathXmlApplicationContext("beanRefClient.xml");
        // 获取定义的 Web Service Bean
        ISurveyService surveyService = 
            (ISurveyService)context.getBean("surveyServiceClient");
        // 1、定义调查投票的变量与内容,用来发送给服务
        String username = "Test";
        int point = 88;
        // 调用方法进行服务消费
        String result = surveyService.vote(username,point);
        System.out.println("Result:" + result);
        // 2、传递不一样的调查投票内容
        username = "Michael";
        point = 100;
        // 再次调用方法进行服务消费,得到不一样的结果
        result = surveyService.vote(username,point);
        System.out.println("Result:" + result);
        // 3、第三次传递与调用
        username = "Jordan";
        point = 9;
        result = surveyService.vote(username,point);
        System.out.println("Result:" + result);
    }
}
收藏助手
不良信息举报
您举报文章:WebService
举报原因:
原因补充:

(最多只允许输入30个字)