XFire是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,帮助你方便快速地开发Web Service应用。相对于Axis来说,目前XFire相对受欢迎,加上其提供了和Spring集成的支持,在目
XFire是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,帮助你方便快速地开发Web Service应用。
相对于Axis来说,目前XFire相对受欢迎,加上其提供了和Spring集成的支持,在目前的Web Service开源社区拥有众多的追随者。并且因为XFire为Spring提供的支持,使得我们可以很容易在Spring中使用XFire构建Web Service应用。
XFire与Axis2相比具有如下特征:
1支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等;2使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现;3容易上手,可以方便快速地从pojo发布服务; 4支持Spring、Pico、Plexus、Loom等容器;5灵活的Binding机制,包括默认的Aegis,xmlbeans,jaxb2,castor;6高性能的SOAP 栈设计;7支持Spring、Pico、Plexus、Loom等容器。8 XFire比Axis1.3快2-6倍;9XFire的响应时间是Axis1.3的1/2到1/5。XFire在WebService框架中开始较晚,它从现有的框架中借鉴了许多优秀的理念,力争将Web Service的应用开发难度降到最低。此外,还提供了各种绑定技术、支持多种传输协议,对WebService体系中许多新的规范提供了支持。
下面让我们来看一个XFire于Spring集成的helloWorld的简单例子。
一.实现的功能和特点 本例具有如下功能和特点:1) 基于J2EE平台的Web Service服务;2) 开发方便,配置简单;3) 与spring无缝集成。XFire是完全基于流数据处理进行工作的系统,这意味着XFire不是将整个SOAP文档缓存在内存中,而是以管道的方式接收SOAP流数据。这种工作方式的转变带来了可观的性能回报,同时节省了内存的占用。
XFire从管道中接收一个SOAP请求到返回一个SOAP响应,会经历一系列的阶段。在管道调用的任何一个阶段,XFire都可以添加一些额外的Handler,在对消息进行加工处理后再传入到下一个阶段中。在SOAP请求消息对Web Service发起真正调用之前,分别会经过传输、预转发、转发、策略实施、用户信息处理、预调用、服务调用等阶段。
二.开发环境 笔者的开发环境描述如下:1) jdk: 1.5版本;2) Tomcat:5.5.20;3) MyEclipse:5.1.1GA。
<? xml version="1.0" encoding="UTF-8" ?> < web-app xmlns ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" version ="2.4" xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > < display-name > XFireService </ display-name > <!-- begin Spring配置 --> < context-param > < param-name > contextConfigLocation </ param-name > < param-value > /WEB-INF/applicationContext.xml,/WEB-INF/xfire-servlet.xml </ param-value > </ context-param > < listener > < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class > </ listener > < listener > < listener-class > org.springframework.web.util.IntrospectorCleanupListener </ listener-class > </ listener > <!-- end Spring配置 --> <!-- begin XFire 配置 --> < servlet > < servlet-name > xfire </ servlet-name > < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class > </ servlet > < servlet-mapping > < servlet-name > xfire </ servlet-name > < url-pattern > *.ws </ url-pattern > </ servlet-mapping > < servlet > <!-- 配合Spring容器中XFire一起工作的Servlet --> < servlet-name > xfireServlet </ servlet-name > < servlet-class > org.codehaus.xfire.spring.XFireSpringServlet </ servlet-class > </ servlet > < servlet-mapping > < servlet-name > xfireServlet </ servlet-name > <!-- 在这个URI下开放Web Service服务 --> < url-pattern > /service/* </ url-pattern > </ servlet-mapping > <!-- end XFire 配置 --> </ web-app >
package webservice; /* * * HelloWorld的接口类. */ public interface HelloWorld { /* * * 对名字为name的人打招呼. * @param name 名字 * @return 返回打招呼的字符串 */ String sayHelloWorld(String name); }
package webservice; /* * * HelloWorld的实现类. */ public class HelloWorldImpl implements HelloWorld { public String sayHelloWorld(String name) { String helloWorld = " hello, " + name; return helloWorld; } }
<? xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > < beans > < bean id ="HelloWorldBean" class ="webservice.HelloWorldImpl" /> </ beans >
<? xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > < beans > <!-- 引入XFire预配置信息 --> < import resource ="classpath:org/codehaus/xfire/spring/xfire.xml" /> <! —定义访问的url-- > < bean class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > < property name ="urlMap" > < map > < entry key ="/HelloWorldService.ws" > < ref bean ="HelloWorldService" /> </ entry > </ map > </ property > </ bean > <!-- 使用XFire导出器 --> < bean id ="baseWebService" class ="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init ="false" abstract ="true" > <!-- 引用xfire.xml中定义的工厂 --> < property name ="serviceFactory" ref ="xfire.serviceFactory" /> <!-- 引用xfire.xml中的xfire实例 --> < property name ="xfire" ref ="xfire" /> </ bean > < bean id ="HelloWorldService" parent ="baseWebService" > <!-- 业务服务bean --> < property name ="serviceBean" ref ="HelloWorldBean" /> <!-- 业务服务bean的窄接口类 --> < property name ="serviceClass" value ="webservice.HelloWorld" /> </ bean > </ beans >
package test; import org.codehaus.xfire.client.Client; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import webservice.HelloWorld; /* * * Copyright 2007 GuangZhou Amigo. * All right reserved. * HelloWorld的webservice的测试类. * @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a> * @version 1.0 * Creation date: 2007-9-16 - 下午05:36:05 */ public class WebServiceClientTest { HelloWorld helloWorld = null ; public static void main(String[] args) throws Exception { WebServiceClientTest test = new WebServiceClientTest(); test.testClient(); } public void testClient() throws Exception { String wsdl = " HelloWorldService.wsdl " ; // 对应的WSDL文件 Resource resource = new ClassPathResource(wsdl); Client client = new Client(resource.getInputStream(), null ); // 根据WSDL创建客户实例 Object[] objArray = new Object[ 1 ]; objArray[ 0 ] = " 阿蜜果 " ; // 调用特定的Web Service方法 Object[] results = client.invoke( " sayHelloWorld " , objArray); System. out .println( " result: " + results[ 0 ]); } }
<? xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > < beans > < bean id ="testWebService" class ="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean" > < property name ="serviceClass" > < value > webservice.HelloWorld </ value > </ property > < property name ="wsdlDocumentUrl" > < value > http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl </ value > </ property > </ bean > </ beans >
package test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import webservice.HelloWorld; /* * * HelloWorld的webservice的测试类. */ public class WebServiceClientTest { HelloWorld helloWorld = null ; public static void main(String[] args) { WebServiceClientTest test = new WebServiceClientTest(); test.testClient(); } public void testClient() { ApplicationContext ctx = new ClassPathXmlApplicationContext( " client.xml " ); helloWorld = (HelloWorld) ctx.getBean( " testWebService " ); System. out .println(helloWorld.sayHelloWorld( " 阿蜜果 " )); } }