XFire 是codeHaus 组织提供的一个开源框架,它构建了POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。
XFire 目前最新的版本是 1.2.6,目前支持的特性主要有:
l Support for important Web Service standards - SOAP, WSDL, WS-I Basic Profile, WS-Addressing, WS-Security, etc.
l High performance SOAP Stack Pluggable bindings POJOs, XMLBeans, JAXB 1.1, JAXB 2.0, and Castor support
l JSR 181 API to configure services via Java 5 and 1.4 (Commons attributes JSR 181 syntax)
l Support for many different transports - HTTP, JMS, XMPP, In-JVM, etc.
l Embeddable and Intuitive API
l Spring, Pico, Plexus, and Loom support.
l JBI Support
l Client and server stub generation
l JAX-WS early access support
1. XFire之下载
XFire 的官网是XFire.codehaus.org,进入主页后,在右侧找到Download链接,点击进入下载页面。最新版本1.2.6下有四个链接,选择第一个xfire-distribution-1.2.6.zip下载。
下载解压后的目录结构如下
各目录和文件对应的说明如下:
(1) api : XFire类库的api文档
(2) examples : XFire示例源码
(3) lib : XFire所依赖的jar包,不必导入所有,根据项目需要取舍
(4) manual : XFire帮助文档
(5) modules : 根据XFire不同特性而分的不同jar包
(6) xfire-all-1.2.6.jar: XFire完整jar包
2. XFire之HelloWorld
以下用XFire做一个简单的HelloWorld示例。详细步骤如下:
1) 新建一web工程,命名为xfire;
2) 将XFire下载解压后的xfire-all-1.2.6.jar包和lib下所有的jar包copy到工程的lib目录下,同时在网上单独下载一个xalan包。如果大家以前做项目用过xalan包,也可直接copy过来。
3) 在web.xml中加入:
<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> </servlet-mapping>
4) 新增一个接口和接口的实现类:
接口代码如下:
public interface HelloWorldService { public String sayHello(); }
接口实现类如下:
public class HelloWorldServiceImpl implements HelloWorldService { public String sayHello() { System.out.println("Hello World !"); return "Hello World!"; } }
5) 在src下新建一名称为META-INF的Folder,再在META-INF下新建名称为xfire的Folder,最后在xfire下新建services.xml文件,services.xml文件内容如下:
<beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>HelloWorldService</name> <namespace>http://127.0.0.1/xfire/HelloWorldService</namespace> <serviceClass>com.HelloWorldService</serviceClass> <implementationClass>com.HelloWorldServiceImpl</implementationClass> </service> </beans>
services.xml的各标签作用如下:
service: service标签和它所包含的xml内容为发布成 Web 服务的 POJO 提供完整的描述。
name: Web服务被发布时所采用的唯一名称。
namespace: Web 服务发布时所使用的命名空间。
serviceClass: Web 服务接口类的全名,包括包名和类名。
implemetationClass: Web 服务实现类的全名,包括包名和类名。
6) 在浏览器的url栏里输入
http://localhost:9999/xfire/services/HelloWorldService?wsdl,如果一切正常,则会返回如下页面:
说明:这里用的是tomcat服务器,若未安装,请自行安装一下。
3. XFire之客户端的生成
客户端生成方式有好几种,在此只列两种方式:一种是通过WSDL创建一个动态的客户端,另一种是使用ANT工具通过WSDL生成一个客户端。以下是两种方式的具体应用介绍。
1) 动态客户端
public class Test { public static void main(String[] args) throws MalformedURLException, Exception { long start = System.currentTimeMillis(); Client client = new Client(new URL( "http://localhost:9999/xfire/services/HelloWorldService?wsdl")); Object[] results = client.invoke("sayHello", new Object[]{}); System.out.println("调用共花了" + (System.currentTimeMillis()-start) + "毫秒"); System.out.println(results[0]); } }
此种方式只需知道wsdl地址,方法名和方法需用要的参数就可以了。
2) Ant生成客户端
新建一Java工程,在工程下新建一名称为com的包,再在工程的根目录下新建build.xml, build.xml文件的具体内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project default="genfiles" basedir="."> <property name="lib" value="WebRoot/WEB-INF/lib" /> <path id="myclasspath"> <fileset dir="${lib}"> <include name="*.jar"/> </fileset> <pathelement location="${genfiles}"/> </path> <property name="code_path" value="src"/> <property name="wsdl_path" value="http://localhost:9999/xfire/services/HelloWorldService?wsdl"/> <property name="code_package" value="com"/> <target name="genfiles" description="Generate the files"> <echo>生成xfire的客户端</echo> <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="myclasspath"/> <wsgen outputDirectory="${code_path}" wsdl="${wsdl_path}" package="${code_package}" binding="xmlbeans" overwrite="true"/> </target </project>
最后执行Ant build,执行成功后,新建一HelloWorldTest类,具体内容如下:
public class HelloWorldTest { public static void main(String[] args) { HelloWorldServiceClient client = new HelloWorldServiceClient(); HelloWorldServicePortType service = client.getHelloWorldServiceHttpPort(); String result = service.sayHello(); System.out.println("结果: " + result); } }
参考资料:
1. XFire 的官方资料
2. 肖菁:XFire 入门
http://www.ibm.com/developerworks/cn/java/j-lo-XFire/