阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Apache CXF快速入门基础教程

223次阅读
没有评论

共计 7786 个字符,预计需要花费 20 分钟才能阅读完成。

基础架构

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 创建应用时,服务提供者和服务消费者并不需要同时出现,因为有可能应用只是作为服务提供者或服务消费者单独出现。

为了说明使用 CXF 如何创建这两种类型的应用,本教程将同时给出它们的例子。另外,由于 Groovy 在 Java 世界中变得越来越流行,本教程会给出使用 Groovy 的 CXF 插件 GroovyWS 的实现例子。例子使用 JDK 1.5.X 和 Groovy 1.0 完成,包含以下几部分:

1.User,用户对象,在消费者和提供者之间传递;

2.UserService,用户管理服务,它提供增加和获取所有用户的功能;

3.Client,服务消费者,它向 UserService 发起服务请求。

Java 实现的步骤包括以下几点。

服务端包含 UserService、UserServiceImpl 和 User。其中,UserService 是接口定义,UserServiceImpl 是它的实现,并负责服务的发布,服务只有发布之后才能被消费。例子使用了 JAX-WS,它们的主要内容如下:

UserService

package server;
import javax.jws.WebService;
@WebService
public interface UserService {
void add(User user);
User[] findAllUsers();
}

@WebService 指明接口是 Web 服务
UserServiceImpl

import java.util.List;
import java.util.Vector;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService(endpointInterface = "server.UserService",
serviceName = "UserService",
portName="UserServicePort")
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;
}
public static void main(String[] args){
UserServiceImpl userService= new UserServiceImpl();
Endpoint.publish("http://localhost:9000/userService", userService);
}
}

@ WebService 中的 serviceName、portName,分别指定了其产生的 WSDL 中的服务名和端口名。endpointInterface 为接口的类名。服务发布代码也可以放在另一个类中。

User

package server;
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;
}
}

 

  更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-05/101383p2.htm

2. 客户端只有一个类:Client,其他的 User、UserService 引用 server 包中的对象。

package client;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
import server.User;
import server.UserService;
public class Client {
public static void main(String[] arg){
Service service = Service.create(
new QName("http://server/", "UserService"));
service.addPort(new QName("http://server/", "UserServicePort")
, SOAPBinding.SOAP11HTTP_BINDING
, "http://localhost:9000/userService");
UserService userService= service.getPort(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.println(u.getFirst()+"."+u.getLast());
}
}
}

注意,QName 的第一个参数指明了 WSDL 的目标名字空间,可以通过“服务地址?wsdl”方式获取服务的 WSDL,来查看服务的目标名字空间。对于由 CXF 创建的服务,目标名字空间的默认构造规则是:http:// 包名的倒序 /。即如果包名是 a.b.c,那么名字空间就为 http://c.b.a/。GroovyWS 的实现步骤包括以下几点。

1. 服务端包括:User、UserService、User.aegis.xml。由于 Groovy 类包含一个 metaClass 属性,该属性不应该被序列化在服务端和客户端之间传递,User.aegis.xml 用来指定将该属性忽略掉。

User

package server;
class User {
String first
String last
}

UserService

package server;
import groovyx.net.ws.WSServer
class UserService {
private static List users= new Vector()
void add(User user){
users.add(user)
}
User[] findAllUsers(){
User[] u= new User[users.size()]
users.toArray(u)
return u
}
static void main(args) {
def server = new WSServer()
server.setNode("server.UserService",
"http://localhost:9000/UserService")
}
}

注意它的发布。

Use.aegis.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:sample="http://DefaultNamespace">
<mapping name="sample:User">
<property name="metaClass" ignore="true"/>
</mapping>
</mappings>

2. 客户端包含:Client 和 User.aegis.xml,User.aegis.xml 的内容和服务端的一样。Client 的内容如下:

package client;
import groovyx.net.ws.WSClient
class Client {
static void main(args) {
def proxy = new WSClient(
"http://localhost:9000/UserService?wsdl", Client.class.classLoader)
def user= proxy.create("defaultnamespace.User");
user.first="James"
user.last="Bond"
proxy.add(user)
def result= proxy.findAllUsers()
result.users.each{
println it.first+"."+it.last
}
}
}

 

Apache CXF 的详细介绍 :请点这里
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 创建应用时,服务提供者和服务消费者并不需要同时出现,因为有可能应用只是作为服务提供者或服务消费者单独出现。

为了说明使用 CXF 如何创建这两种类型的应用,本教程将同时给出它们的例子。另外,由于 Groovy 在 Java 世界中变得越来越流行,本教程会给出使用 Groovy 的 CXF 插件 GroovyWS 的实现例子。例子使用 JDK 1.5.X 和 Groovy 1.0 完成,包含以下几部分:

1.User,用户对象,在消费者和提供者之间传递;

2.UserService,用户管理服务,它提供增加和获取所有用户的功能;

3.Client,服务消费者,它向 UserService 发起服务请求。

Java 实现的步骤包括以下几点。

服务端包含 UserService、UserServiceImpl 和 User。其中,UserService 是接口定义,UserServiceImpl 是它的实现,并负责服务的发布,服务只有发布之后才能被消费。例子使用了 JAX-WS,它们的主要内容如下:

UserService

package server;
import javax.jws.WebService;
@WebService
public interface UserService {
void add(User user);
User[] findAllUsers();
}

@WebService 指明接口是 Web 服务
UserServiceImpl

import java.util.List;
import java.util.Vector;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService(endpointInterface = "server.UserService",
serviceName = "UserService",
portName="UserServicePort")
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;
}
public static void main(String[] args){
UserServiceImpl userService= new UserServiceImpl();
Endpoint.publish("http://localhost:9000/userService", userService);
}
}

@ WebService 中的 serviceName、portName,分别指定了其产生的 WSDL 中的服务名和端口名。endpointInterface 为接口的类名。服务发布代码也可以放在另一个类中。

User

package server;
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;
}
}

 

  更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-05/101383p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计7786字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中