1、准备开发环境
环境:MyEclipse xx +tomcat6.0+JDK1.5
xfire版本:xifre-1.2.6
XFire所需jar包:
在http://xfire.codehaus.org/下载xfire1.2.6-.zip压缩包,解压后lib下jar包
在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文件夹下新建一个package:com.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.xml和xfire-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(); } } } |
运行输出结果为:
服务器对[若轩]的回复:若轩,晚上好,还没有下班吗 ?
服务器对你的回复:你有名字呢?