Cxf介绍
基础架构
CXF旨在为服务创建必要的基础设施,它的整体架构主要由以下几个部分组成:
1.Bus
它是C X F架构的主干,为共享资源提供了一个可配置的场所,作用非常类似于S p r i n gApplicationContext
2.消息传递和(webapp是什么架构Interceptor
CXF建立于一个通用的消息层之上,主要由消息、和链(InterceptorChain)组成。CXF是以消息处理为中心 的,熟悉 JSP/Servlet的开发者可以将视为CXF架构中的Filter”,链也与FilterChain”类似。
不是线程安全的,不建议在中定义实例变量并使用它。这一点跟JSP/Servlet中对于Filter的处理是一样的;
3.前端(Front End
它为CXF提供了创建服务的编程模型,当前主要的前端就是JAX-WS
4.服务模型
CXF中的服务通过服务模型来表示。它主要有两部分:ServiceInfo和服务本身。ServiceInfo作用类似WSDL,包含接 口信息、绑定、端点(EndPoint)等信息;服务则包含了ServiceInfo、数据绑定、和服务属性等信息。可使用Java类和WSDL 创建服务。一般是由前端负责服务的创建,它通过ServiceFactory来完成。
5.绑定(Binding
绑定提供了在传输之上映射具体格式和协议的方法,主要的两个类是BindingBindingFactoryBindingFactory负责 创建Binding
6.传输(Transport
为了向绑定和前端屏蔽传输细节,CXF提供了自己的传输抽象。其中主要有两个对象:Cond
uitDestination。前者是消息发 送的基础,后者则对应消息接收。开发者还可以给ConduitDestination注册MessageObserver,以便在消息发送和接收时获得 通知。
Cxf的开发
CXF 可以创建的Web 服务应用有两种:服务提供者和服务消费者。
1、导入所依赖的包
    cxf-2.3.0.jar
    wsdl4j-1.6.2.jar
    XmlSchema-1.4.7.jar
2、编写接口和实现
    (一个简单的示范)包含以下:
1.User,用户对象,在消费者和提供者之间传递;
2.UserService,用户管理服务,它提供增加和获取所有用户的功能;
3.Client,服务消费者,它向UserService发起服务请求。
4. UserServiceImpl 服务的实现者。
服务器端开发:
服务端包含UserServiceUserServiceImpl,ServerUser。其中,UserService是接口定 义,UserServiceImpl是它的实现,Server负责服务的发布,服务只有发布之后才能被消费
UserService
import javax.jws.WebService;
//@WebService 指明接口是Web 服务
@WebService
public interface UserService {
void add(User user);
User[] findAllUsers();
}
   
   
UserServiceImpl
import java.util.List;
import java.util.Vector;
import javax.jws.WebService;
// endpointInterface为接口的类名
//@ WebService中还可以用serviceNameportName,分别指定了其产生的WSDL中的服务名和端口名。
@WebService(endpointInterface = "server.UserService")
public class UserServiceImpl implements UserService {
    static List<User> UserRepository = new Vector<User>();
    public void add(User user) {
        UserRepository.add(user);
    }
    public User[] findAllUsers() {
        User[] users = new User[UserRepository.size()];
        UserRepository.toArray(users);
        return users;
    }
}
Server
import l.ws.Endpoint;
public class Server {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        Endpoint.publish("localhost:9000/userService", userService);
    }
}
User
public class User {
    String first;
    String last;
    public String getFirst() {
        return first;
    }
    public void setFirst(String first) {
        this.first = first;
    }
    public String getLast() {
        return last;
    }
    public void setLast(String last) {
        this.last = last;
    }
}
客户端开发:
客户端只有一个类:Client,其他的UserUserService引用server中的对象。
public class Client {
    public static void main(String[] arg) {
        Service service = Service.create(new QName("server/",
                "UserService"));
        service.addPort(new QName("server/", "UserServicePort"),
                SOAPBinding.SOAP11HTTP_BINDING,
                "localhost:9000/userService");
        UserService userService = Port(UserService.class);
        User user = new User();
        user.setFirst("James");
        user.setLast("Bond");
        userService.add(user);
        User[] users = userService.findAllUsers();
        for (User u : users) {
            System.out.First() + "." + u.getLast());
        }
    }
}
Client
QName 的第一个参数指明了WSDL 的目标名字空间,可以通过服务地址?wsdl”方式获取服
务的WSDL,来查看服务的目标名字空间。对于由CXF 创建的服务,目标名字空间的默认构造规则是: 包名的倒序/。即如果包名是cn.hanvon.server,那么名字空间就为server.hanvon/
Cxf的web开发——与spring集成:
(以上的工作完成之后)
%〲 l 配置:
<listener>
        <listener-class>org.t.ContextLoaderListener</listener-class>
    </listener>
    <!-- cxf配置  -->
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>f.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/cxf/*</url-pattern>
    </servlet-mapping>
服务器端 l 配置:(默认在 /WEB-INF/ 下,可根据需要修改路径)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
    xmlns:xsi="/2001/XMLSchema-instance" xmlns:jaxws="/jaxws"
    xsi:schemaLocation="
        /schema/beans
        /schema/beans/spring-beans-2.5.xsd
        /jaxws
        /schemas/jaxws.xsd">
    <import resource="classpath:META-INF/l" />
    <import resource="classpath:META-INF/l" />
    <import resource="classpath:META-INF/l" />
    <jaxws:endpoint id="userService" implementor="server.UserServiceImpl"
        address="/UserService" />
</beans>
客户端:l 配置:(默认在 classPath: 下)
<!-- 客户端部分 -->
    <bean id="client" class="server.UserService" factory-bean="clientFactory"
        factory-method="create" />
    <bean id="clientFactory" class="f.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="server.UserService" />
        <property name="address" value="localhost:8008/wsDemo/cxf/UserService" />
    </bean>
Client2
public final class Client2 {
    public Client2() {
    }
    public static void main(String args[]) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "l" });
        UserService client = (UserService) Bean("client");
        System.out.println("Order ID: " + client.findAllUsers());
        System.exit(0);
    }
}
Final why?
对于web开发和其他的ws相比,在 CXF 中,应用程序的客户端代码是相同的,甚至构建步骤也是类似的:只需代替 JAX-WS 参考实现 wsimport 工具使用 CXF wsdl2java 工具即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。