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..."); } }
启动后的结果
![](http://dl2.iteye.com/upload/attachment/0093/9842/be291559-99c3-3c64-81d3-a6846a091ac9.jpg)
说明启动成功
3,启动浏览器测试是否部署成功,在地址栏输入:http://127.0.0.1:8080/readerService?wsdl
出现
![](http://dl2.iteye.com/upload/attachment/0093/9844/2184189a-5e48-36b4-8dbb-cd0ba335a710.jpg)
说项目已经部署成功,它生成了我们所需要的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可以直接访问。
我们可以看到效果是一样的。
![](http://dl2.iteye.com/upload/attachment/0093/9852/dc1fbcba-53b3-3c94-b35c-41172e28571a.jpg)
这里会有疑问,就是为什么这次访问的URL跟前面的不一样呢。其实前面的访问地址是我们自己定义的和项目的名称没有关系,而这里的webservice地址是我们在配置文件中配置好的,并且是通过web项目来部署的,这里就需要用项目名称,而且我们在CXFServlet那里配置了url-pattern是webservice,所以最后的URL就跟上面一致了。
整个项目的部署结构:
![](http://dl2.iteye.com/upload/attachment/0093/9859/217dc7a4-c498-306a-bba6-3aa0dc83e6b4.jpg)
![](http://dl2.iteye.com/upload/attachment/0093/9861/18d7dd6a-c095-3dd6-aaaf-fbaad6226b8a.jpg)
![](http://dl2.iteye.com/upload/attachment/0093/9842/be291559-99c3-3c64-81d3-a6846a091ac9-thumb.jpg)
大小: 664.5 KB
![](http://dl2.iteye.com/upload/attachment/0093/9844/2184189a-5e48-36b4-8dbb-cd0ba335a710-thumb.jpg)
大小: 485.5 KB
![](http://dl2.iteye.com/upload/attachment/0093/9852/dc1fbcba-53b3-3c94-b35c-41172e28571a-thumb.jpg)
大小: 515.4 KB
CXFWebservice.zip (25.6 KB)
下载次数: 7
![](http://dl2.iteye.com/upload/attachment/0093/9859/217dc7a4-c498-306a-bba6-3aa0dc83e6b4-thumb.jpg)
大小: 86.5 KB
![](http://dl2.iteye.com/upload/attachment/0093/9861/18d7dd6a-c095-3dd6-aaaf-fbaad6226b8a-thumb.jpg)
大小: 85.5 KB
查看图片附件
相关文章推荐
- 使用CXF 开发SOAP webservice 服务端实例
- 一、使用cxf的JaxWsServerFactoryBean创建webservice的服务端和客户端
- WebService学习笔记:使用CXF+Spring搭建WebService服务端和客户端
- 使用cxf在springMVC环境搭建webservice示例-服务端
- WebService学习总结(四)——使用spring+CXF开发WebService(服务端)
- 使用CXF开发WebService程序的总结(四):基于bean的客户端和服务端代码的编写
- WebService-03-使用CXF开发服务端和客户端
- Web Service (012---webservice使用CXF写基于Spring的WebService[服务端+客户端])
- 使用CXF开发WebService程序的总结(七):Spring+CXF+Mybatis+Mysql共同打造的服务端示例
- 使用cxf实现webservice的客户端推送数据到服务端并返回状态给客户端
- 使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写
- 使用CXF开发WebService程序的总结(二):创建webservice服务端
- WebService学习——使用CXF编写WebService服务端
- 使用CXF创建webService服务端
- WebService-03-使用CXF开发服务端和客户端
- iphone开发笔记四 webservice环境配置cxf使用
- 使用cxf开发webservice
- 【CXF】使用CXF部署一个最简单的WebService应用
- 使用CXF框架实现webservice的一个简单例子
- webService(CXF)的简单使用