阿翔编程学-WebService介绍及使用

Web Service详细解析及使用方法

XFire

XFire简介

       XFire codehaus推出的下一代的 java SOAP框架,它构建了 POJO SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。通过提供简单的API和支持标准协议,可以很方便的开发面向服务的程序。内建在STAX基于流的XML解析引擎的基础上,XFire拥有很高的性能。

XFire拥有以下的特性

       1) 支持重要的web服务标准,如SOAPWSDLWS-IWS-AddressingWS-Security基本概要等

       2) 高性能的SOAP栈设计

       3) 可插拔的绑定,支持POJOXMLBeansJAXB1.1JAXB2castor

       4) jsr181规范

       5) 支持多种传输协议:HTTPJMSXMPPIn-JVM

       6) 可嵌入式的API

       7) JBI支持

       8) 客户端和服务器端的存根创建工具

       9) JAX-WS的早期支持

XFire简单使用

       首先先打开IDE,创建一个普通的java工程,将xfire所需要的jarxifrejar加入到工程所需要的类库引用中。创建一个简单但的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所需的jarxfirejar加入到工程所需的类库引用中。
创建一个简单的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服务发布成功,可以正常提供基于httpweb服务。
下面一个问题就是如何开发一个Client,来消费(使用)这个web服务。
XFire
Axisasp.net以及其它的一些商业产品都提供了根据wsdl文档创建客户端代码的工具。这里采用Xfire提供的wsgen工具来创建客户端的访问代码。
Wsgen
xfire提供的一个ant tasktask的申明如下:
<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
属性定义创建的代码所在的文件夹,wsdlweb服务的wsdl文件,package代表创建的代码的packege。还可以通过binding属性制定bind类型:jaxb或者是xmlbeans
这样,就会在client文件夹下创建多个java文件,这些文件提供了访问web服务的方法。
在这里声明一点,创建的代码大量的使用了java注释,这个JSE5中提供的新特性,所以你需要使用JSE5编译,Eclipse也必须要3.1以上的版本。
这段ant脚本将创建三个文件:MathServicePortTypeMathServiceImplMathServiceClientMathServicePortType是这个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); 
  }
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值