一、先看目录结构。
-xfire
   +src
   -war
      -WEB-INF
         +class
         +lib
二、再看\xfire\war\WEB-INF\build.xml和build.properties。
build.xml  

<? xml version="1.0" ?>
< project  name ="xfire"  basedir ="."  default ="usage" >
    
< property  file ="build.properties" />
    
< property  name ="src.dir"  value ="src" />
    
<!-- <property name="lib.dir" value="lib"/> -->
    
< property  name ="web.dir"  value ="war" />
    
< property  name ="build.dir"  value ="${web.dir}/WEB-INF/classes" />
    
< property  name ="name"  value ="xfire" />

    
< path  id ="master-classpath" >
                
<!--
        <fileset dir="${lib.dir}">
            <include name="*.jar"/>
        </fileset>
                
-->
        
< fileset  dir ="${web.dir}/WEB-INF/lib" >
            
< include  name ="*.jar" />
        
</ fileset >
        
<!--  We need the servlet API classes:         -->
        
<!--    for Tomcat 4.1 use servlet.jar         -->
        
<!--    for Tomcat 5.0 use servlet-api.jar     -->
        
<!--    for Other app server - check the docs  -->

        
< pathelement  path ="${build.dir}" />
    
</ path >
    
< target  name ="usage" >
        
< echo  message ="" />
        
< echo  message ="${name} build file" />
        
< echo  message ="-----------------------------------" />
        
< echo  message ="" />
        
< echo  message ="Available targets are:" />
        
< echo  message ="" />
        
< echo  message ="build     --> Build the application" />
        
< echo  message ="junit     --> Junit Test" />
        
< echo  message ="deploy    --> Deploy application as directory" />
        
< echo  message ="deploywar --> Deploy application as a WAR file" />
        
< echo  message ="install   --> Install application in Tomcat" />
        
< echo  message ="reload    --> Reload application in Tomcat" />
        
< echo  message ="start     --> Start Tomcat application" />
        
< echo  message ="stop      --> Stop Tomcat application" />
        
< echo  message ="list      --> List Tomcat applications" />
        
< echo  message ="" />
    
</ target >
    
< target  name ="build"  description ="Compile main source tree java files" >
        
< mkdir  dir ="${build.dir}" />
        
< javac  destdir ="${build.dir}"  target ="1.4"  debug ="true"  source ="1.4"
               deprecation
="false"  optimize ="false"  failonerror ="true"  encoding ="GBK" >
            
< src  path ="${src.dir}" />
            
<!-- <compilerarg value="-Xlint:unchecked" /> -->
            
< classpath  refid ="master-classpath" />
        
</ javac >
    
</ target >
    
< target  name ="deploy"  depends ="build"  description ="Deploy application" >
        
< copy  todir ="${deploy.path}/${name}"  preservelastmodified ="true" >
            
< fileset  dir ="${web.dir}" >
                
< include  name ="**/*.*" />
            
</ fileset >
        
</ copy >
    
</ target >
    
< target  name ="deploywar"  depends ="build"  description ="Deploy application as a WAR file" >
        
< war  destfile ="${name}.war"
             webxml
="${web.dir}/WEB-INF/web.xml" >
            
< fileset  dir ="${web.dir}" >
                
< include  name ="**/*.*" />
            
</ fileset >
        
</ war >
        
< copy  todir ="${deploy.path}"  preservelastmodified ="true" >
            
< fileset  dir ="." >
                
< include  name ="*.war" />
            
</ fileset >
        
</ copy >
    
</ target >

< target  name ="clean"  description ="Clean output directories" >
        
< delete >
            
< fileset  dir ="${build.dir}" >
                
< include  name ="**/*.class" />
            
</ fileset >
        
</ delete >
    
</ target >
 
    
< target  name ="undeploy"  description ="Un-Deploy application" >
        
< delete >
            
< fileset  dir ="${deploy.path}/${name}" >
                
< include  name ="**/*.*" />
            
</ fileset >
        
</ delete >
    
</ target >

< target  name ="junit"  depends ="build"  description ="Run JUnit Tests" >
        
< junit  printsummary ="on"
               fork
="false"
               haltonfailure
="false"
               failureproperty
="tests.failed"
               showoutput
="false" >
            
< classpath  refid ="master-classpath" />
            
< formatter  type ="brief"  usefile ="false" />
 
            
< batchtest >
                
< fileset  dir ="${build.dir}" >
                    
< include  name ="**/Test*.*" />
                
</ fileset >
            
</ batchtest >
 
        
</ junit >
 
        
< fail  if ="tests.failed" >
        tests.failed=${tests.failed}
        ***********************************************************
        ***********************************************************
        ****  One or more tests failed!  Check the output   ****
        ***********************************************************
        ***********************************************************
        
</ fail >
    
</ target >

    
< target  name ="Junitdatabase"  depends ="build"  description ="Run JUnit Tests" >
            
