本文使用的工具:
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包
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
图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>
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()); } }