WebService之CXF(一、服务端的使用)

一、关于CXF的介绍

  1. CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分 
  2. 下载CXF的所需要的jar包,最好包括源码,下载地址为:http://cxf.apache.org/download.htm。本例中使用的是cxf-2.7.10。

 

二、使用CXF

  1.   新建一个javaWeb项目,名称为CXFWebservice,将需要的jar导入lib中(如果不知道需要哪个,最方便的就是全部导入)。它包含了spring的JAR包,后面当我们需要把CXF作为WEB项目部署时,就需要用到spring的配置文件,这个后面再讲。这里是实现类和接口
    package com.xlk.cxf.service;
    import java.util.List;
    
    import javax.jws.WebParam;
    import javax.jws.WebService;
    
    import com.xlk.cxf.domain.Reader;
    /**
     * 
     * web接口 </br> 
     * 类名: IReaderService </br> 
     * 日期: 2014-2-19 上午11:17:09 </br> 
     * @author 许立亢 
     * @version 1.0
     */
    @WebService
    public interface IReaderService {
    	public Reader getReader(@WebParam(name="name") String name,@WebParam(name="password") String password);
    	public List<Reader> getReaders();
    }
     
package com.xlk.cxf.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebService;

import com.xlk.cxf.domain.Reader;
import com.xlk.cxf.service.IReaderService;
/**
 * 
 * 編寫服務端 </br> 
 * 类名: ReaderService </br> 
 * 日期: 2014-2-18 下午01:56:51 </br> 
 * @author 许立亢 
 * @version 1.0
 */
@WebService(endpointInterface="com.xlk.cxf.service.IReaderService",serviceName="readerService")
public class ReaderService implements IReaderService{
	public Reader getReader(@WebParam(name="name") String name,@WebParam(name="password") String password) {
		return new Reader(name,password);
	}
	
	public List<Reader> getReaders(){
		List<Reader> readerList = new ArrayList<Reader>();
		readerList.add(new Reader("shun1","123"));
		readerList.add(new Reader("shun2","123"));
		return readerList;
	}
}
 这里对注解进行一下解释 *@WebService:申明为webservice的注解 
*endpointInterface:要暴露的接口类
 *serviceName :    服务名
这里是实体类:
package com.xlk.cxf.domain;
/**
 * 
 * reader实体类 </br> 
 * 类名: Reader </br> 
 * 日期: 2014-2-19 上午11:20:28 </br> 
 * @author 许立亢 
 * @version 1.0
 */
public class Reader{
	private static final long serialVersionUID = 1L;
	private String name;
	private String password;
	
	public Reader(){}
	public Reader(String name,String password) {
		this.name = name;
		this.password = password;
	}
	//Get/Set方法省略
	public String toString(){
		return "Name:"+name+",Password:"+password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}
 上面的已经写完,
2.可以对其进行测试,CXF自带了一个轻量的容器服务,相当于spring自己提供了IOC容器一样。我们可以先用它来测试一下我们部署成功没。
下面我们新建一个测试类:
package com.xlk.cxf.test;

import javax.xml.ws.Endpoint;

import com.xlk.cxf.service.impl.ReaderService;
/**
 * 
 * 测试是不是部署成功 </br> 
 * 类名: ServiceTest </br> 
 * 日期: 2014-2-19 上午11:23:07 </br> 
 * @author 许立亢 
 * @version 1.0
 */
public class ServiceTest {
	public static void main(String[] args) {
		System.out.println("Server is starting...");
		ReaderService readerService = new ReaderService();
		Endpoint.publish("http://localhost:8080/readerService",readerService);
		System.out.println("Server is started...");
	}

}
 启动后的结果
WebService之CXF(一、服务端的使用)_第1张图片
 说明启动成功
3,启动浏览器测试是否部署成功,在地址栏输入: http://127.0.0.1:8080/readerService?wsdl
出现
WebService之CXF(一、服务端的使用)_第2张图片
 说项目已经部署成功,它生成了我们所需要的wsdl文件,说明我们部署成功了。
4,自己编写客户端调用服务端接口的方法,
package com.xlk.cxf.client;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Test;

import com.xlk.cxf.service.IHelloWorldService;

/**
 * 
 * CXF WebService客户端调用代码 </br> 
 * 类名: HelloWorldServiceClient </br> 
 * 日期: 2014-2-18 上午11:38:45 </br> 
 * @author 许立亢 
 * @version 1.0
 */
public class HelloWorldServiceClient {
	public static void main(String[] args) {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(IHelloWorldService.class);
		factory.setAddress("http://localhost:9000/helloWorld");
		
		IHelloWorldService service = (IHelloWorldService) factory.create();
		
		System.out.println("結果是  "+service.sayHello("仰望星空"));
	}
}
 运行方法,控制台显示为:Reader:Name:shun,Password:123
说明方法调用成功
 
以上是利用CXF再带的服务器运行。我们一般将项目部署到tomcat或者jboss中,现在我们也将该项目部署到tomcat应用服务器中,这时候利用和spring的整合。
首先看看web.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>WEB-INF/beans.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>
	</servlet>
	<servlet-mapping>
		<servlet-name>CXFServlet</servlet-name>
		<url-pattern>/ws/*</url-pattern>
	</servlet-mapping>
</web-app>
这里很简单,只是指定了spring的监听器和相应的配置文件路径,并且指定了CXF的拦截方式。 
这是spring的配置文件,beans.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:endpoint id="readerServicce2"
        implementor="com.xlk.cxf.service.impl.ReaderService" address="/readerService2" />
        
    <jaxws:endpoint id="hello"
    	implementor="com.xlk.cxf.service.impl.HelloWorldService" address="/helloService"
    ></jaxws:endpoint>
</beans>
  这里很简单,只是通过jaxws:endpoint定义了一个webservice,implementor是webservice的处理类,而address是它的访问路径,跟我们前面写的readerService类似。

这时我们可以把它部署到tomcat中,通过http://localhost:8080/CXFWebservice/webservice/readerService2?wsdl可以直接访问。

我们可以看到效果是一样的。


WebService之CXF(一、服务端的使用)_第3张图片
这里会有疑问,就是为什么这次访问的URL跟前面的不一样呢。其实前面的访问地址是我们自己定义的和项目的名称没有关系,而这里的webservice地址是我们在配置文件中配置好的,并且是通过web项目来部署的,这里就需要用项目名称,而且我们在CXFServlet那里配置了url-pattern是webservice,所以最后的URL就跟上面一致了。

 

整个项目的部署结构:


WebService之CXF(一、服务端的使用)_第4张图片
 
WebService之CXF(一、服务端的使用)_第5张图片
 

 

 

你可能感兴趣的:(webservice,CXF)