D盘

workspace
posts - 165, comments - 53, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

xfire

Posted on 2008-08-13 16:27 巴西木 阅读(871) 评论(0)  编辑 收藏 引用

XFire 概述

XFire 是 codeHaus 组织提供的一个开源框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。

XFire 目前最新的版本是 1.2.2,目前支持的特性主要包括:

  • 支持将 Web 服务绑定到 POJO、XMLBeans、JAXB1.1、JAXB2.0 和 Castor;
  • 支持基于 HTTP、JMS、XMPP 等多种协议访问 Web 服务;
  • 支持多种 Web 服务业界重要标准如 SOAP、WSDL、Web 服务寻址(WS-Addressing)、Web 服务安全(WS-Security)等;
  • 支持 JSR181,可以通过 JDK5 配置 Web 服务;
  • 高性能的 SOAP 实现;
  • 服务器端、客户端代码辅助生成;
  • 对 Spring、Pico、Plexus 等项目的支持等。




回页首


XFire 安装包

XFire 框架目前的最新版本是 1.2.6,可以访问 xfire.codehaus.org 下载 XFire 框架的安装包,下载时请选择“全部二进制发布包(Binary Distribution in zip package)”,而不仅仅是“XFire jar 文件(Jar of all XFire modules)”。

下载完成后,我们可以将下载的 .zip 文件解压缩到任意的文件夹中(后面的章节中使用 % XFIRE_HOME % 表示 XFire 框架的安装目录),解压缩后形成的文件目录结构如下:

  • api(目录)

    api 目录中是 XFire 框架中所有类(class)对应的 API 文档,为开发者使用 XFire 完成应用开发提供帮助。

  • examples(目录)

    examples 目录中包含了所有随 XFire 二进制包发布的实例,包括这些实例的源代码和相关 Web 应用配置内容。

  • lib(目录)

    lib 目录中包含 XFire 运行所需要的外部支持类包(.jar文件),可以根据不同项目所需的 XFire 特性选择所需要的支持类包。保守的方法是在 Web 项目中包含所有的外部支持类包(.jar文件)。

  • manual(目录)

    manual 目录中包含有 XFire 框架的帮助文档,开发者可以从这些帮助文档中学习更多运用 XFire 框架实现 SOA 的知识和技巧。

  • modules(目录)

    modules 目录中包含了 XFire 框架根据不同特性分别编译的二进制包文件。发布基于 XFire 框架的 Web 项目时,可以选择使用该目录下的所有 .jar 文件,也可以选择 XFire-all-1.2.6.jar 文件。

  • XFire-all-1.2.6.jar

    XFire 框架的二进制包文件,包含了全部的模块(modules)。

  • LICENSE.txt

    LICENSE.txt 文件中包含了 XFire 框架的授权协议。

  • NOTICE.txt
  • README.txt

    这两个文件中包含了 XFire 发布时的一些有用的信息。





回页首


XFire 框架支撑环境

XFire框架是一种基于Servlet技术的SOA应用开发框架,要正常运行基于XFire应用框架开发的企业应用,除了XFire框架本身之外,还需要JDK和Servlet容器的支持。

1.JDK 版本选择、下载和安装

XFire 支持非常多的特性,其中不同的特性对 JDK 版本的要求有所不同,比如如果项目中选择基于 JSR181 标准发布 Web 服务,我们就需要选择 JDK5 或者以上版本,如果仅仅选择将 Web 服务绑定到最简单的 POJO,我们只需要选择 JDK1.4 版本即可。

JDK 各版本均可以在 java.sun.com 网站上下载,如何安装 JDK 请参考 SUN 公司的相关技术文档和 JDK 的帮助文档。

2.Servlet 容器下载和安装

XFire 是一种基于 Servlet 技术的 SOA 应用开发框架,需要 Servlet 容器的支持。XFire 支持在多种 Servlet 容器中运行,包括 Websphere、Weblogic、TOMCAT 等。为了说明的简单,我们选择使用 TOMCAT(版本5.0.30)作为 XFire 的运行容器,所有配置过程和发布步骤的说明也均是针对 TOMCAT,如果读者使用 TOMCAT 之外的其它 Servlet 容器或者选择了 TOMCAT 的其它版本,下面的配置过程和步骤可能需要做出调整,请读者根据实际 Servlet 容器的帮助文档进行相应调整。

TOMCAT 各版本均可以在 tomcat.apache.org 网站上下载,如何正确安装 TOMCAT 服务器请参考 TOMCAT 服务器的帮助文档。

3.xalan

