Web Service详细解析及使用方法
XFire篇
XFire简介
XFire 是 codehaus推出的下一代的 java SOAP框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。通过提供简单的API和支持标准协议,可以很方便的开发面向服务的程序。内建在STAX基于流的XML解析引擎的基础上,XFire拥有很高的性能。
XFire拥有以下的特性
1)、 支持重要的web服务标准,如SOAP、WSDL、WS-I、WS-Addressing、WS-Security基本概要等
2)、 高性能的SOAP栈设计
3)、 可插拔的绑定,支持POJO、XMLBeans、JAXB1.1、JAXB2及castor
4)、 jsr181规范
5)、 支持多种传输协议:HTTP、JMS、XMPP、In-JVM等
6)、 可嵌入式的API
7)、 JBI支持
8)、 客户端和服务器端的存根创建工具
9)、 JAX-WS的早期支持
XFire简单使用
首先先打开IDE,创建一个普通的java工程,将xfire所需要的jar和xifre的jar加入到工程所需要的类库引用中。创建一个简单但的java文件,这个文件只有一个名为add的成员方法。
提供服务类
package net.ruixin.webservicedemo;
public class HelloWorldServiceImpl implements IHelloWorldService {
/**
* 返回名称的方法
* @param name 名称
*/
public String sayHello(String name){
return "您好,"+name;
}
}
服务类的接口类
package net.ruixin.webservicedemo;
public interface IHelloWorldService {
/**
* 返回名称的方法
* @param name 名称
* @return 返回值
*/
public String sayHello(String name);
}
配置services.xml
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWorldService</name>
<serviceClass>
net.ruixin.webservicedemo.IHelloWorldService
</serviceClass>
<implementationClass>
net.ruixin.webservicedemo.HelloWorldServiceImpl
</implementationClass>
<scope>application</scope>
</service>
</beans>
服务名
<name>HelloWorldService</name>
服务类
<serviceClass>net.ruixin.webservicedemo.IHelloWorldService
</serviceClass>
服务接口<implementationClass>net.ruixin.webservicedemo.HelloWorldServiceImpl</implementationClass>
服务范围
<scope>application</scope>
测试服务类
package net.ruixin.webservicedemo;
import java.net.MalformedURLException;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
public class HelloWorldClient {
public static void main(String args[]) {
Service srvcModel = new ObjectServiceFactory()
.create(IHelloWorldService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
.newInstance().getXFire());
String helloWorldURL = "http://localhost:5200/xfire_sample/services/HelloWorldService";
try {
IHelloWorldService srvc = (IHelloWorldService) factory.create(
srvcModel, helloWorldURL);
System.out.print(srvc.sayHello("dennis"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
客户端访问代码
发布服务
XFire 框架中,我们有两种方式将 POJO 发布成 Web 服务:
方式1:一种方式是直接使用 Web 服务接口和 Web 服务实现类(POJO)来发布;
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWorldService</name>
<serviceClass>
net.rubyeye.webservicedemo.IHelloWorldService
</serviceClass>
<implementationClass>
net.rubyeye.webservicedemo.HelloWorldServiceImpl
</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>
方式2:另一种方式是基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务;
package com.test;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(name="Hello",serviceName="Hello",
targetNamespace="http://www.oksonic.cn/xfire")
public class Hello {
@WebMethod
@WebResult
public String getName(@WebParam String name){
return "Hello world " + name;
}
}
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<serviceClass>com.test.Hello</serviceClass>
<serviceFactory>jsr181</serviceFactory>
</service>
</beans>
完整的开发过程
首先打开Eclipse,创建一个普通的java工程,将xfire所需的jar和xfire的jar加入到工程所需的类库引用中。
创建一个简单的java文件,这个java文件简单到只提供一个add方法。
package com.kuaff.xfire.samples;
public class MathService {
public long add(int p1, int p2) {
return p1 + p2;
}
}
在src目录下创建META-INF/xfire目录,然后在META-INF/xfire目录下创建services.xml文件,文件内容为:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>MathService</name>
<namespace>http://www.kuaff.com/xfire/samples/MathService</namespace>
<serviceClass>com.kuaff.xfire.samples.MathService</serviceClass>
</service>
</beans>
这个文档定义了你要发布的web服务,这个定义了一个名为MathService的服务,服务类为com.kuaff.xfire.samples.MathService。
这样我们的一个简单的web服务就开发完成了,下面就要把它发布出去。
将工程bin目录下的所有的文件复制到第一节中配置的tomcat/webapps/xfire/WEB-INF/classes文件夹下,启动tomcat,你就可以检查这个web服务是否发布成功了。
打开浏览器,在浏览器地址栏中输入http://localhost:8080/xfire/services/,正常情况下应该浏览器应该显示类似下图所示的页面。
注意:请在浏览器中输入http://localhost:8080/xfire/services/而不是http://localhost:8080/xfire/services,虽然两者显示的页面相同,但是点击页面上的链接,后者的链接会出错,因为后者后面少加了一个“/”。
点击[wsdl]链接,可以查看这个web服务的wsdl文档。
如果在你的机器上的显示如上面所示,则说明你的这个web服务发布成功,可以正常提供基于http的web服务。
下面一个问题就是如何开发一个Client,来消费(使用)这个web服务。
XFire、Axis、asp.net以及其它的一些商业产品都提供了根据wsdl文档创建客户端代码的工具。这里采用Xfire提供的wsgen工具来创建客户端的访问代码。
Wsgen是xfire提供的一个ant task,task的申明如下:
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="xfire的jar路径" />
这样,就可以在build.xml文件中使用这个task:
<wsgen outputDirectory="client" wsdl="MathService.wsdl" package="com.kuaff.xfire.samples" />
outputDirectory属性定义创建的代码所在的文件夹,wsdl是web服务的wsdl文件,package代表创建的代码的packege。还可以通过binding属性制定bind类型:jaxb或者是xmlbeans,
这样,就会在client文件夹下创建多个java文件,这些文件提供了访问web服务的方法。
在这里声明一点,创建的代码大量的使用了java注释,这个JSE5中提供的新特性,所以你需要使用JSE5编译,Eclipse也必须要3.1以上的版本。
这段ant脚本将创建三个文件:MathServicePortType、MathServiceImpl和MathServiceClient。MathServicePortType是这个web服务的客户端接口存根、MathServiceImpl实现了这个接口。MathServiceClient封装了访问这个web服务的方法。
最后,你可以创建一个单元测试类,用来测试这个客户端类。这个类的内容如下:
package com.kuaff.xfire.samples;
import junit.framework.TestCase;
public class MathServiceClientTest extends TestCase {
public void testAdd() {
MathServiceClient client = new MathServiceClient();
MathServicePortType ms = client.getMathServiceHttpPort();
long result = ms.add(10, 20);
assertEquals(result, 30);
}
}