Xfire基础

XFire 是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,能够快速地开发Web Service应用。和其他Web服务引擎相比,XFire的配置非常简单,可以非常容易地和Spring集成。

以下以一个Demo程序为例讲解如何编写一个Xfire的服务端与客户端:

xfire版本:xfire-distribution-1.2.6.zip

目录结构:

关键代码:

User.javapackage com.alfred.xfire.bean;

public class User {
	private String id;
	private String name;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
IHelloService.javapackage com.alfred.xfire.service;

import com.alfred.xfire.bean.User;

public interface IHelloService {
	public String sayHello(String name);
    public User getUser(User user);
}
HelloService.javapackage com.alfred.xfire.service;

import com.alfred.xfire.bean.User;

public class HelloService implements IHelloService {

	public String sayHello(String name) {
		return "Hello, " + name;
	}

	public User getUser(User user) {
		User userNew = new User();
		userNew.setId("next" + user.getId());
		userNew.setName("next" + user.getName());
		return userNew;
	}

}
ClientTest.javapackage com.alfred.xfire.client;

import java.net.MalformedURLException;
import java.net.URL;

import org.codehaus.xfire.XFire;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import com.alfred.xfire.bean.User;
import com.alfred.xfire.service.IHelloService;

public class ClientTest {

	public static void main(String[] args) {
//		visitMethod01();
		visitMethod02();
	}

