Xfire基础
XFire 是与 Axis 2 并列的新一代 Web Service 框架,通过提供简单的 API 支持 Web Service 各项标准协议,能够快速地开发 Web Service 应用。和其他 Web 服务引擎相比,XFire 的配置非常简单,可以非常容易地和 Spring 集成。
以下以一个实例讲解如何编写一个 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 参数进行路径配置。
Xfire基础的更多相关文章
- 从xfire谈WebService接口化编程
前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总 ...
- MyEclipse下XFire开发Webservice实例
XFire Java SOAP框架概述 (摘自:http://tech.it168.com/j/e/2006-10-28/200610281432707.shtml ) MyEclipse W ...
- xfire框架内部基本结构解析
1 概述 xfire是webservice的一个实现框架,是apache旗下CXF的前身,是一个比较被广泛使用的webservice框架,网上有很多关于如何使用xfire或cxf的hello worl ...
- MyEclipse下一个XFire发展Webservice示例
最近的研究JAVA发展Webservice.网络发现几个热门选择AXIS.XFire.CFX(XFire下一代),打开前几天对这篇文章比较三种选择,他们已经有了一些概念. 样本,以确定自己的实践 在開 ...
- WebService基础学习(二)—三要素
一.Java中WebService规范 JAVA 中共有三种WebService 规范,分别是JAX-WS.JAX-RS.JAXM&SAAJ(废弃). 1.JAX-WS规范 ...
- webService基础知识--认识WebService
之前在找工作的时候,有面试官问到WebService,当时没有接触过,正好现在做的项目中有用到WebService,所以就趁着业余时间来学习了. 一.简介 先来看看百度百科对WebService的解释 ...
- 使用xfire搭建webService服务
后边有个项目需要接入4A,要用到webService服务,暂时还不确定是不是会有我的事,但为了有备无患,还是抽时间学习了以下相关的知识. 本来我所了解到的发布webService服务有用cxf和xfi ...
- Web Service基础——规范及三要素
1. Java中的Web Service规范 Java 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC).JAX-RS.JAXM&SAAJ(废弃). 1.1 JAX- ...
- Web service 框架比较CXF xfire aisx2 aisx
Web 服务框架.它还体现了从 Axis 1.x 系列获得的经验和最近两年在 Web 服务领域的发展.推出 Axis2 的主要原因之一是从速度和内存方面获得更好的性能——不过还添加了一些新特性和功能. ...
随机推荐
- 在Windows Server 2008 R2 Server中,上传视频遇到的问题(一)
在Windows 2008 R2 Server中,上传视频不能播放,以及服务器大小限制问题,这里记录我的解决方法,以免再次遇到,无所适从. 1.上传视频不能播放 打开IIS,找到“MIME类型”,如下 ...
- Verilog如何从外部更改模块内参数
例如有一个模块 module x(a,b,c); input a,b; output c; 'd0, h=9'd3; ...... endmodule 两种解决方法: 1.使用带有参数值的模块实例语句 ...
- 中文全文检索讯搜xunsearch安装
Xunsearch (迅搜)是一套免费开源的专业中文全文检索解决方案,简单易用而且 功能强大.性能卓越能轻松处理海量数据的全文检索.它包含后端索引.搜索服务程序和前端 脚本语言编写的开发工具包(称之为 ...
- 20180925 SQL Server游标使用
之前写了一个存储过程 目标: 根据时间,获取指定范围的数据集A, 再从数据集A 中,取出每行数据中的两个时间,卡另外一个B表里面的某列时间范围的值集.得到均值进行配置值比对. 这里有个问题,就是取得B ...
- 并发编程---IO模型
IO模型 任务的提交方式有两种: 同步:应用程序提交完任务,等待结果结果,之后在执行下一个任务 异步:应用程序提交完任务,继续执行不等待结果,任务执行完,会自动出发异步中的会带哦函数 同步不等于阻塞: ...
- webstorm2018版安装-破解
安装完成后到下面网址下载破解补丁 网址:http://idea.lanyus.com/ 修改路径 修改同目录下的 WebStorm.exe.vmoptions 和WebStorm64.exe.vmop ...
- django中常用到的前端样式
注:这里的样式都是导入bootstrap后经常用到的 1.栅格系统 col-md 中型设备台式电脑(>=992px),以折叠开始,断点以上是水平的.列数量和:12. col-md-offset- ...
- iot-hub物管理bug
物管理中,物绑定证书,如果证书被删除,将会出错 初始化用到 证书编码,证书为null时,null.code报错
- shell实现SSH自动登陆【转】
前言 公司开发使用docker,每次登陆自己开发机总要输入 ssh user_name@ip_string,然后再确认输入password,手快了还经常会输错.作为一个懒人,肯定要找一个取巧的方式,查 ...
- curl不能支持https问题
前面说了 update nss 并没有解决问题. 想办法重新安装一下:CURL 1.下载安装包 [root@mycentos ~]# wget https://curl.haxx.se/downloa ...