前言
基于现阶段的Demo项目整理的CXF开发服务端与客户端的基本步骤与解析。
WebService
WebService是什么
1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
2. 抽象的说,是一个跨语言、跨平台的规范
3. 实际的说,是多个跨平台、跨语言的应用间通信整合的方案
以各个网站显示天气预报功能为例:
气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client)。网站提供了天气预报的服务,但其实它们什么也没有做,只是简单了调用了一下气象中心服务器上的一个服务接口而已。
4. WebService的优点:能够解决跨平台,跨语言,以及远程调用之间的问题。
5. WebService的应用场合
a. 同一家公司的新旧应用之间
b. 不同公司的应用之间,例如电商和物流之间的应用相互调用
c.一些提供数据的内容聚合应用:天气预报、股票行情
WebService预备知识
几个重要术语
1.WSDL(web service definition language)
webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程。
2.SOAP(simple object access protocal)
一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据,在webservice中分为请求消息和响应消息。
3.SEI(WebService EndPoint Interface)
webService服务器端用来处理请求的接口
4.CXF(Celtix + XFire)
一个apache的用于开发webservice服务器端和客户端的框架
WebService开发
组成:1、服务端开发
2、客户端开发
使用CXF开发WebService服务器端口
首先说明开发步骤,然后详细解析。
开发步骤:
- 新建maven项目,jre使用1.7(这里用此Demo项目说明)
- 添加cxf依赖包(本项目中已添加,在下面列出)
- 根据规范,新建接口类,(本项目中是PersonService)
- 新建实现类(本项目中是PersonServiceImpl)
- 新建主类(本项目已经整合进SSH中)
- 调用接口地址: 以?wsdl结尾
解析(对应开发步骤):
- 之前已经说明,不再叙述
- 在pom.xml中引入依赖如下:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.5</version>
</dependency>
- .PersonService中的注解解析
@WebService 此注解用来标明此java类定义了personWebService的接口
- PersonServiceImpl的注解解析
@Service 注解表示会被spring管理,自动注册到spring容器中
@WebService(endpointInterface ="cn.yangjieyu.service.PersonService")
endpointInterface属性是指服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口
@Component("personServiceImpl")
表示这个类是一个组件,会被spring管理
- 本项目中没有主类,是将WebService与SSH整合,添加了cxf-servlet.xml配置文件
Jaxws:endpoint标签定义了提供服务者,address属性表示具体的接口路径。
jaxws:inInterceptors和jaxws:outInterceptors指系统日志的入拦截器和出拦截器。
- 右击项目,Run as ->Run on Server 即启动项目,
访问地址:http://localhost:8080/ssh2/webservice/,可以看到Available SOAP services.
可以点击上图中对应的WSDL访问具体WebService接口。 效果如下:
下面是Demo主类,不在本项目中
发布WebService的Demo主类如下:
package com.fzhiy.webservice;
import com.fzhiy.webservice.impl.HelloWorldImpl;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
public class Server {
public static void main(String[] args) {
System.out.println("web service start");
HelloWorld implementor = new HelloWorldImpl();
String address = "http://localhost:8082/helloWorld";
// Endpoint.publish(address, implementor); // JDK实现
JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
factoryBean.setAddress(address); // 设置暴露地址
factoryBean.setServiceClass(HelloWorld.class); // 接口类
factoryBean.setServiceBean(implementor); // 设置实现类
// 添加请求消息拦截器
factoryBean.getInInterceptors().add(new LoggingInInterceptor());
// 添加响应消息拦截器
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
factoryBean.create();
System.out.println("web service started");
}
}
使用CXF开发WebService客户端
这里简述开发步骤:
- 新建Maven项目作为模拟客户端
- 根据cxf提供的wsdl2java工具请求wsdl接口url生成代码(前提:cxf已经配置好了Path)
- 在dos窗口进入客户端项目路径,使用命令wsdl2java http://localhost:8080/ssh2/webservice/personWebService?wsdl
随后在项目中生成了相应代码
4.编写主类,运行