一、关于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; } }上面的已经写完,
下面我们新建一个测试类:
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
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的整合。
<?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可以直接访问。
我们可以看到效果是一样的。
这里会有疑问,就是为什么这次访问的URL跟前面的不一样呢。其实前面的访问地址是我们自己定义的和项目的名称没有关系,而这里的webservice地址是我们在配置文件中配置好的,并且是通过web项目来部署的,这里就需要用项目名称,而且我们在CXFServlet那里配置了url-pattern是webservice,所以最后的URL就跟上面一致了。
整个项目的部署结构:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。