【IT168 技术文档】

网上关于XFire入门的教程不少,要么是讲得很简单,就像Hello World一样的程序,要么就是通过IDE集成的工具来开发的,这对于不同的人群有诸多不便,关于XFire的一些详细的信息就不再多讲,可以参考官方网站和相关的文档,这里讲一个完整的入门实例。

实例中包括三个情况,我想基本上可以概括所有的需求,或者自己稍加扩展即可。先来看看我们的Interface。

1 
 
package 
  test;
 
  2 
 

 
  3 
 
 
 import 
  java.util.List;
 
  4 
 

 
  5 
 
 
 public 
   
 interface 
  IHelloService  
 
 
 {
 6
    public String sayHello(String ttt);
 7
    
 8
    public Course choose(User u);
 9
    
10
    public List  test(List t);
11

} 这其中包含了简单对象的传递,对象的传递,List的传递。



具体的开发步骤如下:


1、定义Web Service的接口,代码见上面的接口定义。



2、实现接口和业务逻辑,代码如下:


1  
package   test;
   2 
 

   3 
 
  import 
  java.util.ArrayList;
   4 
 
  import 
  java.util.List;
   5 
 

   6 
 
  public 
   
 class 
  HelloServiceImpl  
 implements 
  IHelloService  
 
  {
 7

 8
    public String sayHello(String ttt) 
{
 9
        return "Hello, "+ttt;
10
    }
11
    
12
    public Course choose(User u)
{
13
        System.out.println(u.getName());
14
        Course c=new Course();
15
        c.setName("Eee");
16
        return c; 
17
        
18
    }
19
    
20
    public List  test(List t)
{
21
        for (int i = 0; i < t.size(); i++) 
{
22
            System.out.println((String) t.get(i));
23
        }
24
        List  al=new ArrayList();
25
        Course c=new Course();
26
        c.setName("EeeDDDDDD");
27
        al.add(c);
28
        return al;
29
        
30
    }
31

} 用到的User和Course两个类的代码如下:


1  
package   test;
   2  

   3  
  public    
 class 
  User  
 
  {
 4
    private String name;
 5

 6
    public String getName() 
{
 7
        return name;
 8
    }
 9

10
    public void setName(String name) 
{
11
        this.name = name;
12
    }
13
}  
  14



1  
package   test;
   2  

   3  
  public     class 
  Course   
 
  {
 4
    private String name;
 5

 6
    public String getName() 
{
 7
        return name;
 8
    }
 9

10
    public void setName(String name) 
{
11
        this.name = name;
12
    }
13

14
}

3、编写XFire要求的WebSevice定义描述文件,如下:


1  
<?  xml version="1.0" encoding="UTF-8"  ?>  
   2  
  <  beans   xmlns  ="http://xfire.codehaus.org/config/1.0" 
 > 
 
   3  

   4  
      <  service  >  
   5  
          <  name  >  HelloService 
 </ 
 name 
 > 
 
   6  
          <  namespace  >  http://test/HelloService 
 </ 
 namespace 
 > 
 
   7  
          <  serviceClass  >  test.IHelloService 
 </ 
 serviceClass 
 > 
 
   8  
          <  implementationClass  >  test.HelloServiceImpl 
 </ 
 implementationClass 
 > 
 
   9  
      </  service  >  
  10  
    
  11


</ beans > 此文件放在src/META-INF/xfire/services.xml,编译时会自动编译到classes的相应目录下面。



4、因为我们用到了List等集合类型,所以需要定义Mapping关系,文件名为:src/test/IHelloService.aegis.xml,代码如下:


1  
<?  xml version="1.0" encoding="UTF-8"  ?>  
  2  
  <  mappings  >  
  3  
      <  mapping  >  
  4  
          <  method   name  ="test"  > 
 
  5  
              <  parameter   index  ="0"   componentType 
 ="java.lang.String" 
   
 /> 
 
  6  
              <  return-type   componentType  ="test.Course"    
 /> 
 
  7  
          </  method  >  
  8  
      </  mapping  >  
  9


</ mappings > 请注意,此文件一定要放到与IHelloService.java相同的目录下面,否则会出错。



5、在Web.xml中配置XFire需要用到的Servlet,代码如下:


1  
<?  xml version="1.0" encoding="UTF-8"  ?>  
   2  
  <  web-app   version  ="2.4"   xmlns  ="http://java.sun.com/xml/ns/j2ee" 
 
   3  
    xmlns:xsi  ="http://www.w3.org/2001/XMLSchema-instance"  
   4  
    xsi:schemaLocation  ="http://java.sun.com/xml/ns/j2ee 
   5  
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
 >  
   6  

   7  
      <  servlet  >  
   8  
          <  servlet-name  >  XFireServlet  </  servlet-name 
 > 
 
   9  
          <  servlet-class  >  
  10  
            org.codehaus.xfire.transport.http.XFireConfigurableServlet
  11  
          </  servlet-class  >  
  12  
      </  servlet  >  
  13  

  14  
      <  servlet-mapping  >  
  15  
          <  servlet-name  >  XFireServlet  </  servlet-name 
 > 
 
  16  
          <  url-pattern  >  /servlet/XFireServlet/*  </  url-pattern 
 > 
 
  17  
      </  servlet-mapping  >  
  18  

  19  
      <  servlet-mapping  >  
  20  
          <  servlet-name  >  XFireServlet  </  servlet-name 
 > 
 
  21  
          <  url-pattern  >  /services/*  </  url-pattern 
 > 
 
  22  
      </  servlet-mapping  >  
  23  

  24  

  25  
      <  welcome-file-list  >  
  26  
          <  welcome-file  >  index.jsp  </  welcome-file 
 > 
 
  27  
      </  welcome-file-list  >  
  28  
  </  web-app  >




此时Web Service的服务端就开发完成了。


我们来看看客户端的代码吧,也很简单,如下:


1  
package   test;
   2  

   3  
  import   java.net.MalformedURLException;
   4  
  import   java.util.ArrayList;
   5  
  import   java.util.List;
   6  

   7  
  import   org.codehaus.xfire.XFireFactory;
   8  
  import   org.codehaus.xfire.client.XFireProxyFactory;
   9  
  import   org.codehaus.xfire.service.Service;
  10  
  import   org.codehaus.xfire.service.binding.ObjectServiceFactory;
  11  

  12  
  public     class   Client   
  {
13

14
    public static void main(String[] args) 
{
15

16
        Service srvcModel = new ObjectServiceFactory()
17
                .create(IHelloService.class);
18
        XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
19
                .newInstance().getXFire());
20

21
        String helloWorldURL = "http://localhost:8080/xfiretest/services/HelloService";
22
        try 
{
23
            IHelloService srvc = (IHelloService) factory.create(srvcModel,
24
                    helloWorldURL);
25
            System.out.println(srvc.sayHello("Robin"));
26
            
27
            User u=new User();
28
            u.setName("RRRRR");
29
            Course c=srvc.choose(u);
30
            System.out.println(c.getName());
31
            
32
            List  al=new ArrayList();
33
            al.add("1212");
34
            al.add("2222");
35
            List t=srvc.test(al);
36
            for (int i = 0; i < t.size(); i++) 
{
37
                Course co=(Course)t.get(i);
38
                System.out.println(co.getName());
39
            }
40
            
41
            
42
        } catch (MalformedURLException e) 
{
43
            e.printStackTrace();
44
        }
45

46
    }
47

48
}  
  49  
 

  1