CXF的运用

1 CXF的目录讲解

在这里插入图片描述bin(目录)
bin 目录中是 CXF 框架中所提供的代码生成、校验、管理控制台工具(可执行命令)

docs(目录)
CXF 所有类(class)对应的 API 文档,为开发者使用 CXF 完成应用开发提供应有的帮助。

etc(目录)
包含一个基本的 Service 暴露所需要的 web.xml 文件,及其它的配置文件。

lib(目录)
lib 目录中包含 CXF 及其运行时所需要的和可选的第三方支持类包(.jar 文件),可以根据不同项目所需的 CXF 特性选择所需要的支持类包。如果不想一一去区分的话,可
以直接在 Web 项目中包含所有的 CXF 及其运行时所需要的第三方支持类包(.jar 文件)即可。

licenses(目录)
列表了引用第三方 jar 包的相关许可协议。

2 环境搭建

  1. 需要jdk的支持
  2. CXF_HOME
    在这里插入图片描述path:
    在这里插入图片描述
    验证:
    在这里插入图片描述

3 cxf的例子

1.创建java项目
2.引入所有依赖包
3.创建服务类
用两个不同的类发布应用:
ServerFactoryBean(不需要使用@webservice) 生成的文档不规范,不建议使用
JaxWsServerFactoryBean(建议使用此类,需要使用@webservice) 生成的文档规范,可以发布SOAP1.1,SOAP1.2的协议,当cxf的服务类中没有方法时也可以发布成功,不报错。如果使用SOAP1.2需要用@bindType注解指定
当使用SOAP1.2时wsimport命令失效,需要使用cxf的wsdl2java

eg:

===========下面是要发布的类或者接口===========
public class PersonService {
	public String sayHello(String name){
		return "hello " + name;
	}
}
------------------------------------------
@WebService
public class PersonService1 {
	public String sayHello(String name){
		return "hello " + name;
	}
}
------------------------------------------
@WebService//如果发布的带有接口的服务需要在接口上加@WebService
public interface UserService {
	
	public String sayLove(String name);

}
public class UserServiceImpl implements UserService {
	@Override
	public String sayLove(String name) {
		return name + " love you";
	}
}
-----------------------------------------
@WebService//如果发布的带有接口的服务需要在接口上加@WebService
//默认的情况下soap的版本是soap11,如果想要使用soap12需要使用@BindingType,wsimport方式生成客户端的代码失效,需要使用wsdl2java(其实现类在此省略...)
@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public interface UserService {
	public String sayLove(String name);
}//其中发布代码与接口方式一样。

=======下面是用ServerFactoryBean 或者JaxWsServerFactoryBean对其发布 ========
//ServerFactoryBean 发布类,生成的wsdl不规范 不建议使用
public static void publishWSWithServerFactoryBean(){
		//创建cxf发布的服务对象
		ServerFactoryBean sfb = new ServerFactoryBean();
		//设置服务的类
		sfb.setServiceClass(PersonService.class);
		//设置服务地址
		sfb.setAddress("http://localhost:9999/hello");
		sfb.create();
	}
	//JaxWsServerFactoryBean 发布类,需要加注释@webService
	public static void publishWSWithJaxWsServerFactoryBean(){
		//创建cxf发布的服务对象
		JaxWsServerFactoryBean sfb = new JaxWsServerFactoryBean();
		//设置服务的类
		sfb.setServiceClass(PersonService1.class);
		//设置服务地址
		sfb.setAddress("http://localhost:11111/hello");
		//设置服务类对象
		sfb.setServiceBean(new PersonService1());
		//发布
		sfb.create();
	}
	
	/**
	 * 发布带有接口的服务,需要在接口上加上注释。
	 */
	public static void publishWSWithJaxWsServerFactoryBean1(){
		//创建cxf发布的服务对象
		JaxWsServerFactoryBean sfb = new JaxWsServerFactoryBean();
		//设置服务的接口类
		sfb.setServiceClass(UserService.class);
		//设置服务地址
		sfb.setAddress("http://localhost:7777/hello");
		//设置服务类对象
		sfb.setServiceBean(new UserServiceImpl());
		//设置输入输出的消息拦截器
		sfb.getInInterceptors().add(new LoggingInInterceptor());
		sfb.getOutInterceptors().add(new LoggingOutInterceptor());
		//发布
		sfb.create();
	}
 

4.wsdl2java 客户端代码生成

cxf可以生成soap1.1,也可以生成soap1.2
它包含以下参数:
-d参数,指定代码生成的目录。
-p参数,指定生成的新的包结构。
需要说明的是,由于wsdl2java生成的本地代码,所以,需要对生成的代码做一点点修改。

eg:wsdl2java -d . http://127.0.0.1:6666/helloworld?wsdl

5. 在web项目中运用CXF

1.创建web项目
2.导入所有包
3.创建服务类,必须指定注解@webService
4.创建cxf的核心配置文件cxf-servlet.xml。

web.xml的配置文件

	<!-- 
		使用spring来加载cxf的服务类的配置文件,服务类的对象由spring来创建,服务类的对象存在springIoc的容器中
	 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	//这里可以修改mycxf-servlet.xml的地址
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:mycxf-servlet.xml</param-value>
	</context-param>
	
	<!-- servlet负责发布服务类 -->
	<servlet>
		<servlet-name>mycxf</servlet-name>
		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>mycxf</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>

cxf-servlet.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"
	xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans.xsd
            http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
            http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
	<!-- 引入CXF Bean定义如下,早期的版本中使用 -->
	<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" />
		<!-- 
			endpoint:发布类的形式的服务配置
			wsdl的全路径:http://localhost:8080/cxf_web_server/[url-partten]/address
			address:配置时前面必须加/
			implementor:具体的服务类
		 -->
	<jaxws:endpoint id="personService" address="/personService" implementor="com.hl.server.PersonService">
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
		</jaxws:inInterceptors>
		<jaxws:outInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" ></bean>
		</jaxws:outInterceptors>
	</jaxws:endpoint>
	
	<!-- 发布接口类的形式的cxf服务使用server,serviceClass:接口类 -->
	<jaxws:server id="userService" address="/userService" serviceClass="com.hl.server1.UserService">
		<!-- 	配置接口的具体的实现类 -->
		<jaxws:serviceBean>
			<bean class="com.rl.server1.UserServiceImpl"></bean>
		</jaxws:serviceBean>
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
		</jaxws:inInterceptors>
		<jaxws:outInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" ></bean>
		</jaxws:outInterceptors>
	</jaxws:server>
	
</beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值