通过spring方式实现xfire webservice

来源:互联网 发布:人类会毁于人工智能吗 编辑:程序博客网 时间:2024/04/28 18:30
xfire是webservice的一个实现框架,它的最新版本是1.2.6, 后期便不再维护,后期的版本为CXF(以兴趣可以搜索相关文章学习),但xfire至今仍有很多项目在使用。本文以xfire为技术点,讲解了xfire webservice做为服务端如何对外提供服务,以及xfire作为客户端如何调用webservice服务,以及如何在客户端使用复杂的对象调用服务端服务。

本文使用的工具:

myeclipse10 :  https://pan.baidu.com/s/1eRPzTJG

jdk1.7 :       https://pan.baidu.com/s/1jHWJSdK

其它开发工具:  下载

下载代码导入到myeclipse10中可直接运行

 相关demo下载:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=432#

1.xfire概述

    WebService使用简单对象访问协议(SOAP)使用http协议传输xml数据(xml是最常用的,也有其他格式数据。)来完成系带间的整合,WebService可以进行跨语言、跨平台、分布式系统之间访问,比如用java语言开发了webservice服务,c语句做为客户端可以访问相应的服务, 本文要讲解的WebService中的一种实现XFire,XFire一个免费、开源的SOAP框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,其原理是以接口反射机制自动取得远程方法的调用,WebService中不得不提的描述文件WSDL语言, WSDL是一个用来描述Web服务和说明如何与Web服务通信的XML语言

XFire的配置非常简单,可以非常容易地和Spring集成,本文要讲的就是xfire如何通过与spring的集成对外提供WebService服务


服务端配置

2. xfire所需jar包

   2.1 如果你的工程是maven,则可以通在pom.xml中配置jar包描述信息,非常的简单,见下面

     注意:通过下面方式会下载xfire对应的spring jar包,但spring jar可能与工程中的spring发生冲突

  <dependency><groupId>org.codehaus.xfire</groupId><artifactId>xfire-all</artifactId><version>1.2.6</version>    </dependency>
解决冲突办法:
<dependency><groupId>org.codehaus.xfire</groupId><artifactId>xfire-all</artifactId><version>1.2.6</version><exclusions><exclusion><artifactId>junit</artifactId><groupId>junit</groupId></exclusion><exclusion><artifactId>spring</artifactId><groupId>org.springframework</groupId></exclusion></exclusions>   </dependency>
 2.2 如果你的工程是非maven工程,则需要到相应的网站上去下载jar包

