作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服

本文使用的工具:

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

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

其它开发工具:  下载

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

 

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包

   blob.png

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拦截器

blob.png

 

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

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

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

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

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

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


   blob.png

                                                图4.1

     blob.png

                                                      图4.2


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>

  blob.png


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()); 
	}
 
}


  

   


Home