早前的一篇文章,今天才发表,贴上来,:)
请勿转载
原文出处:
xfire是与axis 2并列的新一代web service框架,通过提供简单的api支持web service各项标准协议,帮助你方便快速地开发web service应用。
相对于axis来说,目前xfire相对受欢迎,加上其提供了和spring集成的支持,在目前的web service开源社区拥有众多的追随者。并且因为xfire为spring提供的支持,使得我们可以很容易在spring中使用xfire构建web service应用。
xfire与axis2相比具有如下特征:
l 支持一系列web service的新标准--jsr181、wsdl2.0 、jaxb2、ws-security等;
l 使用stax解释xml,性能有了质的提高。xfire采用woodstox 作stax实现;
l 容易上手,可以方便快速地从pojo发布服务;
l 支持spring、pico、plexus、loom等容器;
l 灵活的binding机制,包括默认的aegis,xmlbeans,jaxb2,castor;
l 高性能的soap 栈设计;
l 支持spring、pico、plexus、loom等容器。
xfire与axis1性能的比较如下:
l xfire比axis1.3快2-6倍;
l xfire的响应时间是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.1 ga。
三.开发步骤
1. 工程与环境的建立
在myeclipse中新建web工程,名为webservice_helloworld。选择该工程后,点击右键选择myeclipse->add web service capabilities,弹出add web service capabilities对话框,点击“next”,弹出project library configuration对话框,默认选择core libraries,点击“finish”按钮,完成xfire核心包的添加。为了后续的客户端的测试,还需读者加入commons-httpclient.jar包到web-inf/lib下。
部署后可看到此时web-inf/lib的jar包列表如下:
activation-1.1.jar、commons-beanutils-1.7.0.jar、commons-codec-1.3.jar、commons-httpclient.jar、commons-logging-1.0.4.jar、jaxen-1.1-beta-9.jar、jaxws-api-2.0.jar、jdom-1.0.jar、jsr173_api-1.0.jar、mail-1.4.jar、saaj-api-1.3.jar、saaj-impl-1.3.jar、spring-1.2.6.jar、stax-api-1.0.1.jar、wsdl4j-1.5.2.jar、wstx-asl-3.0.1.jar、xbean-2.1.0.jar、xbean-spring-2.5.jar、xfire-aegis-1.2.2.jar、xfire-annotations-1.2.2.jar、xfire-core-1.2.2.jar、xfire-java5-1.2.2.jar、xfire-jaxws-1.2.2.jar、xfire-jsr181-api-1.0-m1.jar、xfire-spring-1.2.2.jar、xmlschema-1.1.jar
为了后续的开发和测试,在src目录下分别建立test和webservice目录,分别用于存放测试文件和webservice的相关类。
2.web service实现的编写
在本例中,我们只是做一个helloworld的简单例子。web service服务端提供一个根据输入的名字信息回复相应的helloworld信息的。例如,当名字为“阿蜜果”时,恢复信息为“hello,阿蜜果”。下面让我们一步一步来开始进行编码。
1)web.xml的配置
一般情况下,我们通过http作为web service的传输协议,这样我们只需启动一个web服务器(如tomcat,在本例中使用的是tomcat5.5.20),这样客户端就可以通过http访问到web service服务。为了集成spring容器,xfire专门提供一个xfirespringservlet,我们可以在web.xml中配置该servlet,将spring容器中定义的web service在某个uri下发布。
为了能正确使用xfire,需在web.xml中进行相应配置,在该文件中配置xfire的servlet和servlet-mapping。同时因为本实例需要将xfire集成到spring中,因而需要在web.xml文件中加载spring的相应配置文件。在本实例中,我们首先在web-inf下建立两个配置spring配置文件,一个为applicationcontext.xml,该文件用来定义本工程的bean,一个为xfire-servlet.xml,用来配置xfire的相关bean。修改后的web.xml的内容如下所示:
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>xfireservicedisplay-name>
<context-param>
<param-name>contextconfiglocationparam-name>
<param-value>/web-inf/applicationcontext.xml,/web-inf/xfire-servlet.xmlparam-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>
<servlet>
<servlet-name>xfireservlet-name>
<servlet-class>org.springframework.web.servlet.dispatcherservletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>xfireservlet-name>
<url-pattern>*.wsurl-pattern>
servlet-mapping>
<servlet>
<servlet-name>xfireservletservlet-name>
<servlet-class>org.codehaus.xfire.spring.xfirespringservletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>xfireservletservlet-name>
<url-pattern>/service/*url-pattern>
servlet-mapping>
web-app>
2)web service的接口类helloworld.java和对应实现类helloworldimpl.java
为了用web service完成helloworld功能,我们首先在src/webservice目录下建立接口类hellowold.java。它仅包含一个sayhelloworld(string name)的方法,其详细内容如下:
package webservice;
/** *//**
*helloworld的接口类.
*/
publicinterface helloworld {
/** *//**
*对名字为name的人打招呼.
*@paramname名字
*@return返回打招呼的字符串
*/
string sayhelloworld(string name);
}
我们还需要建立一个对应的实现类,来实现sayhelloworld的功能,该实现类即为helloworldimpl.java。该类的详细内容如下:
package webservice;
/** *//**
*helloworld的实现类.
*/
publicclass helloworldimpl implements helloworld {
public string sayhelloworld(string name) {
string helloworld = "hello," name;
return helloworld;
}
}
3)spring配置文件applicationcontext.xml和xfire-servlet.xml的配置
首先我们在applicationcontext.xml文件中配置对应的bean——helloworldbean,该xml文件的内容如下:
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>
这个配置文件很简单,在此不详述。
xfire为spring提供了方便易用的导出器xfireexporter,借助该导出器的支持,我们可以在spring容器中将一个pojo导出为web service。helloworld是业务服务类,在此拥有一个sayhelloworld的方法,我们希望将此方法开放为web service。在实际应用中,如果某个类具有众多的方法,而其中的某些方法不需要开放为web service的情况下,我们可以定义一个窄接口,该接口中只需定义那些开放为web service的业务方法。
将一个业务类所有需要开放为web service的方法通过一个窄接口来描述是值得推荐的作法,这让web service的接口显得很“干净”。其次,xfire的导出器也需要服务接口的支持,因为它采用基于接口的动态代理技术。
窄接口中的方法在真实的系统中可能需要引用其它的业务类或dao获取数据库中的真实数据,为了简化实例,我们在此简化了实例。
下面让我们看看在xfire-servlet.xml文件中导出器的设置,该文件内容如下:
xml version="1.0" encoding="utf-8"?>
doctype beans public "-//spring//dtd bean//en"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<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>
<bean id="basewebservice" class="org.codehaus.xfire.spring.remoting.xfireexporter" lazy-init="false" abstract="true">
<property name="servicefactory" ref="xfire.servicefactory" />
<property name="xfire" ref="xfire" />
bean>
<bean id="helloworldservice" parent="basewebservice">
<property name="servicebean" ref="helloworldbean" />
<property name="serviceclass" value="webservice.helloworld" />
bean>
beans>
在上面的配置中,我们可以看到,在该配置文件中引入了xfire.xml这个spring配置文件。它是在xfire核心jar包中拥有一个预定义的spring配置文件,它定义了xfire在spring中必须用到的一些bean和资源,需要引入这个预定义的配置文件。从该配置文件中可以看出,我们通过xfireexporter将业务类导出为web service,对于任何导出器,我们都需要引入xfire环境,即servicefactory和xfire,这是标准的配置。servicefactory是xfire的核心类,它可以将一个pojo生成为一个web service。
在本实例中,我们通过定义一个basewebservice,其余的webservice配置都将该bean作为父bean,这样可以简化spring的配置,不需要多次引入servicefactory和xfire。
3. web service的测试
在上一步操作完成之后,我们的这个简单的web service已经编写完毕,下面让我们来看看自己的劳动成果吧。
在浏览器中输入地址:,我们可以看到helloworldservice对应的wsdl信息,阅读这个wsdl文档,我们可以知道helloworld的sayhelloworld方法已经被成功地发布为web service了。只要拿到这个wsdl就可以开发相应的客户端调用程序了。
xfire为访问服务端web service提供了各种方便的方式:我们一般根据服务地址和窄接口类创建客户调用程序。
在不能获得服务窄接口类的情况下,xfire允许我们通过wsdl文件生成客户端调用程序,通过指定服务接口的方式调用服务。
1)通过wsdl文件生成客户端调用程序
首先我们通过我们可以获得wsdl文件helloworldservice.wsdl,并将其放在src目录下面,接着我们通过程序访问该wsdl文件,并调用需测试的方法。此时测试类webserviceclienttest.java的内容如下所示:
package test;
import org.codehaus.xfire.client.client;
import org.springframework.core.io.classpathresource;
import org.springframework.core.io.resource;
import webservice.helloworld;
/** *//**
*凯发天生赢家一触即发官网 copyright2007guangzhouamigo.
*allrightreserved.
*helloworld的webservice的测试类.
*@authoramigoxie
*@version1.0
*creationdate:2007-9-16-下午05:36:05
*/
publicclass webserviceclienttest {
helloworld helloworld = null;
publicstaticvoid main(string[] args) throws exception {
webserviceclienttest test = new webserviceclienttest();
test.testclient();
}
publicvoid 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]);
}
}
运行该类,可得到如下输出结果:
result: hello,阿蜜果
可看出运行结果正确。
2)根据服务地址创建客户端调用程序
接着让我们来看一个根据服务地址创建客户端调用程序的例子。我们可以通过测试类来测试web service的正确性,下面让我们来看一个简单的测试类,首先我们在src/test目录建立webserviceclienttest.java文件,并在src目录下建立客户端调用的spring配置文件client.xml。在client.xml配置文件中我们定义了一个testwebservice的bean,该bean访问wsdldocumenturl为的wsdl。该xml文件的详细内容如下:
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.helloworldvalue>
property>
<property name="wsdldocumenturl">
<value>http://localhost:8080/webservice_helloworld/helloworldservice.ws?wsdlvalue>
property>
bean>
beans>
在webserviceclienttest.java文件中获得helloworld,并调用它的sayhelloworld方法来完成测试,该类的详细内容如下所示:
package test;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
import webservice.helloworld;
/** *//**
*helloworld的webservice的测试类.
*/
publicclass webserviceclienttest {
helloworld helloworld = null;
publicstaticvoid main(string[] args) {
webserviceclienttest test = new webserviceclienttest();
test.testclient();
}
publicvoid testclient() {
applicationcontext ctx = new classpathxmlapplicationcontext(
"client.xml");
helloworld = (helloworld) ctx.getbean("testwebservice");
system.out.println(helloworld.sayhelloworld("阿蜜果"));
}
}
在启动webservice_helloworld工程的情况下,运行webserviceclienttest类,可看到控制台包含如下信息:
hello,阿蜜果
由此可看出调用web service成功。
四.总结
与axis相比,在实施web service时xfire更加简洁高效,并且xfire对spring提供了强大的支持,可以非常方便地在spring中使用xfire实施web service,因此xfire在短短的时间里成为了受web service开发者喜爱的框架。
xfire为客户端提供了多种访问web service的方式,如果可以获取客户端的窄接口类,则可以采用窄接口类调用web service。如果仅能获取wsdl,xfire也可以采用动态反射的机制调用web service。xfire为eclipse提供了一个可以根据wsdl生成客户端存根代码的插件,相信xfire也将为其它非java语言提供类似的插件。
技术可用性的一个很大的标准是它是否方便测试,xfire提供多种方式进行web service的测试,简单方便,给web service开发人员的测试工作带来了福音。
在本文中,笔者通过一个简单的helloworld的web service例子,详细地说明了用xfire spring构建web service时配置文件的相关配置,以及测试的各种方法,也让读者见识了xfire与spring的无缝集成,希望对读者学习xfire有点帮助。
posted on 2007-09-26 09:39
阿蜜果 阅读(53336)
评论(70) 所属分类:
web service