XFire 需要 xalan 项目的支持,然而 1.2.6 版本中并没有带有相应的 jar 文件,因此请访问 xml.apache.org,下载 xalan 项目的二进制包。





回页首


XFire 应用配置

前面的章节中我们下载和安装了 XFire 安装包和所需要的支持环境,现在我们开始学习如何从零开始创建 XFire 应用开发环境。下面的所有配置过程和发布步骤均针对 TOMCAT(版本5.0.30)服务器,如果选择其它的 Servlet 容器,下面的配置过程和步骤可能需要做出调整,请读者根据实际 Servlet 容器的帮助文档进行相应调整。

1、创建 Web 应用目录和基本元素

  1. 在 %TOMCAT_HOME%/webapps 目录下创建新的 Web 应用目录 “XFire”

    [注] 其中的 %TOMCAT_HOME% 指向 TOMCAT 的安装目录。

  2. 在 ”XFire”目录下创建 ”WEB-INF”目录、
  3. 在 ” WEB-INF”目录下创建 ”lib”目录和 ”classes”目录
  4. 在 ” WEB-INF”目录下创建 Web 应用描述文件 ”web.xml”, ”web.xml”文件的内容见 清单 1-1

清单 1-1 WEB-INF\web.xml
            1、	<?xml version="1.0" encoding="ISO-8859-1"?>
            2、	<web-app 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
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
            5、	    version="2.4">
            6、
            7、	    <display-name>XFire实例</display-name>
            8、	    <description>
            9、	         基于XFire框架发布Web服务的例子
            10、	    </description>
            11、
            12、	</web-app>
            

2、拷贝 XFire 所需的支持类包文件

拷贝 %XFIRE_HOME%/lib 目录下所有文件到 “1、创建 Web 应用目录和基本元素” 中所创建的 ”lib”目录下,将 %XFIRE_HOME%/XFire-all-1.2.6.jar 文件也拷贝到 “1、创建 Web 应用目录和基本元素” 中所创建的 ”lib”目录下。将 xalan 安装包中的所有 jar 文件和所需要的支持 jar 文件拷贝到相同的 ”lib”目录下。

[注] 为了减少拷贝的 jar 文件的数目,开发者可以根据项目的需要选择需要拷贝的 jar 文件,而不是全部拷贝,如何根据需要选择拷贝合适的类包文件请访问 XFire 站点

3、配置 XFire 框架运行所需的 Servlet

修改 web.xml 文件,在其中增加如下 Servlet 定义内容。

1、	<servlet>
            2、	    <servlet-name>XFireServlet</servlet-name>
            3、	    <display-name>XFire Servlet</display-name>
            4、	    <servlet-class>
            5、	        org.codehaus.xfire.transport.http.XFireConfigurableServlet
            6、	    </servlet-class>
            7、	  </servlet>
            8、
            9、	  <servlet-mapping>
            10、	    <servlet-name>XFireServlet</servlet-name>
            11、	    <url-pattern>/servlet/XFireServlet/*</url-pattern>
            12、	  </servlet-mapping>
            13、
            14、	  <servlet-mapping>
            15、	    <servlet-name>XFireServlet</servlet-name>
            16、	    <url-pattern>/services/*</url-pattern>
            17、	</servlet-mapping>
            

4、创建 XFire 框架的服务发布文件 services.xml

  1. “1、创建 Web 应用目录和基本元素” 中创建的 classes 目录下新建目录 ”META-INF\xfire”;
  2. 在步骤 a) 中新建的 ”xfire”文件目录下创建新文件 services.xml,文件的默认内容如 清单1-2

清单 1-2 WEB-INF\classes\META-INF\xfire\services.xml
            1、	<beans xmlns="http://XFire.codehaus.org/config/1.0">
            2、	</beans>
            



一个简单的xfire配置方法,后面的jar包列表很有用,是必备的jar包列表

xfire 配置指南(服务端)

xfire 配置指南(服务端) :
在xfire框架下写webservice非常简单,他解藕得像webwork。
在xfire框架下任何一个类都可以做webservice,只需配置一下就可以在服务端运行了。
就让我们从WorldHello开始吧

package hank.lee;

/**
*
* @author Hank Lee
* @version 100000.000001 Beta
* @since JDK 1.5
*/
public class WorldHello {
public String getEcho(){
return “I love you, hank.lee!!”;
}
}