< junit  printsummary ="on"
                   fork
="false"
                   haltonfailure
="false"
                   failureproperty
="tests.failed"
                   showoutput
="true" >
                
< classpath  refid ="master-classpath" />
                
< formatter  type ="brief"  usefile ="false" />

                
< batchtest >
                    
< fileset  dir ="${build.dir}" >
                        
< include  name ="**/TestC*.*" />
                    
</ fileset >
                
</ batchtest >

            
</ junit >

            
< fail  if ="tests.failed" >
            ***********************************************************
            ***********************************************************
            ****  One or more tests failed!  Check the output   ****
            ***********************************************************
            ***********************************************************
            
</ fail >
        
</ target >     
    
<!--  ==============================================================  -->
<!--  Tomcat tasks - remove these if you don't have Tomcat installed  -->
<!--  ==============================================================  -->
    
< taskdef  name ="install"  classname ="org.apache.catalina.ant.InstallTask" >
        
< classpath >
            
< path  location ="${appserver.home}/server/lib/catalina-ant.jar" />
        
</ classpath >
    
</ taskdef >
    
< taskdef  name ="reload"  classname ="org.apache.catalina.ant.ReloadTask" >
        
< classpath >
            
< path  location ="${appserver.home}/server/lib/catalina-ant.jar" />
        
</ classpath >
    
</ taskdef >
    
< taskdef  name ="list"  classname ="org.apache.catalina.ant.ListTask" >
        
< classpath >
            
< path  location ="${appserver.home}/server/lib/catalina-ant.jar" />
        
</ classpath >
    
</ taskdef >
    
    
< taskdef  name ="start"  classname ="org.apache.catalina.ant.StartTask" >
        
< classpath >
            
< path  location ="${appserver.home}/server/lib/catalina-ant.jar" />
        
</ classpath >
    
</ taskdef >
    
    
< taskdef  name ="stop"  classname ="org.apache.catalina.ant.StopTask" >
        
< classpath >
            
< path  location ="${appserver.home}/server/lib/catalina-ant.jar" />
        
</ classpath >
    
</ taskdef >
    
    
< taskdef  name ="reload"  classname ="org.apache.catalina.ant.ReloadTask" >
        
< classpath >
            
< path  location ="${appserver.home}/server/lib/catalina-ant.jar" />
        
</ classpath >
    
</ taskdef >

    
< target  name ="install"  description ="Install application in Tomcat" >
        
< install  url ="${tomcat.manager.url}"
                 username
="${tomcat.manager.username}"
                 password
="${tomcat.manager.password}"
                 path
="/${name}"
                 war
="${name}" />
    
</ target >
    
< target  name ="reload"  description ="Reload application in Tomcat" >
        
< reload  url ="${tomcat.manager.url}"
                 username
="${tomcat.manager.username}"
                 password
="${tomcat.manager.password}"
                 path
="/${name}" />
    
</ target >
    
< target  name ="start"  description ="Start Tomcat application" >
        
< start  url ="${tomcat.manager.url}"
                 username
="${tomcat.manager.username}"
                 password
="${tomcat.manager.password}"
                 path
="/${name}" />
    
</ target >
    
< target  name ="stop"  description ="Stop Tomcat application" >
        
< stop  url ="${tomcat.manager.url}"
                 username
="${tomcat.manager.username}"
                 password
="${tomcat.manager.password}"
                 path
="/${name}" />
    
</ target >
    
< target  name ="list"  description ="List Tomcat applications" >
        
< list  url ="${tomcat.manager.url}"
                 username
="${tomcat.manager.username}"
                 password
="${tomcat.manager.password}" />
    
</ target >
<!--  End Tomcat tasks  -->
</ project >
build.properties
# Ant properties for building the springapp
appserver.home=d:/java/tomcat528
deploy.path=${appserver.home}/webapps
tomcat.manager.url=http://localhost:8082/manager
tomcat.manager.username=admin
tomcat.manager.password=admin

二、看web.xml,applicationContext.xml和xfire-servlet.xml
web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app 
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd"
>

<web-app>

    
<context-param>
        
<param-name>contextConfigLocation</param-name>
        
<param-value>
            /WEB-INF/applicationContext.xml
            classpath:org/codehaus/xfire/spring/xfire.xml
        
</param-value>
    
</context-param>

    
<context-param>
        
<param-name>log4jConfigLocation</param-name>
        
<param-value>/WEB-INF/log4j.properties</param-value>
    
</context-param>

    
<listener>
        
<listener-class>
            org.springframework.web.util.Log4jConfigListener
        
</listener-class>
    
</listener>

    
<listener>
        
<listener-class>
            org.springframework.web.context.ContextLoaderListener
        
</listener-class>
    
