使用xfire发布WebService


1. 下载xfire-all.jar(可以去这里http://repository.codehaus.org/org/codehaus/xfire/下载)和其依赖包,放到classpath下。 

2. 新建一个工程HelloWebService(我用的是MyEclipse6.0+Tomcat5.5,注意尽量不要用MyEclipse自带的“创建WebService工程”功能)。 
3. 创建一个Interface ,名称是IHelloService,其内容如下: 
        package com.lawrenst.service; 

        public interface IHelloService{ 

       public String sayHello(String name); 

        } 
    并创建其实现类,HelloServiceImpl,内容如下, 
        package com.lawrenst.service; 

        public class HelloServiceImplimplements IHelloService{ 

        public String sayHello(String name) { 
     return "Hello "+name; 
        } 
        } 
    由于代码比较简单,就不写注释了。 

4.  在src下建立一个文件夹,META-INF(注意大小写),在META-INF下建立一个xfire文件夹,在xfire中建立services.xml文件。(真啰嗦),其内容如下: 
<beans xmlns="http://xfire.codehaus.org/config/1.0"> 
<service> 
<name>HelloService</name> 
                <!-- 
<namespace> 
http://oe-way.com/BookService 
</namespace> 
--> 
               <!-- 接口--> 
               <serviceClass>com.lawrenst.service.IHelloService</serviceClass> 

               <!--  接口的实现类--> 
               <implementationClass> 
test.risesoft.BookServiceImpl 
</implementationClass> 

                <properties> 
<property key="mtom-enabled">true</property> 
</properties> 

<style>wrapped</style> 
<use>literal</use> 
<scope>application</scope> 
</service> 
</beans> 

5. 在web.xml中配置上xfire 
      <servlet> 
<servlet-name>XFireServlet</servlet-name> 
<servlet-class> 
org.codehaus.xfire.transport.http.XFireConfigurableServlet 
</servlet-class> 
</servlet> 

<servlet-mapping> 
<servlet-name>XFireServlet</servlet-name> 
<url-pattern>/services/*</url-pattern> 
</servlet-mapping> 

6.   访问 http://localhost:8080/HelloWebService/services/HelloService?wsdl 
     好了页面出现了,至此,你的第一个WebService发布成功了。 
7.   编写客户端程序 
     在这里,我介绍两种方式,第一种是纯POJO方式,第二种是动态方式 
     第一种:纯POJO方式 
     package com.lawrenst.test; 

     import java.net.MalformedURLException; 
     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 com.lawrenst.service.IHelloService; 

     public class TestClient { 

public static void main(String args[]) 

Service serviceModel=new ObjectServiceFactory().create(IHelloService.class); 
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire()); 
String url="http://localhost:8080/HelloWebService/services/HelloService"; 
try { 
IHelloService service=(IHelloService) factory.create(serviceModel, url); 

//测试sayHello方法 
System.out.println(service.sayHello("lawrenst")); 
} catch (MalformedURLException e) { 
e.printStackTrace(); 




ok,看看你的控制台,是不是出现了预期的东西。 

  第二种:动态方式(动态模式不需要服务端的class,不过性能和复杂对象映射等估计做得不会太好。) 
Client client = new Client(new URL 
          ("http://localhost;8080/HelloWebService/services/HelloService?WSDL")); 

Object[] results = client.invoke("sayHello", new Object[] {"lawrenst"}); 
System.out.println(results[0]); 

  ok,到此,一切正常,结束。 


上面内容写了简单的操作基本类型的应用,这次写的是复杂类型的,包括返回值是List ,Map,以及自定义对象等。 

1.  在上面所建立的工程基础上,修改IHelloService,增加两个方法: 
public Course choose(Student student); 
public List  test(List temp); 

同时修改其实现类HelloService,内容如下: 
public Course choose(Student student) { 
System.out.println(student.getName()); 

Course course=new Course(); 
course.setCourseName("Computer Science"); 

return course; 


public List test(List temp) { 

for(int i=0;i<temp.size();i++) 

System.out.println(temp.get(i)); 


List temp2=new ArrayList(); 

Course course1=new Course(); 
course1.setCourseName("English"); 
temp2.add(course1); 

Course course2=new Course(); 
course2.setCourseName("Art"); 
temp2.add(course2); 

return temp2; 


2.  建立两个类,内容分别如下: 
package com.lawrenst.pojo; 

public class Course { 

private String courseName; 

public String getCourseName() { 
return courseName; 


public void setCourseName(String courseName) { 
this.courseName = courseName; 




package com.lawrenst.pojo; 

public class Student{ 

private String name; 

public String getName() { 
return name; 


public void setName(String name) { 
this.name = name; 




代码很简单吧,不用我解释吧? 

3.  启动服务器,并访问wsdl文件,出现了什么?出现了异常,大概是什么什么为空。 

xfire默认是Aegis绑定,需要建立一个XXX.aegis.xml文件,让xfire知道test方法中的参数和返回对象是什么类型的。 

建立IHelloService.aegis.xml,注意,必须是和接口名称相同,并且和IHelloService在相同目录下。内容如下: 
<?xml version="1.0" encoding="UTF-8"?> 
<mappings> 
    <mapping> 
        <method name="test"> 
            <parameter componentType="java.lang.String" /> 
            <return-type componentType="com.lawrenst.pojo.Course" /> 
        </method> 
    </mapping> 
</mappings> 

好了,重启服务器,wsdl文件能够正常显示了。 

4.  同样建立客户端(这里我使用的是纯POJO方式,动态方式我没有找到解决的办法,如果哪位高手找到了解决的办法,可以给我留言) 

package com.lawrenst.test; 

import java.net.MalformedURLException; 
import java.util.ArrayList; 
import java.util.List; 

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 com.lawrenst.pojo.Course; 
import com.lawrenst.pojo.Student; 
import com.lawrenst.service.IHelloService; 

public class TestClient { 

public static void main(String args[]) 

Service serviceModel=new ObjectServiceFactory().create(IHelloService.class); 
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory. 
newInstance().getXFire()); 
String url="http://localhost:8080/Xfire/services/HelloService"; 

try { 
IHelloService service=(IHelloService) factory.create(serviceModel, url); 

//测试sayHello方法 
System.out.println(service.sayHello("lawrenst")); 

//测试choose方法 
Student student=new Student (); 
student.setName("jijingping"); 
Course course=service.choose(student); 
System.out.println(course.getCourseName()); 

//测试test方法 
List temp=new ArrayList();//给test方法传递的参数 
temp.add("wangxiaosen"); 
temp.add("wangxinlei"); 
temp.add("wangye"); 
List t=service.test(temp); 

for(int i=0;i<t.size();i++) 

Course c=t.get(i); 
System.out.println(c.getCourseName()); 


} catch (MalformedURLException e) { 
e.printStackTrace(); 





好了 再次成功了,看看服务器端和客户端是不是打印出了相应的东西?

你可能感兴趣的:(使用xfire发布WebService)