zoukankan      html  css  js  c++  java
  • WebService之XFire和SOAP实例(基于JAVA)

    开发环境:jdk1.6 + Tomcat7 + MyEclipse10 
    源码下载地址张贴在文章最后面:
    首先是使用WSDL协议实现:这里使用XFire 
    XFire一个免费、开源的SOAP框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,其原理是以接口反射机制自动取得远程方法的 
    WSDL是一个用来描述Web服务和说明如何与Web服务通信的XML语言 

    准备:开发之前请先下载xfire-distribution-1.2.6.zip并解压缩 

    (1)、新建一个Web项目(服务端),名称为XFireWebService,其目的是为了测试WebService服务端 
    为工程添加XFire支持的类库,把xfire-1.2.6里lib所有jar和xfire-all-1.2.6.jar拷贝到工程lib里 

    (2)、把XFire加载到系统中来,增加web.xml的配置信息 

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     
    3.   
    4. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    5.   <servlet>  
    6.     <servlet-name>XFireServlet</servlet-name>  
    7.     <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>  
    8.     <load-on-startup>0</load-on-startup>  
    9.   </servlet>  
    10.   <servlet-mapping>  
    11.     <servlet-name>XFireServlet</servlet-name>  
    12.     <url-pattern>/servlet/XFireServlet/*</url-pattern>  
    13.   </servlet-mapping>  
    14.   <servlet-mapping>  
    15.     <servlet-name>XFireServlet</servlet-name>  
    16.     <url-pattern>/services/*</url-pattern>  
    17.   </servlet-mapping>  
    18.   <welcome-file-list>  
    19.     <welcome-file>index.jsp</welcome-file>  
    20.   </welcome-file-list>  
    21. </web-app>  



    (3)、创建Web服务接口,声明该Web服务对外暴露的接口 

    Java代码  收藏代码
    1. package com.test.ws;  
    2. import java.util.List;  
    3. /** 
    4.  * <p>Title: IHelloService</p> 
    5.  * <p>Description: 定义接口</p> 
    6.  */  
    7. public interface IHelloService {      
    8.     public String getTestString(String str);      
    9.     public ExceedVO getTestObject(EnterVO vo);    
    10.     public List getTestList(List list);  
    11. }  



    (4)、创建Web服务实现类,为Web服务接口提供实现 

    Java代码  收藏代码
    1. package com.test.ws;  
    2. import java.util.ArrayList;  
    3. import java.util.List;  
    4. /** 
    5.  * <p>Title: HelloServiceImpl</p> 
    6.  * <p>Description: 接口实现</p> 
    7.  */  
    8. public class HelloServiceImpl implements IHelloService {  
    9.       
    10.     @Override  
    11.     public String getTestString(String str) {  
    12.         return "Hello" + str;  
    13.     }  
    14.       
    15.     @Override  
    16.     public ExceedVO getTestObject(EnterVO vo) {  
    17.         ExceedVO revo = new ExceedVO();  
    18.         revo.setDescStr("名称:"+vo.getName()+"年龄:"+vo.getAge());  
    19.         return revo;  
    20.     }  
    21.       
    22.     @Override  
    23.     public List getTestList(List list) {      
    24.         List<EnterVO> users = new ArrayList<EnterVO>();       
    25.         for(int i=0; i<9; i++){  
    26.             EnterVO user = new EnterVO("姓名"+i, i);  
    27.             users.add(user);  
    28.         }  
    29.         return users;  
    30.     }  
    31. }  



    (5)、这两个类是具体的业务实现类,对业务方法的具体实现放在里面 

    Java代码  收藏代码
    1. package com.test.ws;  
    2. import java.io.Serializable;  
    3. /** 
    4.  * <p>Title: EnterVO</p> 
    5.  * <p>Description: 入参对象</p> 
    6.  */  
    7. public class EnterVO implements Serializable {  
    8.     private static final long serialVersionUID = 1L;      
    9.     private String name;      
    10.         private int age;     
    11.     public String getName() {  
    12.         return name;  
    13.     }     
    14.     public void setName(String name) {  
    15.         this.name = name;  
    16.     }     
    17.     public int getAge() {  
    18.         return age;  
    19.     }     
    20.     public void setAge(int age) {  
    21.         this.age = age;  
    22.     }     
    23.     public EnterVO(String name, int age) {  
    24.         this.name = name;  
    25.         this.age = age;  
    26.     }     
    27.     public EnterVO() { }  
    28. }  
    29.   
    30. package com.test.ws;  
    31. import java.io.Serializable;  
    32. /** 
    33.  * <p>Title: ExceedVO</p> 
    34.  * <p>Description: 出参对象</p> 
    35.  */  
    36. public class ExceedVO implements Serializable {  
    37.     private static final long serialVersionUID = 1L;      
    38.     private String descStr;  
    39.     public String getDescStr() {  
    40.         return descStr;  
    41.     }  
    42.     public void setDescStr(String descStr) {  
    43.         this.descStr = descStr;  
    44.     }  
    45. }  



    (6)、在src目录下新建一个META-INF/xfire/services.xml,该文件是XFire框架的服务发布文件 

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!-- 服务发布文件 -->  
    3. <beans xmlns="http://xfire.codehaus.org/config/1.0">  
    4.     <service> <!-- service标签和它所包含的xml内容为发布成Web服务的POJO提供完整的描述 -->  
    5.         <name>HelloService</name> <!-- Web服务被发布时所采用的唯一名称 -->  
    6.         <namespace>http://test/HelloService</namespace> <!-- Web服务发布时所使用的命名空间 -->  
    7.         <serviceClass>com.test.ws.IHelloService</serviceClass> <!-- Web服务接口类的全名 -->  
    8.         <implementationClass>com.test.ws.HelloServiceImpl</implementationClass> <!-- Web服务实现类的全名 -->  
    9.         <!-- 不需要接口时,把业务写在serviceClass标签中 -->  
    10.     </service>  
    11. </beans>  



    (7)、注意:当用到List等集合类型时,需要定义Mapping关系 
    必须与接口同名后缀.aegis.xml,而且要与接口同一位置 

    Java代码  收藏代码
    1. <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    2.   xsi:schemaLocation="http://xfire.codehaus.org/schemas/1.0/mapping.xsd">  
    3.     <!-- XFire可以支持基本类型,但针对集合类型时需要特殊配置 -->  
    4.     <mapping>  
    5.          <method name="getTestList"> <!-- 需要配置的方法名 -->  
    6.             <!-- index="0"代表方法的参数的序号0即第一个参数,componentType属性代表集合参数内包含的类型 -->  
    7.             <parameter index="0" componentType="java.lang.String" />   
    8.             <!-- 配置返回类型,componentType属性代表返回的集合中所包含的类 -->  
    9.             <return-type componentType="com.test.ws.EnterVO" />   
    10.         </method>          
    11.    </mapping>     
    12. </mappings>  

        
    web.xml和service.xml都可以通过IDE自动生成,也可以手写 

    (8)、到这步webService服务端就基本完成 
    部署项目,启动Tomcat,测试一下wsdl,访问http://localhost:8080/XFireWebService/services/HelloService?wsdl 
    如果能正确显示wsdl文件,说明刚才的部署成功了!!! 


    (9)、再建一个Web项目(客户端),名称为XFireWebClient,其目的是用来调用一个webService服务 
    将XFire的库文件拷贝到Web项目的WEB-INFlib目录下,同时需要将服务器端发布的服务打包发布给客户端,发布给客户端的代码只需要打包接口和参数类即可,实现类不必打包到客户端 
    这里发布的jar包名称为IHelloService.jar,里面包含IHelloService、EnterVO、ExceedVO这三个类 

    (10)、在这个Web项目里面新建一个Servlet作为测试的Servlet,名称为ClientTestServlet.java 
    在web.xml里面配置好这个Servlet后,就可以在Servlet里面写webService调用的代码了 

    Java代码  收藏代码
    1. package com.test.ws;  
    2. import java.io.IOException;  
    3. import java.net.MalformedURLException;  
    4. import java.util.ArrayList;  
    5. import java.util.List;  
    6. import javax.servlet.ServletException;  
    7. import javax.servlet.http.HttpServlet;  
    8. import javax.servlet.http.HttpServletRequest;  
    9. import javax.servlet.http.HttpServletResponse;  
    10. import org.codehaus.xfire.XFire;  
    11. import org.codehaus.xfire.XFireFactory;  
    12. import org.codehaus.xfire.client.XFireProxyFactory;  
    13. import org.codehaus.xfire.service.Service;  
    14. import org.codehaus.xfire.service.binding.ObjectServiceFactory;  
    15. /** 
    16.  * <p>Title: ClientTestServlet</p> 
    17.  * <p>Description: 测试Servlet</p> 
    18.  */  
    19. public class ClientTestServlet extends HttpServlet {  
    20.   
    21.     private static final long serialVersionUID = 1L;  
    22.   
    23.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
    24.             throws ServletException, IOException {  
    25.           
    26.         request.setCharacterEncoding("UTF-8");    
    27.         Service serviceModel = new ObjectServiceFactory().create(IHelloService.class);         
    28.         XFire xfire = XFireFactory.newInstance().getXFire();  
    29.         XFireProxyFactory factory = new XFireProxyFactory(xfire);       
    30.         String serviceUrl = "http://localhost:8080/XFireWebService/services/HelloService";  
    31.         IHelloService client = null;  
    32.         try {  
    33.             client = (IHelloService) factory.create(serviceModel, serviceUrl);  
    34.         } catch (MalformedURLException e) {  
    35.             e.printStackTrace();  
    36.         }      
    37.           
    38.         String str = client.getTestString("Beijing");  
    39.         request.setAttribute("str", str);  
    40.           
    41.         EnterVO enterVO = new EnterVO();  
    42.         enterVO.setName("Yaodi");  
    43.         enterVO.setAge(26);  
    44.         ExceedVO vo = client.getTestObject(enterVO);  
    45.         request.setAttribute("vo", vo);  
    46.           
    47.         List<String> al = new ArrayList<String>();   
    48.         al.add("111");   
    49.         al.add("222");  
    50.         al.add("333");  
    51.         List list = client.getTestList(al);  
    52.         request.setAttribute("list", list);       
    53.           
    54.         request.getRequestDispatcher("/result.jsp").forward(request, response);  
    55.     }  
    56.   
    57.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
    58.             throws ServletException, IOException {  
    59.         doGet(request,response);  
    60.     }  
    61.       
    62. }  



    客户端的web.xml如下所示: 

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5"   
    3.     xmlns="http://java.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    7.   <servlet>  
    8.     <servlet-name>ClientTestServlet</servlet-name>  
    9.     <servlet-class>com.test.ws.ClientTestServlet</servlet-class>  
    10.   </servlet>  
    11.   <servlet-mapping>  
    12.     <servlet-name>ClientTestServlet</servlet-name>  
    13.     <url-pattern>/ClientTest.do</url-pattern>  
    14.   </servlet-mapping>  
    15.   <welcome-file-list>  
    16.     <welcome-file>ClientTest.do</welcome-file>  
    17.   </welcome-file-list>  
    18. </web-app>  



    (11)、注意:XFireWebService项目里的IHelloService.aegis.xml文件,也要放到XFireWebClient项目中来,位置与ClientTestServlet.java同级 

    (12)、Servlet返回的结果页面:result.jsp 

    Java代码  收藏代码
    1. <%@ page language="java" pageEncoding="UTF-8"%>  
    2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
    3. <%@ page isELIgnored="false"%>  
    4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    5. <html>  
    6.   <head>  
    7.     <title>测试客户端</title>  
    8.   </head>    
    9.   <body>  
    10.     测试客户端!!!<br>  
    11.     String:${str} <br>  
    12.     Object:${vo.descStr} <br>  
    13.     List:<br>  
    14.     <c:forEach items="${list}" var="list">  
    15.         ${list.name} --- ${list.age} <br>  
    16.     </c:forEach>  
    17.   </body>  
    18. </html>  



    (13)、同样将这个Web项目发布,同时启动XFireWebService和XFireWebClient这两个应用,然后在地址栏里面输入http://localhost:8080/XFireWebClient/ 
    此时会调用客户端的Servlet,然后调用其doGet方法,如果正常的话,可以看到页面输出结果了(*^__^*) 

    注:参考文章地址http://di201yao.iteye.com/blog/310292

    源码下载地址(测试通过,下载时需要修改tomcat服务器的端口,我用的端口是18080):http://download.csdn.net/detail/carboncomputer/8445449

  • 相关阅读:
    Java基础之:OOP——继承
    Java基础之:OOP——封装
    使用requireJs进行模块化开发
    git bash 常用操作文件命令行
    requireJs使用
    常用网站
    使用requireJS
    使用echarts水球图
    jquery对象和DOM对象的区别和转换
    "abc123 ,def456",反转字母,其他位置不变
  • 原文地址:https://www.cnblogs.com/zhongshengzhen/p/xfire.html
Copyright © 2011-2022 走看看