1、CXF框架概念介绍
Apache CXF 是一个开源的 WebService 框架,CXF可以用来构建和开发 WebService,这些服务可以支持多种协议,比如:SOAP、POST/HTTP、HTTP ,CXF 大大简化了WebService并且可以天然地和 Spring 进行无缝集成。
CXF是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext,CXF默认是依赖于Spring的,另 CXF 发行包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不一致的问题。
CXF 内置了Jetty服务器 ,它是servlet容器,好比tomcat。
2、CXF框架特点
A、与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty
B、支持注解的方式来发布webservice
C、能够显示一个webservice的服务列表
D、能够添加拦截器:输入拦截器、输出拦截器 :输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器
首先创建两个java项目
第二步,导包
在CXF_Server中的lib导入
TypeService.java
package cn.itcast.type;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(serviceName="typeManager")
public interface TypeService {
@WebResult(name="type")
public String getType(@WebParam(name="position")int position);
}
TypeServiceImpl.java
package cn.itcast.type;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class TypeServiceImpl implements TypeService {
public String getType(int position){
String type=null;
switch (position) {
case 1:
type="这是1";
break;
case 2:
type="这是2";
break;
case 3:
type="这是3";
break;
case 4:
type="这是4";
break;
default:
break;
}
return type;
}
/**通过cxf框架发布webservice
* 1. ServerFactoryBean
* - 不设置注解也可以发布webservice服务, 不支持注解
* - 不支持拦截器的添加
* 2. JaxWsServerFactoryBean
* - 支持注解
* - 可以添加拦截器
* 3. webservice 访问流程:
* 1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手
* 2. 通过soap协议实现通信 ,采用的是post请求 , 数据封装在满足soap规约的xml中
* 3. 返回数据 同样采用的是soap通信, 数据封装在满足soap规约的xml中
* @param args
public static void main(String[] args){
TypeService typeService = new TypeServiceImpl();
ServerFactoryBean serverFactoryBean = new ServerFactoryBean();
//Endpoint :地址 , 实现对象
serverFactoryBean.setAddress("http://127.0.0.1:8080/cxf/typeService");//访问地址自定义
serverFactoryBean.setServiceClass(TypeService.class);//对外提供webservcie的业务类或者接口
serverFactoryBean.setServiceBean(typeService);//服务的实现bean
serverFactoryBean.create();//创建,发布webservice
System.out.println("wsdl地址:http://127.0.0.1:8080/cxf/typeService?WSDL");
}
*/
public static void main(String[] args){
TypeService typeService = new TypeServiceImpl();
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
jaxWsServerFactoryBean.setAddress("http://127.0.0.1:8080/cxf/typeService");//访问地址自定义
jaxWsServerFactoryBean.setServiceClass(TypeService.class);//对外提供webservcie的业务类或者接口
jaxWsServerFactoryBean.setServiceBean(typeService);//服务的实现bean
//添加输入拦截器 :输入显示日志信息的拦截器
jaxWsServerFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
//添加输出拦截器 :输出显示日志信息的拦截器
jaxWsServerFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
//创建,发布webservice
jaxWsServerFactoryBean.create();
System.out.println("wsdl地址:http://127.0.0.1:8080/cxf/typeService?WSDL");
}
}
http://127.0.0.1:8080/cxf/typeService?WSDL
查看是否发布不成功
发布成功之后,打开cmd,通过wsimport生成本地代理
将本地生成的类直接放到Client中
或者通过
打成jar包后再放入Client中(我这里打成了jar包)
Test.java
package cn.itcast.a;
public class Test {
public static void main(String[] args){
TypeManager ws = new TypeManager();
TypeService typeService = ws.getTypeServicePort();
String type = typeService.getType(2);
System.out.println(type);
}
}
输出结果