3. web.xml配置

   为了通过相应的路径请求可以访问到WebService服务,在Web.xml中配置的XFire对应的servlet

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>  <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>/WEB-INF/conf/beans-config.xml</param-value>  </context-param>  <filter>    <filter-name>SetCharacterEncoding</filter-name>    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    <init-param>      <param-name>encoding</param-name>      <param-value>UTF-8</param-value>    </init-param>  </filter>  <filter-mapping>    <filter-name>SetCharacterEncoding</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <servlet>    <servlet-name>XFireServlet</servlet-name>    <servlet-class>            org.codehaus.xfire.transport.http.XFireConfigurableServlet        </servlet-class>    <load-on-startup>2</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>XFireServlet</servlet-name>    <url-pattern>/services/*</url-pattern>  </servlet-mapping></web-app>

WebService启动成功后,通过相应的路径可以查看工程中提供的WebService服务(见下图), 路径中的services即为web.xml中

配置servlet拦截器



4. 配置WebService服务需要二个步骤,第一步提供一个服务接口,第二步对服务的接口进行实现

   讲白了需要一个 interface 和 实现interface的class

   下图4.1中为接口,图4.2为实现类

    getName, getNameAddress可以接受webservice客户端提供字符串参数并返回字符串

    getUserInfo接受自定义类型User,并返回User

    注意: 字符串为内置类型,  User为引用类型    这二种类型在客户端的调用形式是不同的,具体见下面的讲解




                                          图4.1



5 xfire与spring的融合

  xfire与spring的结合,通过在xml进行简单的配置,即可实现WebService服务端

  配置XFireExporter的基础对象,其它服务皆继承此服务

<bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter"    lazy-init="false" abstract="true">    <property name="serviceFactory" ref="xfire.serviceFactory" />    <property name="xfire" ref="xfire" /></bean>
 HelloXFireService为提供WebService服务

<bean id="WsHelloImpl" class="com.main.service.HelloXFireServiceImpl"></bean><bean id="helloService" parent="baseWebService">    <property name="serviceBean" ref="WsHelloImpl" />    <property name="serviceClass" value="com.main.service.HelloXFireService" /></bean>



6 查看WebService服务

  在浏览器的地址样中输入 http://localhost:8080/工程名/servies   即可查看所有webservice服务

  一个接口对应一个webservice服务, 点开webservice服务可看wsdl语言对接口具体的描述信息


至此服务的配置结束,是不是很简单

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

客户端的调用

7 客户端使用jar包

  xfire-core-1.2.6.jar

8 由于客户端需要使用服务端接口类对应的函数名称来调用服务,所以在真正的开发过程中,需要服务端的兄弟将服务

  接口提供一份给客户端的开发人员, 即将上面的 HelloXFireService  文件拷贝出来

9 函数调用

  代码main函数中对HelloXFireService中方法进行了测试

  test1, test2, test3 中使用了相同调用服务的方式,但test3在执行时会报错, 因为User是引用类型

  此种类型的服务调用可以使用test4的方式进解决

public class SOAPClient {    public static void main(String[] args) throws  Exception {        test1();        System.out.println("-------------------");        test2();        System.out.println("-------------------");        test4();    }      //测试只有一个参数情况    public static void test1()throws  Exception{        Client client = new Client(new URL("http://localhost:8080/XFireBeanTest/services                                            /HelloXFireService?wsdl"));        Object[] obs = new Object[]{"葛盼江"};        Object[] results = client.invoke("getName", obs);        String xmlResult = results[0].toString();        System.out.println(xmlResult);    }         //测试二个参数情况    public static void test2()throws  Exception{        Client client = new Client(new URL("http://localhost:8080/XFireBeanTest/services                                            /HelloXFireService?wsdl"));        Object[] obs = new Object[]{"葛盼江", "江苏南京"};        Object[] results = client.invoke("getNameAddress", obs);        String xmlResult = results[0].toString();        System.out.println(xmlResult);    }         //测试参数为对象的情况    public static void test3()throws  Exception{        Client client = new Client(new URL("http://localhost:8080/XFireBeanTest/services                                            /HelloXFireService?wsdl"));        User user = new User();        user.setName("葛盼江");        user.setAge("30");        user.setAddress("宿迁市沭阳县");                 Object[] obs = new Object[]{user};        Object[] results = client.invoke("getUserInfo", obs);        User userReturn = (User)results[0];        System.out.println(userReturn.toString());    }         //此函数使用了复杂对象作为参数,注意:  webservice url与上面几个函数的url有点不同,没有?wsdl    public static void test4()throws  Exception{        Service service = new ObjectServiceFactory().create(HelloXFireService.class);          XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());          String url = "http://localhost:8080/XFireBeanTest/services/HelloXFireService";          HelloXFireService helloService = (HelloXFireService) factory.create(service,url);                   //设置此人基本信息        User user = new User();        user.setName("盼江");        user.setAge("30");        user.setAddress("宿迁市沭阳县");                 //设置学习科目        List<String> lstSubject = new ArrayList<String>();        lstSubject.add("化学");        lstSubject.add("英语");        user.setLstSubject(lstSubject);                 //设置其它拥有的女朋友        List<GirlFriend> lstGirlFriend = new ArrayList<GirlFriend>();        GirlFriend friend1 = new GirlFriend();        friend1.setName("冰冰");        GirlFriend friend2 = new GirlFriend();        friend2.setName("小青");        lstGirlFriend.add(friend1);        lstGirlFriend.add(friend2);        user.setLstGirlFriend(lstGirlFriend);                          User userReturn = helloService.getUserInfo(user);          System.out.println(userReturn.getName());     }  }




下载demo:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=432#


原创粉丝点击