XFire 开发webservice的全过程

概述

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体系中许多新的规范提供了支持。简单来说,它具有以下一些特性:

  • 支持重要的Web Service规范,如SOAP、WSDL、WS-I Basic Profile,、WS-Addressing、WS-Security等;
  • 高性能的SOAP 栈设计;
  • 可插拔的绑定,支持POJO、XMLBeans、JAXB1.1、JAXB2以及Castor;
  • 支持JSR 181规范,该规范通过JDK 5.0注解将POJO导出为Web Service;
  • 支持多种传输协议:HTTP、JMS、XMPP、In-JVM等,其中In-JVM允许我们在不启动Web应用器的情况下,象一般的程序一样测试Web Service应用;
  • 易用的API,XFire API简洁明了,便于使用;
  • 支持Spring、Pico、Plexus、Loom等容器;
  • 支持JBI(Java Business Integration:Java 业务整合)规范,JBI是JSR 208的实现;
  • 能够根据WSDL创建客户端和服务器端的存根代码;
  • 率先对JAX-WS提供了支持,JAX-WS是JAX-RPC的替代者。

XFire 体系及重要API

ServiceFactory

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插件。

使用插件创建客户端代码存根

  • File->New->Other...->XFire->Code generation from WSDL document;
  • 弹出一个对话框,如图3所示:
  • XFire 开发webservice的全过程

3创建客户端代码存根

指定WSDL文件的位置,存根代码的输出地址及对应的类包,点击Finish。

  • XFire插件将在生成客户端代码存根的同时生成服务端代码的存根,如下图所示:

 

图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”

 }

}

调用成功!

你可能感兴趣的:(spring,Web,应用服务器,servlet,webservice)