WebService(5)_Apache CXF 服务端四种发布方式(图文详解实例)

感觉CXF的开发方式,和使用JDK原生开发,并没有什么太大的区别


这里把四个方法的工程项目都上传了.. 下载之后直接可以发布测试使用

CXF+Jetty发布WebService

WebService使用RI发布

CXF+Spring+Tomcat发布WebService 

CXF+Tomat发布WebService


注: 由于JDK或者CXK框架的版本问题,生成客户端之后,有一个类会抛出异常,原则上,可以根据提示,将第三个入参删除,并不会对调用WebService产生影响.

这个是由于JDK版本引起的


CXF包,自己去Apache官网上下载吧 , 

CXF配置环境变量
在CLASSPATH中添加 D:\JavaApp\apache-cxf-2.7.5\lib
新建CXF_HOME D:\JavaApp\apache-cxf-2.7.5
在PATH中添加 D:\JavaApp\apache-cxf-2.7.5\bin

验证方法 :   在命令行中 输入  wsdl2java -v


CXF方式的WebService发布有四种:
1.使用CXF内置的Jetty发布WebService
	
2.使用RI(Oracle JAX_WS RI) 发布WebService

3.在Web容器(Tomcat)中基于Spring发布WebService

4.CXF不基于Spring直接发布到 Tomcat

Jetty 和 Tomcat 的比较 :
相同点:
	1.Tomcat 和 Jetty都是一种Servlet引擎.他们都支持标准的Servlet规范和JavaEE的规范.

不同点:
	1.架构比较:
		(1).Jetty 的架构比Tomcat更为简单.
		(2).Jetty 的架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现.扩展简单
		(3).Tomcat 的架构是基于容器设计的,进行扩展时需要了解Tomcat的整体设计结构,不易扩展.
			
	2.性能比较:
		(1).Jetty 和Tomcat性能方面差异不大.
			Jetty可以同时处理大量连接而且可以长时间保持连接,适合于Web聊天应用等等..
			Jetty的架构简单,因此作为服务器,Jetty可以按需加载组件,减少不需要的组件,减少了服务内存开销,从而提高服务器性能.
			Jetty默认采用NIO,在处理IO请求上可能更占优势,在处理静态资源时,性能更高.
						
			Tomcat适合处理少数非常繁忙的链接,也就是连接生命周期短的话,Tomcat的总体性能更高.
			Tomcat默认采用BIO处理IO请求,在处理静态资源时,性能较差.
						
			Jetty的应用更加快速,修改简单,对新的Servlet规范的支持较好.
			Tomcat目前应用比较广泛,对JavaEE 和 Servlet的支持更加全面,很多特性会直接集成进来.


1.使用CXF内置Jetty发布 CXF WebService

1.1 首先是项目结构

1.2 一个接口 , 一个接口实现类 , 一个发布Main方法

1.3 接口实现

1.4 使用Main()发布

1.5 使用 CXF提供的工具方法 "wsdl2java +发布URL "即可生成客户端.前提是你安装配置了CXF客户端以及JDK

生成客户端方法和JDK自带的 方法是类似的 , 你要是把 WebService(3)_开发流程(原生/JDK自带工具) 这篇看懂了,就OK了...

关于如何根据WSDL文档 , 调用接口方法 , 在JDK自带的那篇里面也说明了....




//******************************************************萌萌的分割线******************************************************
//******************************************************萌萌的分割线******************************************************
//******************************************************萌萌的分割线******************************************************


然后我们看使用RI(OracleJAX_WS RI)发布WebService

首先我们需要将RI 和 Tomcat进行整合.

RI的下载地址 : https://jax-ws.java.net/2.2.8/

下载完成之后,解压..