	private static void visitMethod01() {
		try {
			Client client = new Client(
					new URL(
							"http://127.0.0.1:8080/XfireDemo/services/HelloService?wsdl"));
			Object[] results = client.invoke("sayHello",
					new Object[] { "alfred" });
			System.out.println(results[0].toString());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void visitMethod02() {
		// Create a metadata of the service 创建一个service的元数据
		Service srvcModel = new ObjectServiceFactory()
				.create(IHelloService.class);
		// Create a proxy for the deployed service 为XFire获得一个代理工厂那个对象
		XFire xfire = XFireFactory.newInstance().getXFire();
		XFireProxyFactory factory = new XFireProxyFactory(xfire);
		String url = "http://127.0.0.1:8080/XfireDemo/services/HelloService";
		try {
			IHelloService helloService = (IHelloService) factory.create(
					srvcModel, url);
			User user = new User();
			user.setId("userid");
			user.setName("alfred");
			User newUser = helloService.getUser(user);
			System.out.println("id:" + newUser.getId());
			System.out.println("name:" + newUser.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
services.xml<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
	<service>
		<name>HelloService</name>
		<namespace>com.alfred.xfire.service</namespace>
		<serviceClass>com.alfred.xfire.service.IHelloService</serviceClass>
		<implementationClass>com.alfred.xfire.service.HelloService</implementationClass>
	</service>
</beans>
web.xml<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.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>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

导入jar包:

将xfire-all-1.2.6.jar以及lib目录下的jar包全部导入即可。

services.xml文件默认的存放目录是WEB-INF/META-INF/xfire下或WEB-INF/classes/META-INF/xfire下,如果是后者,那么实际项目中META-INF应放置于src目录下:

这样,部署到服务器中后META-INF文件夹就会存在于WEB-INF/classes/目录下。如果要自己指定services.xml文件路径,可以将services.xml路径配置在web.xml文件中,如下:

<servlet>
    <servlet-name>XFireServlet</servlet-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>xfire-services.xml</param-value>
    </init-param>
</servlet>

插入一段init-param配置,param-name为config,指定services.xml文件的路径以及文件名。

配置后目录结构如下:

客户端调用

xfire的客户端有三种调用方式:

1、直接通过url调用, 不用客户端提供接口类

private static void visitMethod01() {
    try {
        Client client = new Client(
                new URL(
                        "http://127.0.0.1:8080/XfireDemo/services/HelloService?wsdl"));
        Object[] results = client.invoke("sayHello",
                new Object[] { "alfred" });
        System.out.println(results[0].toString());
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2、通过服务端提供的接口类进行调用

private static void visitMethod02() {
    // Create a metadata of the service 创建一个service的元数据
    Service srvcModel = new ObjectServiceFactory()
            .create(IHelloService.class);
    // Create a proxy for the deployed service 为XFire获得一个代理工厂那个对象
    XFire xfire = XFireFactory.newInstance().getXFire();
    XFireProxyFactory factory = new XFireProxyFactory(xfire);
    String url = "http://127.0.0.1:8080/XfireDemo/services/HelloService";
    try {
        IHelloService helloService = (IHelloService) factory.create(
                srvcModel, url);
        User user = new User();
        user.setId("userid");
        user.setName("alfred");
        User newUser = helloService.getUser(user);
        System.out.println("id:" + newUser.getId());
        System.out.println("name:" + newUser.getName());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3、通过服务端的WSDL反向生成客户端,很多IDE或者使用Ant都可以反向生成客户端,这里就不复诉了

三种客户端比较:

第一种方式是最为简便的,只需要URL就可以访问到,但是在效率上要低于另外两种方式。如果在可以得到服务端提供的接口类的情况下,最好的方法是使用第二种方式调用,效率最高。第三种方式其实和第二种有些类似(但估计没有第二种效率高,毕竟反向生成,可能会加入很多适用性的代码)。另外,就传递和返回数据来说,第一种方式只能传递基本数据类型或String等,无法传递接收自定义对象,后两种方式可以,当然,如果想要用第一种方式传递自定义对象可以先通过xstream等工具将其转换为XML字符串,然后传递解析,就可以了。

源码解析

org.codehaus.xfire.transport.http.XFireConfigurableServlet文件中,载入services.xml的相关代码如下:

private final static String CONFIG_FILE = "META-INF/xfire/services.xml";

private final static String PARAM_CONFIG="config";

/**
 * Path to configuration file
 */
private String configPath;

/**
 * @return
 */
private String getConfigPath()
{
    if (configPath == null || configPath.length() == 0)
    {
        return CONFIG_FILE;
    }
    return configPath;
}

public XFire createXFire() throws ServletException
{
    configPath = getInitParameter(PARAM_CONFIG);
    XFire xfire;
    try
    {
        xfire = loadConfig(getConfigPath());
    }
    catch (XFireException e)
    {
        throw new ServletException(e);
    }

    if(xfire == null || xfire.getServiceRegistry() == null || xfire.getServiceRegistry().getServices() == null || xfire.getServiceRegistry().getServices().size() == 0)
    {
        xfire = super.createXFire();
    }

    return xfire;
}

可以看到默认的service.xml加载路径为:

private final static String CONFIG_FILE = "META-INF/xfire/services.xml";

当创建xfire时会去加载configPath:

configPath = getInitParameter(PARAM_CONFIG);
private final static String PARAM_CONFIG="config";

如果此时没有设置config参数那么就会取用默认services.xml路径配置:

private String getConfigPath()
{
    if (configPath == null || configPath.length() == 0)
    {
        return CONFIG_FILE;
    }
    return configPath;
}

由此可见我们可以在web.xml里修改config参数进行路径配置。

时间: 2024-10-04 20:09:11

Xfire基础的相关文章

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

从xfire谈WebService接口化编程

前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总结一下自己对于接口化开发的认识,以及如何利用java开发一些可以供其他应用程序使用的web服务. 其实最开始对Web服务的认识还是在课堂上,老师反复地在讲SOAP协议,其实也不懂究竟是什么意思,无缘无故就在大脑中形成了条件反射,SOAP协议的中文意思就是简单对象访问协议:而且,更加巧合的是自己在求职面试时就被

MyEclipse下XFire开发Webservice实例

XFire Java SOAP框架概述 (摘自:http://tech.it168.com/j/e/2006-10-28/200610281432707.shtml )     MyEclipse Web Services是建立在XFire Java SOAP框架和工具基础上的, XFire是一款开源的Java SOAP框架.它拥有一个轻量级的信息处理模块,通过STAX来与SOAP信息相结合.提供了一个工作在Web Services下的简单API,支持POJO和schema开发. XFire支持

xfire框架内部基本结构解析

1 概述 xfire是webservice的一个实现框架,是apache旗下CXF的前身,是一个比较被广泛使用的webservice框架,网上有很多关于如何使用xfire或cxf的hello world案例,但是对于它是如何运行起来的介绍比较少,最近在排查问题时对xfire的代码进行了debug,因而对xfire的运行有了大概了解,在此进行下简单总结. 2 Service xfire作为webservice的实现框架,首当其冲的要先了解下xfire是如何将系统中的一个个功能各异的interfac

使用xfire搭建webService服务

后边有个项目需要接入4A,要用到webService服务,暂时还不确定是不是会有我的事,但为了有备无患,还是抽时间学习了以下相关的知识. 本来我所了解到的发布webService服务有用cxf和xfire两种,但这个项目明确说了需要用xfire,因此便先学习一下这个.参考网上一些文档,搭建的过程大概如下: 一.环境基础:eclipse4.4.1.maven3.2.5.tomcat7.jdk1.7: 二.搭建过程: 1.下载依赖jar包:由于看到那些xfire入门教程中都说要先下载XFire 框架

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4

NumPy基础:数组和失量计算

NumPy : Numerical Python,是高性能科学计算和数据分析的基础包. 部分功能: ndarray:一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组: 用于对整组数据进行快速运算的标准数学函数(无需编写循环): 用于读写磁盘数据的工具以及用于操作内存映射文件的工具: 线性代数.随机数生成以及傅里叶变换功能: 用于集成C.C++.Fortran等语言编写的代码工具: 大部分数据分析应用关注的功能: 用于