由于时间关系,我已经写好了代码,然后就是配置了。
1.WEB-INF\classes下META-INF\xfire\services.xml,配置如下:
<beans xmlns=”http://xfire.codehaus.org/config/1.0″>
<service>
<name>HankService</name>
<namespace>http://xfire.codehaus.org/HankService</namespace>
<serviceClass>hank.lee.WorldHello</serviceClass>
</service>
</beans>
2.WEB-INF\web.xml,配置如下:
<web-app>
<servlet>
<servlet-name>XFireServlet</servlet-name>
<display-name>XFire Servlet</display-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>

就这样部署,请移玉指点击浏览器试试 http://yourhost:8080/yourapp/services/HankService?wsdl
你不是发梦,是的,可以运行了。
简单了吧,不过上帝是公平的,要运行以上的例子需要的包是非常多的。

activation-1.0.2.jar
commons-attributes-api-2.1.jar
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-httpclient-3.0.jar
commons-logging-1.0.4.jar
httpunit-1.6.1.jar
jaxen-1.1-beta-8.jar
jdom-1.0.jar
js-1.5R4.1.jar
jtidy-4aug2000r7-dev.jar
log4j-1.2.6.jar
mail-1.3.3_01.jar
nekohtml-0.9.1.jar
org.mortbay.jetty-5.1.3.jar
qdox-1.5.jar
servlet-api-2.3.jar
spring-1.2.6.jar
stax-api-1.0.jar
stax-utils-snapshot-20040917.jar
wsdl4j-1.5.2.jar
wstx-asl-2.9.jar
xbean-2.1.0.jar
xbean-spring-2.2.jar
xercesImpl-2.6.2.jar
xfire-aegis-1.0.jar
xfire-annotations-1.0.jar
xfire-core-1.0.jar
xfire-spring-1.0.jar
xfire-xmlbeans-1.0.jar
xmlParserAPIs-2.6.2.jar
XmlSchema-1.0.jar


这篇文章很清晰地讲述了xfire的入门过程

◎XFire 使用记

XFire开发Web服务的基本步骤
1) 检验JAVA类的方法和构造函数是否是公共的,一定要是公开的。
2) 将XFire Servlet相关的入口添加到web.xml中。

<servlet>
    
<servlet-name>XFireServlet</servlet-name>
    
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
    
<load-on-startup>0</load-on-startup>
  
</servlet>
  
<servlet-mapping>
    
<servlet-name>XFireServlet</servlet-name>
    
