WebService 學習筆記

1. 目的java

       提供一種服務,能支持任何平臺、任何語言和任何方式訪問,使它們能夠在不一樣平臺,不一樣語言間進行通訊。
 
       利用Eclipse推薦使用的插件XFire 來快速開發WebService, XFire是一個免費的開源SOAP框架, 當使用XFire時,你不須要編寫一行額外的Java代碼。只須要編輯發佈描述符,而後你就會獲得一個Web Services。有利於減小錯誤,提升開發效率,快速提供對外接口,以供客戶端使用。
       利用Eclipse推薦使用的插件XFire 來快速開發WebService,支持任何平臺、任何語言和任何方式訪問。服務採用xfire方式,客戶端有axis、xfire方式兩種。
 
  • XFire是一個免費的開源SOAP框架,它不只能夠極大方便地實現這樣一個環境,而且能夠提供許多Web Services規範中高級特徵,這些特徵在多數的商業或者開源工具都沒有提供。
  • lWeb Service:使咱們可以在網絡上創建分佈式系統,應用程序組件能夠經過任何平臺、任何語言和任何方式訪問。不管應用程序如何開發,使用了什麼語言,以及運行在什麼操做系統平臺上,只要它做爲Web Service,而且爲協同解決問題而設計,那麼你的應用程序,以任何語言開發或在任何平臺上,均可以利用它的服務。
  • XML: 在Web Services環境中各層之間進行傳遞的默認數據格式。因此使用XML是由於它的獨立於編程語言,良好的可擴展性以及強大的工業支持。
  • SOAP: 封裝和交換信息的默認協議。Simple Object Access Protocol(簡單對象訪問協議)的首字母。SOAPXML文檔形式的調用商業方法的規範,它能夠支持不一樣的底層接口,象HTTP(S)或者SMTP。SOAP的強大是由於它簡單。SOAP是一種輕量級的,很是容易理解的技術,而且很容易實現。它有工業支持,能夠從各主要的電子商務平臺供應商那裏得到。從技術角度來看,SOAP詳細指明瞭如何響應不一樣的請求以及如何對參數編碼。一個SOAP封裝了可選的頭信息和正文,而且一般使用HTTP POST方法來傳送到一個HTTP 服務器,固然其餘方法也是能夠的,例如SMTP。SOAP同時支持消息傳送和遠程過程調用。
 
 

基本流程如圖
基本流程圖
  • Webservice 的概念是使用一個標準的輸出接口來定義代碼提供的功能,以便讓外界能夠經過這個標準的輸出接口來調用,而所謂的標準輸出接口就是wsdl,wsdl是一個xml組成的文件,描述了實現程序對外提供函數的原型,客戶端能夠經過wsdl來調用實現程序提供的服務代碼。
  • UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新項目。UDDI 項目中的成員能夠經過UDDI Business Registry (UBR) 來操做Web服務的調用,UBR是一個全球性的服務。 Web服務供應商能夠在UBR中描述而且註冊他們的服務。 用戶能夠在UBR中查找並定位那些他們須要的服務。 UDDI是一種根據描述文檔來引導系統查找相應服務的機制。
  • WSDL
       對於商業用戶來講,要找到一個本身須要使用的服務,他必須知道如何來調用。 WSDL (Web Services Description Language) 規範是一個描述接口,語義以及Web服務爲了響應請求須要常常處理的工做的XML文檔。這將使簡單地服務方便,快速地被描述和記錄。

 

WSDL文檔能夠分爲兩部分。頂部分由抽象定義組成,而底部分則由具體描述組成。抽象部分以獨立於平臺和語言的方式定義SOAP消息,它們並不包含任何隨機器或語言而變的元素。這就定義了一系列服務,大相徑庭的網站均可以實現。隨網站而異的東西如序列化便納入底部分,由於它包含具體的定義。
l. 抽象定義
  Types   獨立與機器和語言的類型定義
  Messages 包括函數參數(輸入與輸出分開)或文檔描述
  PortTypes 引用消息部分中消息定義來描述函數簽名(操做名、輸入參數、輸出參數)
2. 具體定義
  Bindings PortTypes部分的每一操做在此綁定實現
  Services  肯定每一綁定的端口地址

定義方式

各Messages欄使用Types欄的定義,PortTypes欄使用Messages欄的定義;Bindings欄引用了PortTypes欄,Services欄引用Bindings欄,PortTypes和Bindings欄包含了operation元素,而Services欄包含了port元素。PortTypes欄裏的operation元素由Bindings欄裏的operation元素進一步修改或描述。
注意:文檔之中可能只有一個Types欄,或根本沒有。全部其餘的欄能夠只有零元素、單元素或是多元素。WSDL的列表要求全部的欄以固定的順序出現:import, types, message, portType, binding, service。全部的抽象能夠是單獨存在於別的文件中,也能夠從主文檔中導入。
<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="FooSample" targetNamespace="http://tempuri.org/wsdl/"
 xmlns:wsdlns="http://tempuri.org/wsdl/" xmlns:typens="http://tempuri.org/xsd"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"
 xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace="http://tempuri.org/xsd"
  xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"  elementFormDefault="qualified" >
