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-INF\lib目錄下,同時需要將服務器端發布的服務打包發布給客戶端,發布給客戶端的代碼只需要打包接口和參數類即可,實現類不必打包到客戶端 
這里發布的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM