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

来源:互联网 发布:ubuntu解压tar.gz命令 编辑:程序博客网 时间:2024/06/04 18:37
感觉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发布WebService2.使用RI(Oracle JAX_WS RI) 发布WebService3.在Web容器(Tomcat)中基于Spring发布WebService4.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;@WebServicepublic interface HelloService {public String sayHello(String name);}


实现类 

@WebServicepublic class HelloServiceImpl implements HelloService {@Overridepublic 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;@WebServicepublic interface HelloService {public String sayHello(String name);}
接口实现

package com.ws.cxf.spring.tomcat.server;import javax.jws.WebService;import org.springframework.stereotype.Component;@WebService@Componentpublic class HelloServerImpl implements HelloService {/** * 发布地址 : http://localhost:8080/WebService_CXF_Spring_Tomcat_Server_1/ws * 到达控制台 */@Overridepublic 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.xsdhttp://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;@Overrideprotected 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文档,, 客户端调用同上....


0 0
原创粉丝点击