您的位置:首页 > 其它

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

2015-03-31 11:44 197 查看

一、关于CXF的介绍

CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分 

下载CXF的所需要的jar包,最好包括源码,下载地址为:http://cxf.apache.org/download.htm。本例中使用的是cxf-2.7.10。

 

二、使用CXF

  新建一个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...");
}

}

 启动后的结果



 说明启动成功
3,启动浏览器测试是否部署成功,在地址栏输入:http://127.0.0.1:8080/readerService?wsdl

出现



 说项目已经部署成功,它生成了我们所需要的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.s
ba57
ervlet.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可以直接访问。
我们可以看到效果是一样的。



这里会有疑问,就是为什么这次访问的URL跟前面的不一样呢。其实前面的访问地址是我们自己定义的和项目的名称没有关系,而这里的webservice地址是我们在配置文件中配置好的,并且是通过web项目来部署的,这里就需要用项目名称,而且我们在CXFServlet那里配置了url-pattern是webservice,所以最后的URL就跟上面一致了。
 
整个项目的部署结构:



 



 
 
 





大小: 664.5 KB





大小: 485.5 KB





大小: 515.4 KB

CXFWebservice.zip (25.6 KB)

下载次数: 7





大小: 86.5 KB





大小: 85.5 KB

查看图片附件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: