風行天下

          JAVA太極
          posts - 4, comments - 10, trackbacks - 0, articles - 55
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          利用XFire開發一個簡單的WebService

          Posted on 2006-12-03 17:08 風太少 閱讀(1087) 評論(0)  編輯  收藏 所屬分類: java編程spring
          你將了解到如何將一個普通的java文件轉換為一個web服務,services.xml文件是如何定義的,如何發布這個web服務、如何獲得這個服務的WSDL。
          首先打開Eclipse,創建一個普通的java工程,將xfire所需的jar和xfire的jar加入到工程所需的類庫引用中。創建一個簡單的java文件,這個java文件簡單到只提供一個add方法。
          版本:xfire-all-1.1.2.jar
          web.xml
          ?1<!--?Context?Param?Configuration?-->
          ?2????<context-param>
          ?3????????<param-name>contextConfigLocation</param-name>
          ?4????????<param-value>
          ?5????????????/WEB-INF/spring/basic-context.xml,?
          ?6????????????/WEB-INF/spring/security-context.xml,?
          ?7????????????/WEB-INF/spring/lookup-context.xml,
          ?8????????????/WEB-INF/struts/security/security-action-bean.xml
          ?9????????????classpath:org/codehaus/xfire/spring/xfire.xml
          10????????</param-value>
          11????</context-param>
          紅色字是我們要添加的,而且必須這么寫。
          還有映射,也是web.xml
          1<servlet>
          2????????<servlet-name>xfire</servlet-name>
          3????????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          4????</servlet>
          5
          6????<servlet-mapping>
          7????????<servlet-name>xfire</servlet-name>
          8????????<url-pattern>/xfire/*</url-pattern>
          9????</servlet-mapping>

          然后在WEB-INF下新增一個文件
          xfire-servlet.xml

          ?1<?xml?version="1.0"?encoding="UTF-8"?>
          ?2<!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd">
          ?3<beans>
          ?4????<bean?class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          ?5????????<property?name="urlMap">
          ?6????????????<map>
          ?7????????????????<entry?key="/mathBean">
          ?8????????????????????<ref?bean="math"/>
          ?9????????????????</entry>
          10????????????</map>
          11????????</property>
          12????</bean>
          13????
          14????<!--?Declare?a?parent?bean?with?all?properties?common?to?both?services?-->
          15????<bean?id="math"?class="org.codehaus.xfire.spring.remoting.XFireExporter">
          16????????<property?name="serviceFactory">
          17????????????<ref?bean="xfire.serviceFactory"/>
          18????????</property>
          19????????<property?name="xfire">
          20????????????<ref?bean="xfire"/>
          21????????</property>
          22????????<property?name="serviceBean">
          23????????????<ref?bean="mathBean"/>
          24????????</property>
          25????????<property?name="serviceClass">
          26????????????<value>cn.redstoneinfo.oss.security.inteface.MathService</value>
          27????????</property>
          28????</bean>
          29????
          30
          31</beans>
          這里的<property?name="xfire">
          ?????????????????? <ref?bean="xfire"/>
          ????????? </property>
          就這么寫,不用想別的,而
          ?????????? <property?name="serviceBean">
          ????????????<ref?bean="mathBean"/>
          ????????</property>
          需要調用你自己的實現類bean的聲明。我的是:
          1<bean?id="mathBean"?class="cn.redstoneinfo.oss.security.util.MathServiceImpl"/>

          接口:
          ?1package?cn.redstoneinfo.oss.security.inteface;
          ?2
          ?3/**
          ?4?*?define?the?MathService.java
          ?5?*?Create?at?2006-9-14?下午02:59:59
          ?6?*??
          ?7?*?@version?1.0
          ?8?*?@author?zhangli
          ?9?*/

          10public?interface?MathService?
          11
          12{?
          13
          14??public?long?add(int?p1,?int?p2);?
          15
          16}
          ?
          實現類:
          ?1package?cn.redstoneinfo.oss.security.util;
          ?2
          ?3import?cn.redstoneinfo.oss.security.inteface.MathService;
          ?4
          ?5/**
          ?6?*?define?the?MathServiceImpl.java
          ?7?*?Create?at?2006-9-14?下午03:00:40
          ?8?*??
          ?9?*?@version?1.0
          10?*?@author?zhangli
          11?*/

          12public?class?MathServiceImpl?implements?MathService?
          13
          14{?
          15
          16??public?long?add(int?p1,?int?p2)?
          17
          18??{?
          19
          20????return?p1?+?p2;?
          21
          22??}
          ?
          23
          24}
          ?
          配置完成后,啟動tomcat,用http://127.0.0.1:8080/nextoss1/xfire/mathBean?wsdl可以看到wsdl的描述。

          ?1<?xml?version="1.0"?encoding="UTF-8"?>
          ?2<wsdl:definitions?xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"?xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"?xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/"?xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"?xmlns:tns="http://inteface.security.oss.redstoneinfo.cn"?xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"?targetNamespace="http://inteface.security.oss.redstoneinfo.cn">
          ?3??<wsdl:types>
          ?4????<xsd:schema?targetNamespace="http://inteface.security.oss.redstoneinfo.cn"?elementFormDefault="qualified"?attributeFormDefault="qualified">
          ?5??????<xsd:element?name="add">
          ?6????????<xsd:complexType>
          ?7??????????<xsd:sequence>
          ?8????????????<xsd:element?name="in0"?type="xsd:int"?minOccurs="1"?maxOccurs="1"?/>
          ?9????????????<xsd:element?name="in1"?type="xsd:int"?minOccurs="1"?maxOccurs="1"?/>
          10??????????</xsd:sequence>
          11????????</xsd:complexType>
          12??????</xsd:element>
          13??????<xsd:element?name="addResponse">
          14????????<xsd:complexType>
          15??????????<xsd:sequence>
          16????????????<xsd:element?name="out"?type="xsd:long"?minOccurs="1"?maxOccurs="1"?/>
          17??????????</xsd:sequence>
          18????????</xsd:complexType>
          19??????</xsd:element>
          20????</xsd:schema>
          21??</wsdl:types>
          22??<wsdl:message?name="addResponse">
          23????<wsdl:part?element="tns:addResponse"?name="parameters"?/>
          24??</wsdl:message>
          25??<wsdl:message?name="addRequest">
          26????<wsdl:part?element="tns:add"?name="parameters"?/>
          27??</wsdl:message>
          28??<wsdl:portType?name="MathServicePortType">
          29????<wsdl:operation?name="add">
          30??????<wsdl:input?message="tns:addRequest"?name="addRequest"?/>
          31??????<wsdl:output?message="tns:addResponse"?name="addResponse"?/>
          32????</wsdl:operation>
          33??</wsdl:portType>
          34??<wsdl:binding?name="MathServiceHttpBinding"?type="tns:MathServicePortType">
          35????<wsdlsoap:binding?style="document"?transport="http://schemas.xmlsoap.org/soap/http"?/>
          36????<wsdl:operation?name="add">
          37??????<wsdlsoap:operation?soapAction=""?/>
          38??????<wsdl:input?name="addRequest">
          39????????<wsdlsoap:body?use="literal"?/>
          40??????</wsdl:input>
          41??????<wsdl:output?name="addResponse">
          42????????<wsdlsoap:body?use="literal"?/>
          43??????</wsdl:output>
          44????</wsdl:operation>
          45??</wsdl:binding>
          46??<wsdl:service?name="MathService">
          47????<wsdl:port?binding="tns:MathServiceHttpBinding"?name="MathServiceHttpPort">
          48??????<wsdlsoap:address?location="http://127.0.0.1:8080/nextoss1/xfire/mathBean"?/>
          49????</wsdl:port>
          50??</wsdl:service>
          51</wsdl:definitions>
          52
          53

          Web服務定義語言(Web Services Definition Language,WSDL)是一個建議性標準,用于描 述Web服務的技術調用語法。WSDL定義了一套基于 XML的語法,將Web服務描述為能夠進行消息交換的服務訪問點的集合,從而滿足了這種需求。WSDL服務定義為分布式系統提供了可機器識別的SDK文檔,并且可用于描述自動執行應用程序通信中所涉及的細節。WSDL的當前版本是1.1,規范可以從http://www.w3.org/TR/wsdl獲得。

            WSDL就是描述XMLWeb服務的標準XML格式,WSDL由Ariba、Intel、IBM微軟等開發商提出。它用一種和具體語言無關的抽象方式定義了給定Web服務收發的有關操作和消息。就其定義來說,你還不能把WSDL當作一種對象接 口定義語言,例如,CORBA或COM等應用程序體系結構就會用到對象接口定義語言。 WSDL保持協議中立,但它確實內建了綁定SOAP的支持,從而同SOAP建立了不可分割的聯系。

            WSDL服務描述是一個XML文檔,它與WSDL模式(schema)的定義一致。WSDL文檔并不是完整的服務描述,而只包括了服務描述任務的較低層次,即:服務接口的原始技術描述。WSDL是Web服務的接口定義語言IDL(Interface Definition Language,),本質上,WSDL描述說明的是Web服務的以下三個基本屬性:

            服務做些什么--服務所提供的操作(方法)。
            如何訪問服務--數據格式詳情以及訪問服務操作的必要協議。
            服務位于何處--由特定協議決定的網絡地址,如URL。

          1、WSDL信息模型

            WSDL信息模型充分利用了抽象規范與規范具體實現的分離,也就是分離了服務接口定義(抽象接口)與服務實現定義(具體端點)。 抽象接口規范描述了終端的處理能力,它在WSDL中表示為portType。束定機制 (binding mechanism)在WSDL中表示為binding元素,它使用特定的通信協議、數據編碼模型和底層通信協議,將Web服務的抽象定義映射至特定實現。若束定結合了實現的訪問地址,抽象端點也就成為可供服務請求者調用的具體端點(concrete endpoint),WSDL的port元素表示了這一結合。

            抽象接口可以支持任何數量的操作(operations)。操作是由一組消息(messages)定義,消息定義了操作的交互定式。與抽象的消息、操作概念相對應的具體實現是由binding元素指定。與XML應用相同,WSDL模式定義了幾個高層元素,或稱為主要元素。在WSDL中,Web服務描述中的主要元素如下:

            Types,定義了Web服務使用的所有數據類型集合,可被元素的各消息部件所引用。它使用某種類型系統(一般地使用XMLSchema中的類型系統)。
            Message,通信消息數據結構的抽象類型化定義。使用Types所定義的類型來定義整個消息的數據結構。
            Operation,對服務中所支持操作的抽象描述。一般單個Operation描述了一個訪問入口的請求/響應消息對。
            PortType,對于某個訪問入口點類型所支持操作的抽象集合。這些操作可以由一個或多個服務訪問點來支持。
            Binding,包含了如何將抽象接口的元素(portType)轉變為具體表示的細節,具體表示也就是指特定的數據格式和協議的結合;特定端口類型的具體協議和數據格式規范的綁定。
            Port,定義為協議/數據格式綁定與具體Web訪問地址組合的單個服務訪問點。
            Service,這是一個粗糙命名的元素,代表端口的集合;相關服務訪問點的集合。

            因此,portType(與message和type元素的細節相結合)描述了Web服務是什么,binding元素描述了如何使用Web服務,port及service元素描述了Web服務的位置。
          2、WSDL對象結構圖

            從圖2所示的WSDL對象結構圖可知,一個WSDL文檔中可以包含一個Types,多個Message、PortType、Binding和Service。


          ?

            其中,Types是一個數據類型定義的容器,包含了所有在消息定義中需要的XML元素的類型定義。

            Message具體定義了在通信中使用的消息的數據結構,Message元素包含了一組Part元素,每個Part元素都是最終消息的一個組成部分,每個Part都會引用一個DataType來表示它的結構。Part元素不支持嵌套(可以使用DataType來完成這方面的需要),都是并列出現。

            PortType具體定義了一種服務訪問入口的類型(傳入/傳出消息的模式及其格式),一個PortType可以包含若干個Operation,而一個Operation則是指訪問入口支持的一種類型的調用。在WSDL里面支持四種訪問入口調用的模式:1) 單請求; 2) 單響應; 3) 請求/響應; 4) 響應/請求。在這里請求指的是從客戶端到Web服務端,而響應指的是從Web服務端到客戶端。PortType的定義中會引用消息定義部分的一個到兩個消息,作為請求或響應消息的格式。

            Service描述的是一個具體的被部署的Web服務所提供的所有訪問入口的部署細節,一個Service往往會包含多個服務訪問入口,而每個訪問入口都會使用一個Port元素來描述。

            Port描述的是一個服務訪問入口的部署細節,包括通過哪個Web地址(URL)來訪問,應當使用怎樣的消息調用模式來訪問等。其中消息調用模式則是使用Binding結構來表示。

            Binding結構定義了某個PortType與某一種具體的網絡傳輸協議或消息傳輸協議相綁定,從這一層次開始,描述的內容就與具體服務的部署相關了。比如可以將PortType與SOAP/HTTP綁定,也可以將PortType與MIME/SMTP相綁定等。


          ?


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 万全县| 枣强县| 和静县| 泗洪县| 安义县| 合阳县| 临清市| 巴林左旗| 宝坻区| 宁陵县| 庄浪县| 深泽县| 龙胜| 寻甸| 通榆县| 中阳县| 安泽县| 鲜城| 瑞昌市| 寻乌县| 大兴区| 井陉县| 遵义市| 黄山市| 延庆县| 炎陵县| 乌兰浩特市| 隆德县| 尼木县| 阳朔县| 福州市| 两当县| 太仓市| 博罗县| 巩留县| 岢岚县| 乌兰浩特市| 建宁县| 德令哈市| 宜丰县| 宁明县|