zoukankan      html  css  js  c++  java
  • 【CXF】基于CXF Web Service:Apache CXF简单部署

     CXF旨在为服务创建必要的基础设施,它的整体架构主要由以下几个部分组成:

    1.Bus

    它是C XF架构的主干,为共享资源提供了一个可配置的场所,作用非常类似于S p r i n g的ApplicationContext。这些共享资源包括WSDL管理器、绑定工厂等。通过对Bus进行扩展,可以方便地容纳自己的资源,或替换现有的资源。默认Bus实现是基于Spring的,通过依赖注入,将运行时组件串起来。Bus的创建由BusFactory负责,默认是 SpringBusFactory,对应于默认Bus实现。在构造过程中,SpringBusFactory会搜索META-INF/cxf(就包含在 CXF的Jar中)下的所有Bean配置文件,根据它们构建一个ApplicationContext。开发者也可提供自己的配置文件来定制Bus。

    2.消息传递和拦截器(Interceptor)

    CXF建立于一个通用的消息层之上,主要由消息、拦截器和拦截器链(InterceptorChain)组成。CXF是以消息处理为中心的,熟悉 JSP/Servlet的开发者可以将拦截器视为CXF架构中的“Filter”,拦截器链也与“FilterChain”类似。通过拦截器,开发者可以方便地在消息传递、处理的整个过程中对CXF进行扩展。拦截器的方法主要有两个:handleMessage和handleFault,分别对应消息处理和错误处理。在开发拦截器的时候需要注意两点:

    拦截器不是线程安全的,不建议在拦截器中定义实例变量并使用它。这一点跟JSP/Servlet中对于Filter的处理是一样的;

    不要调用下一个拦截器的handleMessage或handleFault,这个工作由InterceptorChain来完成。

    3.前端(Front End)

    它为CXF提供了创建服务的编程模型,当前主要的前端就是JAX-WS。

    4.服务模型

    CXF中的服务通过服务模型来表示。它主要有两部分:ServiceInfo和服务本身。ServiceInfo作用类似WSDL,包含接口信息、绑定、端点(EndPoint)等信息;服务则包含了ServiceInfo、数据绑定、拦截器和服务属性等信息。可使用Java类和WSDL来创建服务。一般是由前端负责服务的创建,它通过ServiceFactory来完成。

    5.绑定(Binding)

    绑定提供了在传输之上映射具体格式和协议的方法,主要的两个类是Binding和BindingFactory。BindingFactory负责创建Binding。

    6.传输(Transport)

    为了向绑定和前端屏蔽传输细节,CXF提供了自己的传输抽象。其中主要有两个对象:Conduit和Destination。前者是消息发送的基础,后者则对应消息接收。开发者还可以给Conduit和Destination注册MessageObserver,以便在消息发送和接收时获得通知。

    开发方法

    CXF 可以创建的Web 服务应用有两种:服务提供者和服务消费者。这种结构可类比客户端/ 服务器结构,服务消费者类似于客户端,服务提供者类似于服务器。使用CXF 创建应用时,服务提供者和服务消费者并不需要同时出现,因为有可能应用只是作为服务提供者或服务消费者单独出现。

    该框架提供了以下功能:

     

           OpenSource中关于CXF的简介:Apache CXF一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息格式(或binding)和网络协议(transports)包括SOAP、XML(通过HTTP或JMS)进行访问。CXF同样支持多种model 如:JAX-WS,JBI,SCA和CORBAservice。CXF设计成可灵活部署到各种容器中包括Spring-based,JBI,SCA, Servlet和J2EE容器。

           用CXF构建webservice程序的大致流程如下:

          1 配置web.xml文件,加载CXF

          2 编写java接口,和接口的实现

          3 在spring的applicationContext.xml中配置java文件

           4 创建beans.xml文件,里面配置接口的实现类

         5 运行tomca服务器即可生成wsdl文件

         6 编写测试代码:编写java测试文件和client-beans.xml文件

         7编写运行客户端文件所需的服务器,可以单独编写,也可以在随tomcat启动

    示例代码。首先下载cxf,然后解压,将lib下的所有jar包拷到工程下面

        一 最简单的helloword

    1     web.xml

    2    <?xml version="1.0" encoding="UTF-8"?>

    3    <!DOCTYPE web-app

    4        PUBLIC "-//Sun Microsystems, Inc.//DTD WebApplication 2.3//EN"

    5        "http://java.sun.com/dtd/web-app_2_3.dtd">

    6     

    7     

    8    <web-app>

    9        <context-param>

    10          <param-name>contextConfigLocation</param-name>

    11          <param-value>WEB-INF/beans.xml</param-value>

    12      </context-param>

    13   

    14      <listener>

    15          <listener-class>

    16              org.springframework.web.context.ContextLoaderListener

    17          </listener-class>

    18      </listener>

    19   

    20      <servlet>

    21          <servlet-name>CXFServlet</servlet-name>

    22          <servlet-class>

    23              org.apache.cxf.transport.servlet.CXFServlet

    24          </servlet-class>

    25          <load-on-startup>2</load-on-startup>

    26      </servlet>

    27   

    28      <servlet-mapping>

    29          <servlet-name>CXFServlet</servlet-name>

    30          <url-pattern>/*</url-pattern>

    31      </servlet-mapping>

    32   

    33  </web-app>

    2  接口HelloWord.java和接口的实现HelloWordImpl.java(service endpoint interface,SEI),

     package com.demo;

     

    import javax.jws.WebService;

     

    /** *//**

     * service interface

     *

     * @author

     *

     */

    @WebService

    public interface HelloWord{

        StringsayHi(String text);

    }

     

     

    package com.demo;

     

    import javax.jws.WebService;

     

    /** *//**

     * implementation

     *

     * @author

     *

     */

    @WebService

    public class HelloWordImpl implements HelloWord{

     

        public StringsayHi(String text){

            return "Hi" + text;

        }

    }

     

     

     

    3 beans.xml

     <?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

    http://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd">

     <!-- jar包中自带的cxf文件夹下的*.xml文件 -->

        <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" />

     

        <jaxws:endpoint id="helloword"

            implementor="com.demo.HelloWordImpl" address="/cxftest1" />

     

    </beans>

    4  启动tomcat服务器,在浏览器里面输入http://localhost:8888/helloword后页面上会出现

    {http://demo.com/}HelloWordImplPort ,点击会看到生成的wsdl文件http://localhost:8888/helloword/HelloWord?wsdl

     

    5 客户端Client.java和client-beans.xml

     package com.demo;

     

     

    importorg.springframework.context.ApplicationContext;

    importorg.springframework.context.support.ClassPathXmlApplicationContext;

     

    public final class Client{

     

        private Client(){

     

        }

     

        public static void main(Stringargs[]) throws Exception{

        

            

       

            ApplicationContext  context = new ClassPathXmlApplicationContext(

                    new String[]{"com/demo/client-beans.xml" });

     

            HelloWord client = (HelloWord)context.getBean("client");

     

            String response =client.sayHi("+亲爱的:邓建利");

            System.out.println("结果: " +response);

            System.exit(0);

          

        }

       

     

            

            

    }

     

    <?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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd

    http://cxf.apache.org/jaxwshttp://cxf.apache.org/schema/jaxws.xsd">

     

        <bean id="client" class="com.demo.HelloWord"

            factory-bean="clientFactory" factory-method="create" />

     

        <bean id="clientFactory"

            class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">

            <property name="serviceClass" value="com.demo.HelloWord" />

            <property name="address"

                value="http://localhost:9001/cxftest1" />

        </bean>

     

    </beans>

     

    6 客户端运行时所需的服务器Server.java

     package com.demo;

     

    importorg.mortbay.jetty.Connector;

    importorg.mortbay.jetty.Handler;

    importorg.mortbay.jetty.handler.DefaultHandler;

    importorg.mortbay.jetty.handler.HandlerCollection;

    importorg.mortbay.jetty.nio.SelectChannelConnector;

    importorg.mortbay.jetty.webapp.WebAppContext;

     

    public class Server{

     

        protected Server() throws Exception{

            System.out.println("StartingServer");

     

            org.mortbay.jetty.Server server= new org.mortbay.jetty.Server();

     

            SelectChannelConnectorconnector = new SelectChannelConnector();

            connector.setPort(9001);

            server.setConnectors(newConnector[]{connector});

     

            WebAppContext webappcontext =new WebAppContext();

            webappcontext.setContextPath("/");

     

            webappcontext.setWar("WebRoot");

     

            HandlerCollection handlers =new HandlerCollection();

            handlers.setHandlers(newHandler[]{webappcontext, new DefaultHandler()});

     

            server.setHandler(handlers);

            server.start();

            System.out.println("Serverready...");

            server.join();

        }

     

        public static void main(Stringargs[]) throws Exception{

            new Server();

        }

     

    }

    7 运行客户端Client.java的顺序,先启动tomcat,然后运行Server.java,最后运行Client.java

     

      Web 服务标准支持:CXF 支持以下Web 服务标准:

      Java API for XML Web Services (JAX-WS)

      SOAP

      Web 服务描述语言(Web ServicesDescription Language ,WSDL)

      消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)

      WS-Basic Profile

      WS-Addressing

      WS-Policy

      WS-ReliableMessaging

      WS-Security

  • 相关阅读:
    关于lockkeyword
    关于多层for循环迭代的效率优化问题
    Android 面试精华题目总结
    Linux基础回想(1)——Linux系统概述
    linux源代码编译安装OpenCV
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem B. Matrix Fast Power
    校赛热身 Problem B. Matrix Fast Power
    集合的划分(递推)
  • 原文地址:https://www.cnblogs.com/mount/p/2247770.html
Copyright © 2011-2022 走看看