</schema>
</types>
< message name="Simple.foo"> <part name="arg" type="xsd:int"/> </message>
< message name="Simple.fooResponse"><part name="result" type="xsd:int"/ ></message>
< portType name="SimplePortType">
 <operation name="foo" parameterOrder="arg" >
  <input message="wsdlns:Simple.foo"/>
  <output message="wsdlns:Simple.fooResponse"/>
 </operation>
</portType>
< binding name="SimpleBinding" type="wsdlns:SimplePortType">
 <stk:binding preferredEncoding="UTF-8" />
 <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
 <operation name="foo">
  <soap:operation soapAction="http://tempuri.org/action/Simple.foo"/>
  <input>
   <soap:body use="encoded" namespace="http://tempuri.org/message/"
    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
  </input>
  <output>
   <soap:body use="encoded" namespace="http://tempuri.org/message/"
    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
  </output>
 </operation>
</ binding>
 
< service name="FOOSAMPLEService">
 < port name="SimplePort" binding="wsdlns:SimpleBinding">
  <soap:address location="http://carlos:8080/FooSample/FooSample.asp"/>
  </port>
</service>
</definitions>
第一行申明該文檔是XML。儘管這並非必需的,但它有助於XML解析器決定是否解析WSDL文件或只是報錯。
第二行是WSDL文檔的根元素:<definitions>。一些屬性附屬於根元素,就像<schema>子元素對於<types>元素。
<types>元素包含了Types欄。若是沒有須要聲明的數據類型,這欄能夠缺省。在WSDL範例中,沒有應用程序特定的types聲明,但我仍然使用了Types欄,只是爲了聲明schema namespaces。

  <message>元素包含了Messages欄。若是咱們把操做看做函數,<message>元素定義了那個函數的參數。<message>元素中的每一個<part>子元素都和某個參數相符。輸入參數在<message>元素中定義,與輸出參數相隔離--輸出參數有本身的<message>元素。兼做輸入、輸出的參數在輸入輸出的<message>元素中有它們相應的<part>元素。輸出<message>元素以"Response"結尾,就像之前所用的"fooResponse"。每一個<part>元素都有名字和類型屬性,就像函數的參數有參數名和參數類型。
一個PortTypes欄中,能夠有零個、單個或多個<portType>元素。因爲抽象PortType定義能夠放置在分開的文件中,在某個WSDL文件中沒有<portType>元素是可能的。上面的例子裏只是用了一個<portType>元素。而一個<portType>元素可在<operation>元素中定義一個或是多個操做。示例僅使用了一個名爲"foo"的<operation>元素。這和某個函數名相同。<operation>元素能夠有一個、兩個、三個子元素:<input>, <output> 和<fault>元素。每一個<input>和<output>元素中的消息都引用Message欄中的相關的<message>元素。
Bindings欄能夠有零個、一個或者多個<binding>元素。它的意圖是制定每一個<operation>經過網絡調用和迴應。Services欄一樣能夠有零個、一個、多個<service>元素。它還包含了<port>元素,每一個<port>元素引用一個Bindings欄裏的<binding>元素。Bindings和Services欄都包含WSDL文檔。

 
操做系統: winxp或win2k
開發工具: jdk 1.4以上版本,tomcat5.0以上版本+eclipsea3.2
           Myeclipse5.1(可選 )
注意:當使用 jdk1.5 與 tomcat5.0 全出異常。
異常信息爲: provider org.apache.xalan.processor.T
錯誤緣由:
是因爲jdk1.5 與 tomcat5.0之間的關於 TransformerFactoryImpl 類的衝突形成的。
解決方式:將會在異常處理中有詳述。
服務採用xfire方式,客戶端有axis、xfire方式兩種。
5.1 第一步: 新建web Service 工程項目
創建工程項目
點擊 【Next】 進入下一步個操做。
下一步
點擊 【Next】 進入下一步個操做。
 

下一步

點擊 【Next】 進入下一步個操做。 

下一步

此步驟中Xfire 1.2 HTTP Client Libraries 中可選項。
點擊 【Finish】 完成項目建立工做。
web.xml 中配置XFire 的Servlet 及其配置 
 

web.xml 配置

 
5.2 第二步: 提供服務接口
 

服務接口定義 

服務接口定義 

服務接口定義 

服務接口定義

服務端接口定義以下 :

package com.smt.service;
 
