`

Web Service修炼之二Xfire+Spring

 
阅读更多
1、准备开发环境 

   环境:MyEclipse xx +tomcat6.0+JDK1.5

   xfire版本:xifre-1.2.6

   XFire所需jar:

   http://xfire.codehaus.org/下载xfire1.2.6-.zip压缩包,解压后libjar

   MyEclipse下新建一个Web Applications,命名为wss

2、配置运行环境

    WEB-INF目录下新建一个web.xml文件,文件中输入:

xml代码

 <?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">

<display-name>XFireService</display-name>

<!-- begin Spring配置 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/applicationContext.xml,/WEB-INF/xfire-servlet.xml

</param-value>

</context-param>

<!-- 启动时加载SpringContextServlet -->

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

<listener>

<listener-class>

  org.springframework.web.util.IntrospectorCleanupListener

</listener-class>

</listener>

<!-- end Spring配置 -->

<!-- begin XFire 配置 -->

<servlet>

<servlet-name>xfire</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>xfire</servlet-name>

<url-pattern>*.ws</url-pattern>

</servlet-mapping>

<servlet>

<!--配合Spring容器中XFire一起工作的Servlet-->

<servlet-name>xfireServlet</servlet-name>

<servlet-class>

org.codehaus.xfire.spring.XFireSpringServlet

</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>xfireServlet</servlet-name>

<url-pattern>/services/*</url-pattern>

</servlet-mapping>

<!-- end XFire 配置 -->

</web-app>

3、开发应用程序 

    src文件夹下新建一个packagecom.test.wss,在这个包下面新建一个接口:

    业务接口Java代码 

package com.test.wss;

public interface SayHelloService {

  //调用的业务方法

  public String sayHello(String name); 

}

    这个接口是告诉服务器你的WebService哪些方法可以被用户调用的。我们再来写一个SayHelloService的实现类,以完成业务逻辑:

业务接口Java代码 

package com.test.wss;

public class SayHelloServiceImpl implements SayHelloService {

    //业务实现方法

public String sayHello(String name) {

if(name==null){ 

    return "你有名字呢?"

     } 

 return name+",晚上好,还没有下班吗 ?"

}

    这个类实现了sayHello方法,该方法是可以通过WebService调用访问到的。 接下来发布WebService

4、配置部署服务

    在ws/WEB-INF/目录下新建XML文件:applicationContext.xmlxfire-servlet.xml文件内容如下:

    applicationContext.xml代码 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="SayHelloServiceImpl" class="com.test.wss.SayHelloServiceImpl"/>

</beans>

    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="/sh.ws">

<ref bean="SayHelloService"/>

</entry>

</map>

</property>

</bean>

 

<!-- 使用XFire导出器 我们通过XFireExporter将业务类导出为Web Service,对于任何导出器,

我们都需要引入XFire环境,即serviceFactory和xfire,这是标准的配置。ServiceFactory是

XFire的核心类,它可以将一个POJO生成为一个Web Service。在本实例中,我们通过定义一个

baseWebService,其余的webService配置都将该bean作为父bean,这样可以简化Spring的配置,

不需要多次引入serviceFactory和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="SayHelloService" parent="baseWebService">

<!-- 业务服务bean -->

<property name="serviceBean" ref="SayHelloServiceImpl"/>

<!-- 业务服务bean的窄接口类 -->

<property name="serviceClass" value="com.test.wss.SayHelloService"/>

</bean>

</beans>

目录结构

 

 

把工程wss部署到tomcat

5、运行测试应用

    启动Tomcat
    再打开浏览器,输入:http://localhost:8080/wss/sh.ws?wsdl

服务器返回的结果如下:
    

    说明web service发布成功。

    方法1:同工程内调用web service

      新建一个SayHelloClient的客户端:

package com.test.wss.client;

import java.net.MalformedURLException;

import org.codehaus.xfire.client.Client;

import org.codehaus.xfire.client.XFireProxyFactory;

import org.codehaus.xfire.service.Service;

import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import org.codehaus.xfire.transport.http.CommonsHttpMessageSender;

public class SayHelloClient {

public static void main(String args[]) { 

String serviceURL = "http://localhost:8080/wss/sh.ws"

//创建service对象

Service serviceModel = new ObjectServiceFactory().create(SayHelloService.class); 

XFireProxyFactory serviceFactory = new XFireProxyFactory(); 

try

//获取服务对象

SayHelloService service = (SayHelloService) serviceFactory.create(serviceModel, serviceURL); 

Client client = Client.getInstance(service); 

//忽略http连接的超时时间,0为不设置超时时间,》=1为超时毫秒数

client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT"0"); 

String msg = service.sayHello("大兵"); 

System.out.println("服务器对[大兵]的回复:" +  msg); 

 msg = service.sayHello(null); 

System.out.println("服务器对你的回复:" +  msg); 

}catch (MalformedURLException e) { 

    e.printStackTrace();

}

   } 

}

    运行输出结果为:

    服务器对[大兵]的回复:大兵,晚上好,还没有下班吗 ?

    服务器对你的回复:你有名字呢?

    方法2:不在一个工程内调用的客户端的测试:

     新建一个Java工程:wssclient,把工程wss内的com.test.wss.client包拷贝到wssclient功能,进行运行测试。

package com.test.wss.client;

import org.codehaus.xfire.client.Client;

import org.codehaus.xfire.client.XFireProxyFactory;

import org.codehaus.xfire.service.Service;

import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import org.codehaus.xfire.transport.http.CommonsHttpMessageSender;

public class SayHelloNClient {

public static void main(String args[]) { 

String serviceURL = "http://localhost:8080/wss/sh.ws"

//创建service对象

Service serviceModel = new ObjectServiceFactory().create(SayHelloService.class); 

XFireProxyFactory serviceFactory = new XFireProxyFactory(); 

try

//获取服务对象

SayHelloService service = (SayHelloService) serviceFactory.create(serviceModel, serviceURL); 

Client client = Client.getInstance(service); 

//忽略http连接的超时时间,0为不设置超时时间,》=1为超时毫秒数

client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT"0"); 

Object[] results = client.invoke("sayHello",new Object[] { "若轩" });

System.out.println("服务器对[若轩]的回复:" + (String) results[0]); 

results = client.invoke("sayHello",new Object[] {null});

System.out.println("服务器对你的回复:" +  (String) results[0]); 

}catch (Exception e) { 

    e.printStackTrace();

}

}

}

 

    运行输出结果为:

    服务器对[若轩]的回复:若轩,晚上好,还没有下班吗 ?

    服务器对你的回复:你有名字呢?

<!--EndFragment-->
  • 大小: 10.5 KB
  • 大小: 73.9 KB
分享到:
评论
1 楼 917380319 2014-11-20  
找了N多个,就你的能在安卓远程调用,谢谢了

相关推荐

Global site tag (gtag.js) - Google Analytics