</listener>

    
<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>/services/*</url-pattern>
    
</servlet-mapping>

</web-app>

applicationContext.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="mathBean" class="org.xfire.bnbn.service.MathServiceImpl"/> 
</beans>

xfire-servelt.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 class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
        
<property name="urlMap"> 
            
<map> 
                
<entry key="/MathService"> 
                    
<ref bean="math"/> 
                
</entry> 
            
</map> 
        
</property> 
   
</bean> 

    
<bean id="math" class="org.codehaus.xfire.spring.remoting.XFireExporter"> 
       
<property name="serviceFactory"> 
           
<ref bean="xfire.serviceFactory"/> 
       
</property> 
       
<property name="xfire"> 
           
<ref bean="xfire"/> 
       
</property> 
        
<property name="serviceBean"> 
           
<ref bean="mathBean"/> 
        
</property> 
        
<property name="serviceClass"> 
            
<value>org.xfire.bnbn.service.MathService</value> 
        
</property> 
   
</bean> 

</beans>

三、看service类,xfire对外都是开放接口,也只能是接口。

package org.xfire.bnbn.service;


public interface MathService {

    public long add(int p1, int p2);
    


package org.xfire.bnbn.service;


public class MathServiceImpl implements MathService {

    public long add(int p1, int p2) {

        return p1 + p2;

    }

}

好到这里service配制好了,在cmd目录\xfire下运行ant build命令,编译class。然后在浏览器中运行http://localhost:8082/xfire/services/MathService?wsdl就可以看到xfire自动生成的wsdl了。

四、再写client吧,先看application-client.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="Client_Params" class="org.xfire.bnbn.client.ClientParams">
  
<property name="訪問地址">
   
<value>http://localhost:8082/xfire/services/MathService</value>
  
</property>
  
<property name="輸入字符串">
   
<value>1234567890ABCDEFG XFIRE與SPRING集成成功! </value>
  
</property>
  
<property name="paramentA">
   
<value>400</value>
  
</property>
  
<property name="paramentB">
   
<value>200</value>
  
</property>
 
</bean>
</beans>

再看client类

package org.xfire.bnbn.client;


public class ClientParams {
    private String 訪問地址 = null;

    private String 輸入字符串 = null;

    private int paramentA = 0;

    private int paramentB = 0;

    public int getParamentB() {
        return paramentB;
    }

    public void setParamentB(int paramentB) {
        this.paramentB = paramentB;
    }

    public String get訪問地址() {
        return 訪問地址;
    }

    public void set訪問地址(String 訪問地址) {
        this.訪問地址 = 訪問地址;
    }

    public String get輸入字符串() {
        return 輸入字符串;
    }

    public void set輸入字符串(String 輸入字符串) {
        this.輸入字符串 = 輸入字符串;
    }

    public int getParamentA() {
        return paramentA;
    }

    public void setParamentA(int paramentA) {
        this.paramentA = paramentA;
    }
}

再看test class

package org.xfire.bnbn.test;

import java.net.MalformedURLException;

import junit.framework.TestCase;

import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.xfire.bnbn.client.ClientParams;
import org.xfire.bnbn.service.MathService;

public class TestMathService extends TestCase{
    public void testMath() {
        ApplicationContext ctx = new FileSystemXmlApplicationContext(
                "war/WEB-INF/applicationContext-client.xml");
        ClientParams cp = (ClientParams) ctx.getBean("Client_Params");
        int paramentA = cp.getParamentA();
        int paramentB = cp.getParamentB();

        Service srvcModel = new ObjectServiceFactory()
                .create(MathService.class);
        XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
                .newInstance().getXFire());
        String url = cp.get訪問地址();
        try {
            MathService srvc = (MathService) factory.create(srvcModel, url);
            assertEquals(srvc.add(paramentA, paramentB), 600);
            
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

}

到此client的Spring运行设置完毕,再运行ant build命令,编译完成再运行ant junit命令,如果没出错,则说明Service和client通信正常。

五、运行环境:jdk1.4.2、tomcat5.0.2.8、spring2.0、xfire1.2.5。把xfire-1.2.5下的xfire-all-1.2.5.jar和lib下的所有包放到项目xfire的web-inf/lib下。

六、可以把作几个批处理文件来运行编译,测试。
tb.bat :
      ant build
tu.bat : 
      ant junit
tu.bat : 
      ant junit
tdeploy.bat : 
      ant deploy
treload.bat : 
      ant reload
tstart.bat : 
      ant start
tu.stop : 
      ant stop
tbr.bat : 
      call tb.bat 
      call tstop.bat 
      call tstart.bat
tailstdout.bat : 
      tail -f D:\java\Tomcat528\logs\stdout.log
td.bat : 
      call tdeploy.bat 
      rem call tstop.bat 
      rem call tstart.bat
tdrr.bat : 
      call tdeploy.bat 
      call tstop.bat 
      call tstart.bat
tr.bat : 
      rem call tstop.bat 
      rem call tstart.bat 
      call treload.bat