备忘录

记录学习过、研究过、使用过和总结过的内容,以备不时之需

统计

留言簿(4)

积分与排名

其它

技术网站

牛人博客

阅读排行榜

评论排行榜

XFire入门教程(转)

XFire是新一代的Java Web服务引擎,XFire使得在JavaEE应用中发布Web服务变得轻而易举。和其他Web服务引擎相比,XFire的配置非常简单,可以非常容易地和Spring集成,它使得Java开发人员终于可以获得和.Net开发人员一样的开发效率。



由于使用了StAX(the Streaming API for XML,基于流的XML解析)作为XML解析器,XFire的运行速度又有了质的提高,并且XFire支持最新的JSR 181的Web服务注解。如果使用Java 5,只需要在源代码中编写相应的JSR 181注解,XFire就可以根据Java 5注解自动提取所需的全部信息。由于JSR 181也是JavaEE Web服务标准的一部分,使用它最大的好处在于不仅极大地简化了配置,而且避免了配置文件和某个特定的Web服务引擎的锁定

XFire
框架中,我们有两种方式将 POJO 发布成 Web 服务:

  • 一种方式是直接使用 Web 服务接口和 Web 服务实现类(POJO)来发布;
  • 另一种方式是基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务;

我们这次将采用第一种方式,并利用aegis进行绑定,将XML映射成POJO

1.    首先,我们在eclipse中建立一个xfiretest工程作为服务端,定义Web Service的接口

 1package test;
 2
 3import java.util.List;
 4
 5public interface IHelloService {
 6     public String sayHello(String ttt);
 7     
 8     public Course choose(User u);
 9     
10     public List  test(List t);
11 }

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


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

 1package test;
 2
 3import java.util.ArrayList;
 4import java.util.List;
 5
 6public 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 }

用到的UserCourse两个类的代码如下:

 1package test;
 2
 3public 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

 1package test;
 2
 3public class Course  {

Public 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 }

注意,这个javabean里必须要有一个默认没有参数的构造方法,否则在进行aegis绑定会有不能实例化对象的异常

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,其名字必须与web service的名字一致,而且要和其放在同一个包下,后缀是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相同的目录下面,否则会出错。

其中,method代表需要配置的方法名,由于XFire可以支持基本类型,针对集合类型时,需要配置,返回类型或参数类型为基本类型时不需要特殊配置。
<return-type/>
为配置返回类型,componentType属性代表返回的集合中所包含的类,此类可以是自定义的对象,也可以是基本类型,例如java.lang.String
index="0"代表方法的参数的序号,0即第一个参数。
componentType
代表集合参数内包含的类型,也可以为自定义对象,例如User
注意,如果有两个参数,一个比如为String,一个为集合,那么只需要配置集合参数即可。

比如还是上面的接口,第一个方法
 public Course choose(User u)
此时,返回类型为Course
如果Course中仅为基本类型,例如Stringint等基本类型,无需配置Course

但如果User中还包含有其他类型,比如包含有SetList,那么需要对其进行配置


5
、在Web.xml中配置XFire需要用到的ServletxFire发布文件

代码如下:

 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的服务端就开发完成了。

部署到tomcat中,在浏览器中运行http://localhost:8080/xfiretest/services/HelloService?wsdl

如果部署正确,讲出现XFire生成的wsdl文件


我们来看看客户端的代码吧(客户端代码编写有几种不同的方式),也很简单,如下:

 1package test;
 2
 3import java.net.MalformedURLException;
 4import java.util.ArrayList;
 5import java.util.List;
 6
 7import org.codehaus.xfire.XFireFactory;
 8import org.codehaus.xfire.client.XFireProxyFactory;
 9import org.codehaus.xfire.service.Service;
10import org.codehaus.xfire.service.binding.ObjectServiceFactory;
11
12public 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 }

posted on 2008-09-08 14:27 雪山飞狐 阅读(602) 评论(0)  编辑  收藏 所属分类: 开源框架