﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Flying Kite                              不积跬步,无以至千里；不积小流,无以成江海. </title><link>http://www.blogjava.net/zhoujianghai/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 06:16:28 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 06:16:28 GMT</pubDate><ttl>60</ttl><item><title>xfire+spring2整合开发webservice</title><link>http://www.blogjava.net/zhoujianghai/archive/2009/07/30/289110.html</link><dc:creator>Flying Kite</dc:creator><author>Flying Kite</author><pubDate>Thu, 30 Jul 2009 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhoujianghai/archive/2009/07/30/289110.html</guid><wfw:comment>http://www.blogjava.net/zhoujianghai/comments/289110.html</wfw:comment><comments>http://www.blogjava.net/zhoujianghai/archive/2009/07/30/289110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoujianghai/comments/commentRss/289110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoujianghai/services/trackbacks/289110.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;开发工具是myeclipse7.1，服务器是tomcat6.0，，用的xfire1.2.6和Spring 2.0，虽然MyEclipse自带了开发xfire的插件，但为了不依赖开发工具和引用更新的包，所以建议手动创建。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 首先需要了解一下spring 、xfire 和webservice的概念：
<p style="text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: Arial"><span style="font-size: 14pt">Spring</span></span><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 9pt; color: black; font-family: 宋体">是目前最流行的</span><span style="font-size: 9pt; color: black; font-family: Arial">JavaEE Framework</span><span style="font-size: 9pt; color: black; font-family: 宋体">，但是使用</span><span style="font-size: 9pt; color: black; font-family: Arial">Spring</span><span style="font-size: 9pt; color: black; font-family: 宋体">的</span><span style="font-size: 9pt; color: black; font-family: Arial">Spring-WS</span><span style="font-size: 9pt; color: black; font-family: 宋体">开发</span><span style="font-size: 9pt; color: black; font-family: Arial">WebService</span><span style="font-size: 9pt; color: black; font-family: 宋体">却十分繁琐。</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">是一个简化</span><span style="font-size: 9pt; color: black; font-family: Arial">WebService</span><span style="font-size: 9pt; color: black; font-family: 宋体">开发的开源项目，通过</span><span style="font-size: 9pt; color: black; font-family: Arial">Spring</span><span style="font-size: 9pt; color: black; font-family: 宋体">和</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">的结合可以大大简化基于</span><span style="font-size: 9pt; color: black; font-family: Arial">Spring Framework</span><span style="font-size: 9pt; color: black; font-family: 宋体">的应用中的</span><span style="font-size: 9pt; color: black; font-family: Arial">WebService</span><span style="font-size: 9pt; color: black; font-family: 宋体">开发。</span></span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">是完全基于流数据处理进行工作的系统，这意味着</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">不是将整个</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">文档缓存在内存中，而是以管道的方式接收</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">流数据。这种工作方式的转变带来了可观的性能回报，同时节省了内存的占用。</span></span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 9pt; color: black; font-family: 宋体">对于习惯了</span><span style="font-size: 9pt; color: black; font-family: Arial">Axis</span><span style="font-size: 9pt; color: black; font-family: 宋体">、</span><span style="font-size: 9pt; color: black; font-family: Arial">GLUE</span><span style="font-size: 9pt; color: black; font-family: 宋体">等这些基于</span><span style="font-size: 9pt; color: black; font-family: Arial">DOM</span><span style="font-size: 9pt; color: black; font-family: 宋体">处理模型</span><span style="font-size: 9pt; color: black; font-family: Arial">Web Service</span><span style="font-size: 9pt; color: black; font-family: 宋体">框架的开发者来说，需要一些时间来适应这种转变。</span></span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">从管道中接收一个</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">请求到返回一个</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">响应，会经历一系列的阶段。在管道调用的任何一个阶段，</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">都可以添加一些额外的</span><span style="font-size: 9pt; color: black; font-family: Arial"> Handler</span><span style="font-size: 9pt; color: black; font-family: 宋体">，在对消息进行加工处理后再传入到下一个阶段中。图</span><span style="font-size: 9pt; color: black; font-family: Arial">1</span><span style="font-size: 9pt; color: black; font-family: 宋体">展示了</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">管道从接收</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">请求到返回</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">响应所经历的所有阶段：</span></span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 9pt; color: black; font-family: 宋体">图</span><span style="font-size: 9pt; color: black; font-family: Arial">1 XFire Web Service</span><span style="font-size: 9pt; color: black; font-family: 宋体">请求和响应的过程<img height="335" alt="" src="http://www.blogjava.net/images/blogjava_net/zhoujianghai/1.jpg" width="537" border="0" /><br />
</span></span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 9pt; color: black; font-family: 宋体">在</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">请求消息对</span><span style="font-size: 9pt; color: black; font-family: Arial">Web Service</span><span style="font-size: 9pt; color: black; font-family: 宋体">发起真正调用之前，分别会经过传输（</span><span style="font-size: 9pt; color: black; font-family: Arial">Transport</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、预转发（</span><span style="font-size: 9pt; color: black; font-family: Arial">PreDispatch</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、转发（</span><span style="font-size: 9pt; color: black; font-family: Arial">Dispatch</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、策略实施</span><span style="font-size: 9pt; color: black; font-family: 宋体">（</span><span style="font-size: 9pt; color: black; font-family: Arial">Policy</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、用户信息处理（</span><span style="font-size: 9pt; color: black; font-family: Arial">User</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、预调用（</span><span style="font-size: 9pt; color: black; font-family: Arial">PreInvoke</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、服务调用（</span><span style="font-size: 9pt; color: black; font-family: Arial">Service Invocation</span><span style="font-size: 9pt; color: black; font-family: 宋体">）等阶段。当，</span><span style="font-size: 9pt; color: black; font-family: Arial">Web Service</span><span style="font-size: 9pt; color: black; font-family: 宋体">调用后，</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">生成响应</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">消息并通过管道发送给客户端请求者，这一过程会先后经历调用后（</span><span style="font-size: 9pt; color: black; font-family: Arial">PostInvoke</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、用户信息处理</span><span style="font-size: 9pt; color: black; font-family: 宋体">（</span><span style="font-size: 9pt; color: black; font-family: Arial">User</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、策略实施（</span><span style="font-size: 9pt; color: black; font-family: Arial">Policy</span><span style="font-size: 9pt; color: black; font-family: 宋体">）、传输（</span><span style="font-size: 9pt; color: black; font-family: Arial">Transport</span><span style="font-size: 9pt; color: black; font-family: 宋体">）这四个阶段。每一个阶段都是一个可控点，通过编写并注册一些相应的</span><span style="font-size: 9pt; color: black; font-family: Arial">Handler</span><span style="font-size: 9pt; color: black; font-family: 宋体">就</span><span style="font-size: 9pt; color: black; font-family: 宋体">可以实施一些额外处理逻辑，如审计、</span><span style="font-size: 9pt; color: black; font-family: Arial">SOAP</span><span style="font-size: 9pt; color: black; font-family: 宋体">消息加密、签名、压缩等。</span></span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><strong><span style="font-size: 9pt; color: black; font-family: 宋体">将</span></strong><strong><span style="font-size: 9pt; color: black; font-family: Arial">POJO Bean</span></strong><strong><span style="font-size: 9pt; color: black; font-family: 宋体">导出为</span></strong><strong><span style="font-size: 9pt; color: black; font-family: Arial">Web Service</span></strong></span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 9pt; color: black; font-family: 宋体">通过</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">为</span><span style="font-size: 9pt; color: black; font-family: Arial">Spring</span><span style="font-size: 9pt; color: black; font-family: 宋体">提供的服务导出器可以轻松地将</span><span style="font-size: 9pt; color: black; font-family: Arial">POJO</span><span style="font-size: 9pt; color: black; font-family: 宋体">导出为标准的</span><span style="font-size: 9pt; color: black; font-family: Arial">Web Service</span><span style="font-size: 9pt; color: black; font-family: 宋体">，此外，</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">还允许我们使用</span><span style="font-size: 9pt; color: black; font-family: Arial">JSR 181</span><span style="font-size: 9pt; color: black; font-family: 宋体">注解对</span><span style="font-size: 9pt; color: black; font-family: Arial">POJO</span><span style="font-size: 9pt; color: black; font-family: 宋体">进行标注，无需使用</span><span style="font-size: 9pt; color: black; font-family: Arial">XML</span><span style="font-size: 9pt; color: black; font-family: 宋体">配置就可以导出为</span><span style="font-size: 9pt; color: black; font-family: Arial">Web Service</span><span style="font-size: 9pt; color: black; font-family: 宋体">，各种复杂的转换细节被巧妙地隐藏在</span><span style="font-size: 9pt; color: black; font-family: Arial">XFire</span><span style="font-size: 9pt; color: black; font-family: 宋体">之中。</span></span></p>
<span style="font-size: 9pt; color: black; font-family: Arial"><br />
<span style="font-size: 14pt">XFire</span></span><span style="font-size: 14pt; font-family: 宋体"><span style="font-size: 9pt; color: black; font-family: 宋体">可以很好的集成到</span><span style="font-size: 9pt; color: black; font-family: Arial">Spring</span><span style="font-size: 9pt; color: black; font-family: 宋体">中，</span><span style="font-size: 9pt; color: black; font-family: Arial">Spring</span><span style="font-size: 9pt; color: black; font-family: 宋体">的代码已经做了这方面的集成。<br />
</span><br />
<span style="font-size: 12pt">1、将xfire与spring的JAR包放到web 项目的classPath，（注意：把xfire自带的Spring1.2.6删掉，它会和spring2.0中的spring.jar产生冲突）<br />
2、修改web.xml，使其支持Spring 与xfire，内容如下：<br />
</span><span style="font-size: 10pt; font-family: 新宋体"><span style="font-size: 10pt"><span style="font-size: 12pt; font-family: 新宋体">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br style="font-family: " />
&lt;web-app version="2.5" <br style="font-family: " />
&nbsp;xmlns="http://java.sun.com/xml/ns/javaee" <br style="font-family: " />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <br style="font-family: " />
&nbsp;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee <br style="font-family: " />
&nbsp;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;<br style="font-family: " />
&nbsp;<br style="font-family: " />
&nbsp;&lt;context-param&gt;<br style="font-family: " />
&nbsp;&nbsp;&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br style="font-family: " />
&nbsp;&nbsp;&lt;param-value&gt;classpath:org/codehaus/xfire/spring/xfire.xml,<br style="font-family: " />
&nbsp;&nbsp;/WEB-INF/applicationContext-beans.xml<br style="font-family: " />
&nbsp;&nbsp;&lt;/param-value&gt;<br style="font-family: " />
&nbsp;&lt;/context-param&gt;<br style="font-family: " />
&nbsp;<br style="font-family: " />
&nbsp;&lt;servlet&gt;<br style="font-family: " />
&nbsp;&nbsp;&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;<br style="font-family: " />
&nbsp;&nbsp;&lt;servlet-class&gt;org.codehaus.xfire.spring.XFireSpringServlet&lt;/servlet-class&gt;<br style="font-family: " />
&nbsp;&lt;/servlet&gt;<br style="font-family: " />
&nbsp;<br style="font-family: " />
&nbsp;&lt;servlet-mapping&gt;<br style="font-family: " />
&nbsp;&nbsp;&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;<br style="font-family: " />
&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br style="font-family: " />
&nbsp;&lt;/servlet-mapping&gt;<br style="font-family: " />
&nbsp;<br style="font-family: " />
&nbsp;&lt;listener&gt;<br style="font-family: " />
&nbsp;&nbsp;&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br style="font-family: " />
&nbsp;&lt;/listener&gt;<br style="font-family: " />
&nbsp;<br style="font-family: " />
&nbsp; &lt;welcome-file-list&gt;<br style="font-family: " />
&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br style="font-family: " />
&nbsp; &lt;/welcome-file-list&gt;<br style="font-family: " />
&lt;/web-app&gt;</span></span><br style="font-family: " />
</span><br />
</span>3、配置（spring）applicationContext.xml<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
<p><br />
&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:aop="http://www.springframework.org/schema/aop"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:tx="http://www.springframework.org/schema/tx"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="mathService" class="com.zjh.manager.MathServiceImpl" /&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="mathExporters" class="org.codehaus.xfire.spring.remoting.XFireExporter"&gt;<br />
&nbsp;&nbsp;&lt;property name="serviceFactory" ref="xfire.serviceFactory" /&gt;<br />
&nbsp;&nbsp;&lt;property name="xfire" ref="xfire" /&gt;<br />
&nbsp;&nbsp;&lt;property name="serviceBean" ref="mathService" /&gt;<br />
&nbsp;&nbsp;&lt;property name="serviceClass" value="com.zjh.manager.MathService" /&gt;<br />
&nbsp;&nbsp;&lt;property name="name" value="mathWebService" /&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&lt;/beans&gt;<br />
</p>
<br />
4、创建一个接口和一个实现类<br />
<p>package com.zjh.manager;</p>
<p>public interface MathService {</p>
<p>&nbsp;public String add(int a,int b);<br />
}<br />
<br />
</p>
<p>package com.zjh.manager;</p>
<p>public class MathServiceImpl implements MathService {</p>
<p>&nbsp;public String add(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long result = a+b;<br />
&nbsp;&nbsp;return "计算的结果:"&nbsp; + result;<br />
&nbsp;}</p>
<p>}<br />
</p>
<p><br />
这样便生成一个web Service，可以通过域名 <a href="http://localhost:8080/testwebservice_server/services/mathWebService?wsdl">http://localhost:8080/testwebservice_server/services/mathWebService?wsdl</a>&nbsp;&nbsp;&nbsp;&nbsp; 来访问，并编写客户端代码了<br />
</p>
<img src ="http://www.blogjava.net/zhoujianghai/aggbug/289110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoujianghai/" target="_blank">Flying Kite</a> 2009-07-30 14:24 <a href="http://www.blogjava.net/zhoujianghai/archive/2009/07/30/289110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>