<url-pattern>/services/*</url-pattern>
  
</servlet-mapping>

3) 创建services.xml并把它放到WEB-INF/classes/META-INF/xfire目录下,这是默认的做法;也可以将services.xml的路径配置到web.xml文件中。

<servlet>
    
<servlet-name>XFire</servlet-name>
    
<display-name>XFire Servlet</display-name>
    
<servlet-class>
        org.codehaus.xfire.transport.http.XFireConfigurableServlet
    
</servlet-class>

    
<!--
      The servlet will by default look for the configuration on
      the classpath in "META-INF/xfire/services.xml". You can
      override it with this parameter. Seperate multiple configuration files with a comma.
     
-->
   
<!-- 默认会在classpath的META-INF/xfire/下查找services.xml文件,
     可以覆盖这个参数,指定多个配置文件
-->
    
<init-param>
      
<param-name>config</param-name>
      
<param-value>services.xml</param-value>
    
</init-param>
  
</servlet>

4) 将XFire和其它第三方库添加到Web应用的WEB-INF/lib目录下。


FAQ
1) Weblogic8.1中应用XFire,启动wls时,出现java.lang.NoSuchMethodError的解决办法。
   首先,将XFire提供的QName JAR(qname.jar)放进WEB-INF/lib目录下。然后,将weblogic.xml文件放到WEB-INF下。
weblogic.xml的内容为:

<!DOCTYPE weblogic-web-app PUBLIC
  "-//BEA Systems, Inc.//DTD Web Application 8.1//EN"
  "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"
>

<weblogic-web-app>
  
<container-descriptor>
    
<prefer-web-inf-classes>true</prefer-web-inf-classes>
  
</container-descriptor>
</weblogic-web-app>

具体的详细解说,请看XFire的User's Guide.


技巧
1. 如果Web Services的方法的参数是Collections,那就需要建一个Mapping文件,而且Mapping文件的命名为className.aegis.xml,并且与class放在同一个package下。
如:
public interface IConstraceSerice {
   boolean editConstraceInfo(List aList);
}
Mapping文件如下:IConstraceService.aegis.xml
<?xml version="1.0" encoding="utf-8"?>
<mappings>
   <mapping>
      <method name="editConstraceInfo">
          <parameter index="0" componentType="java.lang.String"/>
      </method>
   </mapping>
</mappings>

<parameter index="0" componentType="java.lang.String"/>表示第一个参数,里面实际值的类型,这里实际值的类型是java.lang.String.
如果是一个JavaBean,如com.test.TestBean,那以就要写成<parameter index="0" compentType="com.test.TestBean"/>

2. 如果返回类型是List或Map,并且里面存放的是自定义类的话,则需要增加一个对于服务接口的配置文件。该文件的命名规则是 接口文件名.aegis.xml。例如接口是UserService.java的话,则此配置文件命名为UserService.aegis.xml。注意此配置文件须与接口放在同一目录下面。
<?xml version="1.0" encoding="UTF-8"?> 
 <mappings> 
   <mapping > 
     <method name="getUsers"> 
       <return-type componentType="com.test.domain.User"/> 
     </method> 
   </mapping> 
 </mappings>
getUsers方法返回类型是List,里面装的User对象。对于这种类型的方法,在配置文件中描述了它的返回值类型。

如果返回的类型是Map的话,做法和List一样。但定义的类型,是Map中的Value部分,并且这样的话,Map中Value所存放的对象就必须全部是同一种类啦。

下面给出一个详细的例子:
1)服务接口:
public interface MyService2
{
    boolean getInfo();
    Collection getCollection(); //method 1
    Collection getCollection(int id); //method 2
    Collection getCollection(String id); //method 3
    Collection getCollectionForValues(String id, Collection c); //method 4
    Collection getCollectionForValues(int value, Collection c); //method 5
}
2) Mapping文件内容:
<mappings>
    <mapping>
        <!-- mapping 1 -->
        <method name="getCollection">
            <return-type componentType="java.lang.Double"/>
        </method>
        <!-- mapping 2 -->
        <method name="getCollection">
            <return-type componentType="java.lang.Float"/>
            <parameter index="0" class="int"/>
        </method>
        <!-- mapping 3 -->
        <method name="getCollectionForValues">
            <return-type componentType="java.math.BigDecimal"/>
        </method>
        <!-- mapping 4 -->
        <method name="getCollectionForValues">
            <parameter index="0" class="java.lang.String"/>
            <parameter index="1" componentType="java.util.Date"/>
        </method>
        <!-- mapping 5 -->
        <method name="getCollectionForValues">
            <return-type componentType="java.util.Calendar"/>
            <parameter index="0" class="int"/>
            <parameter index="1" componentType="java.lang.Bit"/>
        </method>
    </mapping>
</mappings>


3. 如果一个方法的返回类型是一个JavaBean,而这个JavaBean当中又存在Collections,那么就需要定义一个与JavaBean相关的Mapping文件,文件名要与JavaBean名相同,如:User.aegis.xmll,并且与JavaBean放在同一个目录.

例子:
1) 服务接口
public interface IYMServiceFacade {
   User getUser();
}

2) JavaBean
public class User {
   private Strirng userName;
   // 这里是一个Collection
   private Set rooms;

   .....
   .....
}

3) Mapping文件(User.aegis.xml)
<?xml version="1.0" encoding="utf-8"?>
<mappings>
    <mapping>
        <property name="rooms" componentType="com.powerunion.ymservice.dto.Room"/>
    </mapping>
</mappings>

介绍:<property name="rooms" componentType="com.powerunion.ymservice.dto.Room"/>
其中的name属性就是JavaBean里面定义的rooms,componentType上面的相同,表示Collections里真正存储的类型.


注:如果服务接口的参数或者返因类型是基本类型(int, float, double等)就不需要创建Mapping文件。
详细的信息见XFire的User's Guide.


4.如果Web Services和客户端运行在同一个JVM上,可以选择使用本地传输,可以大幅提升性能。如:以下指定服务端URL的这行。
String serviceUrl = "http://localhost:8080/YM/services/ContractService";
替换为
String serviceUrl = "xfire.local://ContractService";


5. 用ant task 生成xfire 客户端代码
  
用xfire不管是配置web service,还是生成客户代码都很方便.
生成客户代码只要在用ant生成就可以了!

build.xml


代码
<?xml version="1.0"?> 
 
<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="Echo1Service.xml" /> 
    <property name="code_package" value="com.client" /> 
    <target name="genfiles"  description="Generate the files"> 
        <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="myclasspath" /> 
        <wsgen outputDirectory="${code_path}" wsdl="${wsdl_path}" package="${code_package}" binding="xmlbeans" /> 
    </target> 
</project>  
 


只有注册用户登录后才能发表评论。