概述
XFire是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,帮助你方便快速地开发Web Service应用。XFixe内建在STAX的基础上之上,STAX是基于流的XML解析引擎,这使得XFire拥有很高的性能。
相对Axis来说,目前它的人气指数相当高,加上其提供了和String集成的支持,在目前的Web Service开源社区拥有众多的追随者,XFire被多个开源项目所使用。XFire为Spring提供了支持,这使得我们可以很容易在Spring中使用XFire构建Web Service应用。本文讲述了如何使用XFire在Spring中开发Web Service的具体过程。
XFire特性
XFire是Web Service框架的后起之秀,它从现有的框架中借鉴了许多优秀的理念,力争将Web Service的应用开发难度降到最低。此外,还提供了各种绑定技术、支持多种传输协议,对Web Service体系中许多新的规范提供了支持。简单来说,它具有以下一些特性:
XFire 体系及重要API
ServiceFactory是XFire的核心类,它可以将一个POJO生成为一个Web Service。让我们通过一个最简单的例子了解ServiceFactory的用途,假设我们在一个POJO中定义了一个业务,现在希望将其导出为 Web Service,通过ServiceFactory可以轻而易举地达到目的:
XFire xfire = XFireFactory.newInstance().getXFire();
ServiceFactory factory = new ObjectServiceFactory(xfire.getTransportManager(), null);
Service service = factory.create(YourService.class);
这样我们就为YourService类创建基于SOAP 1.1封装的Web Service。Service的输入输出参数如果为简单类型的对象(由String、int、long等基本类型组成),无须进行额外的映射设置,对于复杂类型的输入输出Service,XFire将会自动尝试将其序列化(通过Aegis绑定)。紧接着,你就可以注册这个Service。
xfire.getServiceRegistry().register(service);
XFire推荐通过一个接口开放服务,此时,你可以指定一个具体的实现类:
service.setProperty(ObjectInvoker.SERVICE_IMPL_CLASS, YourServiceImpl.class);
1.下载XFire所需要的包
2.建立服务端程序
建立一个名字为XFire的Web工程,导入ECLIPSE中自带的XFire的包,在classes的目录下建立META-INF/xfire/services.xml,修改web.xml文件。service.xml文件和web.xml文件的具体配置如下:
services.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>AccountService</name>
<namespace>http://test/AccountService</namespace>
<serviceClass>com.jobcn.AccountService</serviceClass>
<implementationClass>com.jobcn.AccountServiceImpl</implementationClass>
</service>
</beans>
namespace:这个名字可以随意定义,但必须唯一;
serviceClass:表示接口类;
implementationClass:表示实现接口的类;
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<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>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
<!--这个services以后要和你URL中的对应,注意这点,然后在下文中有介绍-->
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
开发完成后,部署到web服务器上,我用的是TOMCAT;
服务器开启后,输入的格式http://localhost:8080/部署的服务名/services/AccountService?wsdl
该URL组成是基本的服务器访问路径+部署的服务名(我的工程名是XFire)+url-pattern的名字(该名字就是上文提到的services)对应+services.xml文件中的name值(我的是AccountService)+?+wsdl
如果你在浏览器中看到的是一个XML形式的文件,那就表示你的WEBSERVICE服务发布成功了;
然后你将这个内容全部保存成一个以WSDL结尾的文件,保存到你本地的一个文件目录中,例如我保存在D:/accountservice.wsdl(对该文件你还要做相应的处理,因为从浏览器保存下来的文件中包含'-'等多余的字符,自己处理);
服务端服务代码:
接口类:
package com.jobcn;
public interface AccountService {
int getTotal(int a,int b);
}
实现类:
package com.jobcn;
public class AccountServiceImpl implements AccountService {
public int getTotal(int a, int b) {
// TODO Auto-generated method stub
return a+b;
}
}
客户端处理:
在EXCLIPSE中集成XFIRE插件,我们可以通过该插件来解析来自服务器端的wsdl文件,吧他还原成我们可以调用的类(该类只是服务器端的一个stub类)。插件的配置如下:
安装Eclipse XFire 插件
1.Help->Software Updates->Find and Install...
2.选择“Search for new features to install”,并点击Next;
3.选择“New Remote Site...”,创建一个Name为XFire,URL为
http://dist.codehaus.org/xfire/update/的网站;
4.点击Finish安装XFire插件。
图3创建客户端代码存根
指定WSDL文件的位置,存根代码的输出地址及对应的类包,点击Finish。
图4生成的代码
AccountServiceClient是 AccountServicePortType的工厂类,它提供了若干个获取AccountServicePortType实例的重载方法。 AccountServicePortType对应服务端的窄接口AccountService类。而AccountServiceImpl是服务端的存根代码,在META-INF中还有XFire的服务配置文件。对于客户端来说,一般不需要服务端的代码,所以你可以将AccountServiceImpl和META-INF删除。
,配置得到了服务器端的JAVA的STUB类以后,我们来写客户端的程序:
package com.test;
import test.accountservice.AccountServiceClient;
import test.accountservice.AccountServicePortType;
public class Client {
/**
* @param args
*/
private static String url = "http://127.0.0.1:8080/XFire/services/AccountService";
public static void main(String[] args) {
// TODO Auto-generated method stub
AccountServiceClient asc = new AccountServiceClient();
AccountServicePortType ast = asc.getAccountServiceHttpPort(url);
System.out.println(ast.getTotal(2, 3));//结果打出“5”
}
}
调用成功!