`
yuwenlin2008
  • 浏览: 124303 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

WebService之XFire+Spring集成开发入门

 
阅读更多

公司最近的项目要用到WebService,本来以前用过CXF的,但是现在的系统框架一直以来都是用XFire,上头为了保持统一,决定还是采用XFire来实现,所以我又来补了

以最简单的HelloWorld为例,来了解XFire的工作流程

开发环境:Win7+MyEclipse6.5+Jdk1.6+Tomcat6+Spring2.5+XFire1.2
我们先来写服务端,发布一个WebService的服务接口


一、环境搭建
  在MyEclipse中新建web工程,取名HelloWebService,首先添加Spring的jar包支持,可以参考我的SSH开发环境详细搭建(配置文件)
  然后添加XFire支持,也是利用MyEclipse,在项目名上点右键->MyEclipse->选择WebService XFire支持。

  
它会生成services.xml文件,不需要用它,将它删除掉。

它也会在web.xml中生成XFireSpringServlet的过滤器,这个要,留着:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" 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.spring.XFireSpringServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <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>

 在web.xml中添加我们的Spring启动配置:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/*.xml</param-value>
  </context-param>

 发布到tomcat,启动看下是否报错,结果发现一直报下面这个错:

org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".

初一看觉得是Spring配置文件头部没有DOCTYPE,结果加上去不好使,上网查发现是引的XFire的jar包里面的Spring1.2版本与开始添加的2.5版本冲突。

解决办法:删除XFire中的低版本的Spring包,因为它是MyEclipse添加的jar包关联,所以要删除,得删除关联,然后再添加XFire中除了Spring1.2的其它Jar包,如果在MyEclipse中找不到,可以去网上搜“XFire所有Jar包下载”关键字

重新添加XFire的jar包,再启服务就好了

 

二、写Java接口

  添加Java接口与实现,用于对外提供服务:

package com.yuwl.webservice;

/**
 * WebService接口
 * @author yuwl
 */
public interface IHelloWebService {

       String sayHello(String name);
}

   实现:

package com.yuwl.webservice;

/**
 * 接口实现
 * @author yuwl
 *
 */
public class HelloWebServiceImp implements IHelloWebService {

	public String sayHello(String name) {
		return "hello WS: "+name;
	}

}

   并添加到applicationContext.xml中,供XFire访问:

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="HelloWS" class="com.yuwl.webservice.HelloWebServiceImp"/>
</beans>

 

 

、配置XFire

  配置导出器将我们的接口发布成wsdl服务

  在Src目录下新建xfire-servlet.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- 引入XFire预配置信息 -->
    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
    <!-- 定义访问的url -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="urlMap">             
           <map>                 
              <entry key="/HelloWebService">                  
                  <ref bean="HelloWebService" />                 
              </entry>             
           </map>         
       </property>     
    </bean>     

    <!-- 使用XFire导出器 -->
    <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false" abstract="true">
       <!-- 引用xfire.xml中定义的工厂 -->
       <property name="serviceFactory" ref="xfire.serviceFactory" />
       <!-- 引用xfire.xml中的xfire实例 -->
       <property name="xfire" ref="xfire" />
    </bean>
    <bean id="HelloWebService" parent="baseWebService">
       <!-- 业务服务bean -->
       <property name="serviceBean" ref="HelloWS" />
       <!-- 业务服务bean的窄接口类 -->
       <property name="serviceClass" value="com.yuwl.webservice.IHelloWebService" />
    </bean>
</beans>

 好了,到此一个简单的HelloWorld WebService服务开发完成了,发布测试一下:

 http://localhost:8080/HelloWebService/services/IHelloWebService?wsdl

发现可以看到生成的xml文档数据,有我们定义的接口元素,就说明服务端开发成功了。

 

四、客户端测试

  新建Java工程,导入刚才引的XFire jar包。

  将生成的wsdl文档保存为wsdl格式的文件,放入src目录下

  建立Java类用main方法来测试我们的服务:

  

package com.yuwl.test;

import org.codehaus.xfire.client.Client;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/**
 * WebService客户端测试
 * @author yuwl
 */
public class WebServiceTest {
	
	public static void main(String[] args) throws Exception {
		String wsdl = "IHelloWebService.wsdl"; //对应的WSDL文件
	    Resource resource = new ClassPathResource(wsdl); 
	    Client client = new Client(resource.getInputStream(), null); //根据WSDL创建客户实例
	    
	    Object[] objArray = new Object[1];
	    objArray[0] = "yuwl";
	    //调用特定的Web Service方法
	    Object[] results = client.invoke("sayHello", objArray);
	    System.out.println("result: " + results[0]);
	}
	
}

 运行main方法,发现报错:

  java.lang.NoClassDefFoundError: org/apache/ws/commons/schema/resolver/URIResolver

 一看就知道是少jar包,上百度搜这个错,发现是少了XmlSchema-1.1.jar,下载下来引进去,再测就好了,打印结果:result: hello WS: yuwl

 

至此一个简单的HelloWorld,基于XFire的WebService开发完成了,但在实际的项目开发中,各个系统间的相互对接远不只这么简单,让我们在它的基础上,继续前行吧。

 


 

 

  • 大小: 47.3 KB
0
5
分享到:
评论
5 楼 王新春 2013-06-22  
yuwenlin2008 写道
王新春 写道
楼主能否 给出这种webservice 和 requestResponse 输出json 数据,有什么相似性和不同,性能上优势和劣势不,非常感谢!

WebServie和Request其实没什么可比性,WebService是一种处理不同系统之间的数据交换技术,可跨平台,跨语言等。Request,Response是一种客户端发出请求,服务端作出响应。它们应用的场景不一样,无非都是基于Http的,只是个人觉得的哈。

好吧,你理解的角度和我说的都不一样。
4 楼 yuwenlin2008 2013-06-08  
王新春 写道
楼主能否 给出这种webservice 和 requestResponse 输出json 数据,有什么相似性和不同,性能上优势和劣势不,非常感谢!

WebServie和Request其实没什么可比性,WebService是一种处理不同系统之间的数据交换技术,可跨平台,跨语言等。Request,Response是一种客户端发出请求,服务端作出响应。它们应用的场景不一样,无非都是基于Http的,只是个人觉得的哈。
3 楼 王新春 2013-06-08  
shanlingyunjavafuns 写道
   个人觉得,他们的相似性都是通过对象来组装属性信息,开发效率上来说,后者应该跟快捷些。但是在通信过程中,信息转化成对象的效率前者高一些。如果是第三方调用接口,后者,得提供sdk。说的不好,还望大家补充,探讨,勿喷。

效率上,从调用方而言:协议都是http,数据一个json 和xml 应该差异不大吧。都是字符串解析。
从提供方而言:websevice应该更便捷,接口数据转换为 文本都不用做了,json其实也以及很方便了。
2 楼 shanlingyunjavafuns 2013-06-08  
   个人觉得,他们的相似性都是通过对象来组装属性信息,开发效率上来说,后者应该跟快捷些。但是在通信过程中,信息转化成对象的效率前者高一些。如果是第三方调用接口,后者,得提供sdk。说的不好,还望大家补充,探讨,勿喷。
1 楼 王新春 2013-06-08  
楼主能否 给出这种webservice 和 requestResponse 输出json 数据,有什么相似性和不同,性能上优势和劣势不,非常感谢!

相关推荐

Global site tag (gtag.js) - Google Analytics