/******************************************************
 *
 * 功能描述: WebService Xfire 對象提供服務接口類</br></br>
 *
 * 做者: chenab </br></br>
 *
 * 建立時間: 2011-7-14 上午11:22:26</br></br>
 *
 * 版本號:V1.0 </br></br>
 *****************************************************/
public interface IBankingService {
    public String transferFunds(String fromAccount);
}
 

 
5.3 第三步: 提供服務接口實現類
服務接口實現類以下:

package com.smt.service;
 
/*****************************************************
 *
 * 功能描述: webService XFire 服務接口實現類</br></br>
 *
 * 做者: chenab</br></br>
 *
 * 建立時間: 2011-7-14 上午11:28:47</br></br>
 *
 * 版本號:V1.0 </br></br>
 *******************************************************/
 
public class BankingService implements IBankingService {
 
    public BankingService() {
    }// 空構造不可少
 
    public String transferFunds(String fromAccount) {
       String str=" 恭喜, 服務端測試成功! "+fromAccount;
       System. out.println(str);
       return str;
    }
}
 

 
Web Servivce 的發佈的----- services.xml 的配置 (此步也可手動修改)

services.xml的配置  

生成後的的項目工程結構圖, 以下圖所示:
生成後結構圖
5.4 第四步: 發佈服務
將項目發佈到 Tomcat 服務器,並運行Tomcat ,服務啓動後,在地址欄中輸入以下信息,若是有XML信息生成,則表示Web服務成功。
 

發佈webService

當服務啓動後,打開Eclipse 。
第一步:在eclipse 工具欄上選擇者Web Service Exploer 以下圖1所示。
第二步:在打開的標籤窗口中,選擇WSDL以下圖 2所示。 
第三步:選擇左側 [WSDL Main],在右側將會出現以下圖3所示,在地址欄中輸入「服務地址」。

服務地址

而後點擊 [Go],將在彈出以下圖所示信息,在窗口中輸入 參數信息,而後點擊 [Go],以下圖所示,要下欄出現以下圖信息。
  運行服務
6.1 第一種:JDK 與Tomcat 版本不匹配
  • 異常信息: provider org.apache.xalan.processor .TransformerFactoryImpl
  • 緣由:因爲jdk1.5 與 tomcat5.0之間的關於 TransformerFactoryImpl 類的衝突形成的。tomcat-5.0.28\common\endorsed下有兩個jar包:xercesImpl.jar和xml-apis.jar,其中的類 javax.xml.transform.TransformerFactory與jdk1.5中的類org.apache.xalan.processor.TransformerFactoryImpl實際上是同一個類。
  • 解決辦法一:
  1.  將xml-apis.jar移出endorsed文件夾。 
  2. 用xalan系列jar包替換原來的xercesImpl.jar和xml-apis.jar。 
    xalan系列jar包:serializer.jar、xalan.jar、xercesImpl.jar和xml-apis.jar。
  3. For other application, just check this file or dom3-xml-apis.jar in your class path.
  • 解決辦法二:
        使用 1.4的JDK和tomcat5.0 或者JDK1.5 tomcat5.5 這2種類型纔是匹配。
 
6.2 第二種:JDK低版本沒法執行高版本編譯的類文件
  • 異常信息:java.lang.UnsupportedClassVersionError
  • 緣由:由於咱們使用高版本的JDK編譯的Java class文件試圖在較低版本的JVM上運行,所報的錯誤。錯誤尤爲在JDK5與JDK5以前的版本上表現明顯。由於,JDK5在Java語法上做了很多加強,引入了一些新的.class文件的元素,致使舊版本的JVM沒法解釋、執行.class文件。即便這個類並無使用任何JDK5的新元素,可是JDK5生成的.class文件,JDK1.4及其之前的JVM都沒法辨認!
  • 解決辦法:
  1. 右鍵點擊工程文件,選擇屬性(properties),
  2. 在屬性窗口中選擇 Build-->Java,在右邊的選項中有四個下拉框,就能夠看到編譯選項了,
  3. 其中Compiler和Debug Option能夠不用管,只在Languege features和Target VM中選擇相應的JDK版本就能夠了,而後肯定,一切OK。
6.3 第三種:Jboss 與 Tomcat 間存在共同包衝突
  • 異常信息:The method getJspApplicationContext(ServletContext) is undefined for the type  
  • 緣由:服務器環境Jboss,Java程由Tomcat5.5工程目錄直接拷貝,因爲WEB-INF/lib下存在jsp-api.jar、servlet-api.jar,與Jboss自帶的jar包衝突形成。
  • 解決辦法:刪除WEB工程Lib目錄中的jsp-api.jar、servlet-api.jar,從新啓動Jboss服務問題解決。
     在建立工程時, jsp-api.jar、servlet-api.jar這兩個jar包都無需手工加入到web工程中,tomcat與jboss都已包含。
相關文章
相關標籤/搜索