随后需要对 Tomcat 的 config/catalina.properties 文件进行配置:

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,D:/Tool/jaxws-ri/lib/*.jar
注意:以上配置中的最后一部分,其实就是在 Tomcat 中添加一系列关于 RI 的 jar 包。

这样子RI和Tomcat就整合好了... 


下面我们编写服务端代码

接口

package com.ws.ri.server;

import javax.jws.WebService;

@WebService
public interface HelloService {
	
	public String sayHello(String name);
	
}


实现类 

@WebService
public class HelloServiceImpl implements HelloService {

	@Override
	public String sayHello(String name) {
		return "hello : " + name;
	}

}

在WEB-INF目录下添加"sun-jaxws.xml"配置文件.

配置三个属性:WS 的名称、实现类、URL 模式。正是通过这个“URL 模式”来访问 WSDL 的

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">

	<endpoint 
	name="HelloService" 
	implementation="com.ws.ri.server.HelloServiceImpl"
	url-pattern="/wsri/helloservice"/>

</endpoints>
然后将这个项目,丢到整合好RI的Tomcat中,跑起来...

然后你会在控制台看到这样的打印信息



然后打开浏览器,输入发布的url : http://localhost:8080/WebService_RI_Server_1/wsri/helloservice

这个url注意前面要加上web项目的名字.

然后就出现了RI的控制台


点击WSDL就可以查看WSDL文档了.. 

接下去的客户端调用,就省略了.. 



//******************************************************萌萌的分割线******************************************************
//******************************************************萌萌的分割线******************************************************
//******************************************************萌萌的分割线******************************************************

接下来我们看在Web容器(Tomcat)中基于Spring发布WebService

接口

package com.ws.cxf.spring.tomcat.server;

import javax.jws.WebService;

@WebService
public interface HelloService {
	
	public String sayHello(String name);
	
}
接口实现

package com.ws.cxf.spring.tomcat.server;

import javax.jws.WebService;
import org.springframework.stereotype.Component;

@WebService
@Component
public class HelloServerImpl implements HelloService {

	/**
	 * 发布地址 : http://localhost:8080/WebService_CXF_Spring_Tomcat_Server_1/ws
	 * 到达控制台
	 */
	@Override
	public String sayHello(String name) {
		return "Hello : " + name;
	}

}


然后配置spring.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"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<!-- 这边是引入CXF的核心配置 -->
	<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" />

	<jaxws:endpoint id="sayHello"
		implementor="com.ws.cxf.spring.tomcat.server.HelloServerImpl" address="/sayHello" />

</beans>


接着配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  
  <!-- Spring -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:spring.xml</param-value>
  </context-param>
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <!-- CXF -->
  <servlet>
  	<servlet-name>cxf</servlet-name>
  	<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>cxf</servlet-name>
  	<url-pattern>/ws/*</url-pattern>
  </servlet-mapping>
  
</web-app>

然后将工程丢入Tomcat中跑吧...

在页面输入url


然后点击WSDL就可以看到WSDL文档了... 

客户端调用.. 不说了.. 都是一样的...



//******************************************************萌萌的分割线******************************************************
//******************************************************萌萌的分割线******************************************************
//******************************************************萌萌的分割线******************************************************


4不基于Spring发布 CXF Tomcat

接口

注意 : 这里不用加@WebService注解

package com.test;

public interface HelloWorld {

	public String sayHello(String name);
}


接口实现
package com.test;

public class HelloWorldImpl implements HelloWorld {

	public String sayHello(String name) {
		return "hello : " + name;
	}

}

主方法

package com.test;

import javax.servlet.ServletConfig;

import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.transport.servlet.CXFNonSpringServlet;

public class CXFNoSpringServletImpl extends CXFNonSpringServlet{

	private static final long serialVersionUID = 1L;

	@Override
	protected void loadBus(ServletConfig sc) {
		super.loadBus(sc);
		
		Bus bus = getBus();
		BusFactory.setDefaultBus(bus);
		
		ServerFactoryBean sfb = new ServerFactoryBean();
		sfb.setServiceClass(HelloWorld.class);
		sfb.setAddress("/helloService");
		sfb.setServiceBean(new HelloWorldImpl());
		sfb.create();
	}
}

然后配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>CXFServlet</servlet-name>
  	<servlet-class>com.test.CXFNoSpringServletImpl</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>CXFServlet</servlet-name>
  	<url-pattern>/*</url-pattern>
  </servlet-mapping>
  
</web-app>

直接丢到Tomcat跑就行了..

输入网址


接着就可以看到wsdl文档,, 客户端调用同上....


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值