基于CXF Web Service:Apache CXF简单部署

 

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

1.Bus

它是C X F架构的主干,为共享资源提供了一个可配置的场所,作用非常类似于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框架,它实现了JCPWeb Service中一些重要标准。CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息格式(binding)和网络协议(transports)包括SOAPXML(通过HTTPJMS)进行访问。CXF同样支持多种model 如:JAX-WSJBISCACORBA serviceCXF设计成可灵活部署到各种容器中包括Spring-basedJBISCA ServletJ2EE容器。

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

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

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

3 springapplicationContext.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 Web Application 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{

String sayHi(String text);

}

package com.demo;

import javax.jws.WebService;

/** *//**

* implementation

*

* @author

*

*/

@WebService

public class HelloWordImpl implements HelloWord{

public String sayHi(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/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://cxf.apache.org/jaxws http://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.javaclient-beans.xml

package com.demo;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public final class Client{

private Client(){

}

public static void main(String args[]) 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/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://cxf.apache.org/jaxws http://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;

import org.mortbay.jetty.Connector;

import org.mortbay.jetty.Handler;

import org.mortbay.jetty.handler.DefaultHandler;

import org.mortbay.jetty.handler.HandlerCollection;

import org.mortbay.jetty.nio.SelectChannelConnector;

import org.mortbay.jetty.webapp.WebAppContext;

public class Server{

protected Server() throws Exception{

System.out.println("Starting Server");

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

SelectChannelConnector connector = new SelectChannelConnector();

connector.setPort(9001);

server.setConnectors(new Connector[]{connector});

WebAppContext webappcontext = new WebAppContext();

webappcontext.setContextPath("/");

webappcontext.setWar("WebRoot");

HandlerCollection handlers = new HandlerCollection();

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

server.setHandler(handlers);

server.start();

System.out.println("Server ready...");

server.join();

}

public static void main(String args[]) 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 Services Description Language ,WSDL)

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

  WS-Basic Profile

  WS-Addressing

  WS-Policy

  WS-ReliableMessaging

  WS-Security

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值