这里把四个方法的工程项目都上传了.. 下载之后直接可以发布测试使用
这个是由于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;
}
}
<?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>
<?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文档,, 客户端调用同上....