CXF+Spring发布WebService 以及 对WebService的调用

一、CXF介绍

        Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。CXF支持多种协议,如:SOAP、XML/HTTP、RESTful HTTP 、 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 、 JBI。CXF可以与Spring进行无缝集成。

CXF 框架是一种基于 Servlet 技术的 SOA 应用开发框架,要正常运行基于 CXF 应用框架开发的企业应用,除了 CXF 框架本身之外,还需要 JDK 和 Servlet 容器的支持。

CXF 下载地址:http://cxf.apache.org/download.html,选择“File”列中的zip格式下载。解压后可以看到一些文件夹:

└─apache-cxf-2.5.0
    ├─bin           各种工具
    ├─docs        API文档
    ├─etc          各种配置文件
    ├─lib           开发所需jar包
    ├─licenses  说明
    ├─modules  jar包

    └─samples  使用例子

samples文件夹中给提供了在各种环境下使用的例子,个人感觉只需参照样例即可。


二、使用CXF+Spring编写并发布WebService

        首先,新建一个Web项目,名字叫cxftest,将下载的压缩包中lib文件夹下的jar包全部拷贝到项目的WEB-INF/lib中,在web.xml中配置如下:

<servlet>
  	<servlet-name>CXFServlet</servlet-name>
  	<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>CXFServlet</servlet-name>
  	<url-pattern>/services/*</url-pattern>
  </servlet-mapping>
         然后,在项目src目录下新建包:com.test,在新建的包中创建TestService.java,代码如下:

package com.test;

import javax.jws.WebService;

@WebService
public interface TestService {
	
	public String sayHi(String name);

}

        接着,在创建TestServiceImpl.java,代码如下:

package com.test;

import javax.jws.WebService;

@WebService(endpointInterface="com.test.TestService")
public class TestServiceImpl implements TestService {
	
	public String sayHi(String name) {
		
		return name+", welcome to here!";
	}
}
CXF中采用注解的方式声明哪些类作为WebService进行发布,

@WebService:声明webservice接口;

@WebService(endpointInterface="com.test.TestService"):声明这个类是TestService接口的实现类。
        其次,在WEB-INF下新建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"
	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">
		
	<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:server id="testService" serviceClass="com.test.TestService" address="/testService">
  	<jaxws:serviceBean>
  		<bean class="com.test.TestServiceImpl" />
  	</jaxws:serviceBean>
  </jaxws:server>
</beans>
id:自定义,serviceClass:接口类的完整包名,address:此接口的访问路径,<jaxws:serviceBean/>标签用于配置接口的实现类

        然后,在web.xml中配置启动时加载cxf-servlet.xml,并配置Spring的监听器,代码如下:

<context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>/WEB-INF/cxf-servlet.xml</param-value>
  </context-param>
  
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

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">
  
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>/WEB-INF/cxf-servlet.xml</param-value>
  </context-param>
  
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <servlet>
  	<servlet-name>CXFServlet</servlet-name>
  	<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>CXFServlet</servlet-name>
  	<url-pattern>/services/*</url-pattern>
  </servlet-mapping>
  
</web-app>
        最后,发布到tomcat中并启动,在浏览器中输入http://localhost:8080/cxftest/services/testService?wsdl,发布成功!

三、测试发布的WebService,生成客户端代码调用WebService

        在浏览器中输入http://localhost:8080/cxftest/services/testService/sayHi?arg0=andy,返回内容正常,调用成功!这里要注意一点,在浏览器中测试接口时,参数名一定要和WSDL文档中的参数名一致,否则会出错。

        生成客户端代码,这里使用CXF自带的wsdl2java.bat工具生成客户端代码:wsdl2java.bat在bin文件夹中,在cmd窗口中进入到wsdl2java.bat所在目录下,

使用如下命令生成客户端代码:wsdl2java -d src -all http://localhost:8080/cxftest/services/testService?wsdl

-d:表示将转化后的代码放到哪里,如果不带此参数,则默认放到wsdl2java.bat所在目录下;

-all:以什么样的方式生成客户端代码,还有其他可选参数,这里不加阐述了,可以直接使用wsdl2java名来查看其他参数。

生成的客户端文件:ObjectFactory.java、package-info.java、SayHi.java、SayHiResponse.java、TestService.java、TestServiceImpl.java、

TestServiceService.java、TestService_TestServicePort_Client.java、TestService_TestServicePort_Server.java

TestService_TestServicePort_Client.java和TestService_TestServicePort_Server.java可以不要,前者是调用接口的例子,后者是发布接口的例子。

新建一个InvokeService.java,代码如下:

import com.test.TestService;
import com.test.TestServiceService;

public class InvokeService {

	public static void main(String[] args) {
		
		TestService s = new TestServiceService().getTestServicePort();
		System.out.println(s.sayHi("andy"));

	}
}
输出值:andy, welcome to here! ,调用成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值