當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          Web Service定義了一套標準的調用過程:
          • 服務器端首先用一套標準的方法向外界描述它所提供的服務的內容,這屬于WSDL的范疇。
          • 客戶端需要以一種標準的協議來調用此服務,這屬于SOAP的范疇。
          • 服務提供者將服務內容放在一個公共的網址上讓人查詢,這屬于UDDI的范疇。
          WSDL:服務內容的標準化描述
          WSDL的目的是告訴外界自己能提供什么樣的服務,有點類似于java的接口。
          WSDLd的全稱是Web Service Description Language,是一種基于XML的關于Web服務的描述,主要目的在于將自己的Web服務的所有相關內容如提供服務的傳輸方式,服務方法接口,接口參數,服務路徑等,生成相應的完全的文檔,發布給使用者。使用者可以通過這個WSDL文檔,創建相應的SOAP請求消息,通過HTTP傳遞給Web服務提供者;Web服務提供者在完成請求服務后,將SOAP返回消息傳回給請求者,服務請求者再根據WSDL文檔將SOAP返回消息解析成程序能夠理解的內容。

          SOAP:標準的傳輸協議
          SOAP是標準化的消息協議,是客戶端送給服務器希望調用的類和方法的一種消息格式,也包括服務返回的消息格式。之所以有SOAP是因為只有大家都遵守一套消息格式的標準,相互之間才能明白對方想要干什么。
          SOAP是Web Service的標準傳輸協議,是Simple Object Application Propotol的簡寫,是一種標準化的傳輸消息的XML格式。
          SOAP請求消息將客戶端的服務請求消息發給服務器,比如想調用什么接口,以及接口的參數值等。SOAP答復消息是從服務器返回給客戶端的消息,如接口實現類調用后的返回值或是調用服務時的錯誤信息等。定義WSDL是很重要的,一旦WSDL定義好了,再根據WSDL的輸入變量和輸出變量的結構就可以知道SOAP的請求消息和響應消息的格式了。

          UDDI:服務的公共網址
          UDDI是Universal Description Discovery and Intergretion的縮寫,是一種創建注冊服務的規范,以便大家將自己的Web Service進行注冊發布供使用者查找。
          當服務提供者想將自己的Web Service發布,以便外部能找到其服務時,那么服務提供這可以將自己的Web Service注冊到相應的UDDI商用注冊網站。
          UDDI并非一個必須的Web Service組件,服務方完全可以不進行UDDI的注冊。因為WSDL文件中已經給出了Web Service的地址URI,外部可以通過它進行相應的Web Service調用。

          以下是一個Web Service示例程序,主要參考了梁愛虎的《SOA 思想,技術與系統集成應用詳解》中的例子:

          發布Web服務的類接口:
          package com.heyang;

          /**
           * 生成序列號的接口
           * 
          @author: 何楊(heyang78@gmail.com)
           * @date: 2009-9-29-下午12:37:55
           
          */
          public interface ISerial{
              
          /**
               * 傳入類型,返回序列號
               * 
          @param type
               * 
          @return
               
          */
              
          public String getSN(String type);
          }

          發布web服務的類:
          package com.heyang;

          import java.text.MessageFormat;

          /**
           * ISerial的實現類
           * 
          @author: 何楊(heyang78@gmail.com)
           * @date: 2009-9-29-下午12:40:05
           
          */
          public class SerialService implements ISerial{
              
          private static int number;
              
              
          /**
               * 產生SN:CD-000001的序列號
               * MessageFormat的用法可參考http://hi.baidu.com/gacmotor/blog/item/372b4a3a0b010de314cecb0b.html
               
          */
              
          public String getSN(String type) {
                  number
          ++;
                  Object[] arr
          =new Object[]{type,number};
                  String result
          =MessageFormat.format("SN:{0}-{1,number,000000}",arr);
                  
          return result;
              }
              
              
          public static void main(String[] args){
                  SerialService s
          =new SerialService();        
                  System.out.println(s.getSN(
          "CD"));
              }
          }

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

          <web-app > 
              
          <servlet>
                  
          <servlet-name>AxisServlet</servlet-name>
                  
          <servlet-class>
                      org.apache.axis.transport.http.AxisServlet
                  
          </servlet-class>
              
          </servlet>

              
          <servlet-mapping>
                  
          <servlet-name>AxisServlet</servlet-name>
                  
          <url-pattern>/servlet/AxisServlet</url-pattern>
              
          </servlet-mapping>

              
          <servlet-mapping>
                  
          <servlet-name>AxisServlet</servlet-name>
                  
          <url-pattern>*.jws</url-pattern>
              
          </servlet-mapping>
              
              
          <servlet-mapping>
                  
          <servlet-name>AxisServlet</servlet-name>
                  
          <url-pattern>/services/*</url-pattern>
              
          </servlet-mapping>
          </web-app>

          wsdd文件server-config.wsdd
          <?xml version="1.0" encoding="UTF-8"?>
          <deployment xmlns="http://xml.apache.org/axis/wsdd/"
              xmlns:java
          ="http://xml.apache.org/axis/wsdd/providers/java">
              
          <handler type="java:org.apache.axis.handlers.http.URLMapper"
                  name
          ="URLMapper" />
              
          <service name="fetchSerialNumber" provider="java:RPC">
                  
          <parameter name="className" value="com.heyang.SerialService" />
                  
          <parameter name="allowedMethods" value="getSN" />
              
          </service>
              
          <transport name="http">
                  
          <requestFlow>
                      
          <handler type="URLMapper" />
                  
          </requestFlow>
              
          </transport>
          </deployment>

          測試類:
          package com.heyang.client;

          import java.net.MalformedURLException;
          import java.rmi.RemoteException;

          import javax.xml.rpc.ServiceException;

          import org.apache.axis.client.Call;
          import org.apache.axis.client.Service;

          /**
           * WebServiceClientTest
           * 
          @author: 何楊(heyang78@gmail.com)
           * @date: 2009-9-29-下午01:03:05
           
          */
          public class WebServiceClientTest {
              
          public static void main(String[] args) throws ServiceException,
                      MalformedURLException, RemoteException {
                  
          // 標識Web Service的具體路徑
                  /**
                   * SerialNumber:發布到Tomcat上的war的名稱,采用工程名
                   * services:固定寫法,與Web.xml中設定對應
                   * fetchSerialNumber:server-config.wsdd中設定的service名
                   
          */
                  String endpoint 
          = "http://localhost:8080/SerialNumber/services/fetchSerialNumber";

                  
          // 創建 Service實例
                  Service service = new Service();
                  
                  
          // 通過Service實例創建Call的實例
                  Call call = (Call) service.createCall();
                  
                  
          // 將Web Service的服務路徑加入到call實例之中.
                  call.setTargetEndpointAddress(new java.net.URL(endpoint));// 為Call設置服務的位置
                  
                  
          // 調用Web Service的方法
                  call.setOperationName("getSN");
                  
                  
          // 調用Web Service,傳入參數
                  String retval = (String) call.invoke(new Object[] { "CD" });
                  
                  System.out.println(retval);
              }
          }

          輸出示例:
          SN:CD-000004


          例程下載(使用Axis,注意Tomcat的lib目錄中要包括mail.jar和activation.jar):
          http://www.aygfsteel.com/Files/heyang/SerialNumber20090929130453.rar

          使用說明:
          使用Ant腳本將jar包打好,再部署到Tomcat中,可以用http://localhost:8080/SerialNumber/services來測試一下是否有輸出,有則表示部署成功,之后執行WebServiceClientTest。

          主要參考資料:
          梁愛虎著《SOA 思想,技術與系統集成應用詳解》
          posted on 2009-09-29 14:09 何楊 閱讀(432) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 高州市| 新干县| 施甸县| 福贡县| 霍林郭勒市| 淳安县| 安康市| 招远市| 儋州市| 朔州市| 南康市| 滕州市| 湄潭县| 甘泉县| 冷水江市| 秦皇岛市| 屏南县| 高淳县| 孝义市| 永济市| 富源县| 乳山市| 扎赉特旗| 阜平县| 新竹市| 武威市| 湛江市| 抚远县| 通渭县| 瑞金市| 黄龙县| 泰来县| 浦北县| 大化| 湖口县| 全州县| 长武县| 东丽区| 武乡县| 淮安市| 大洼县|