風(fēng)行天下

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

          利用XFire開發(fā)一個簡單的WebService

          Posted on 2006-12-03 17:08 風(fēng)太少 閱讀(1087) 評論(0)  編輯  收藏 所屬分類: java編程spring
          你將了解到如何將一個普通的java文件轉(zhuǎn)換為一個web服務(wù),services.xml文件是如何定義的,如何發(fā)布這個web服務(wù)、如何獲得這個服務(wù)的WSDL。
          首先打開Eclipse,創(chuàng)建一個普通的java工程,將xfire所需的jar和xfire的jar加入到工程所需的類庫引用中。創(chuàng)建一個簡單的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>
          需要調(diào)用你自己的實現(xiàn)類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}
          ?
          實現(xiàn)類:
          ?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服務(wù)定義語言(Web Services Definition Language,WSDL)是一個建議性標(biāo)準(zhǔn),用于描 述Web服務(wù)的技術(shù)調(diào)用語法。WSDL定義了一套基于 XML的語法,將Web服務(wù)描述為能夠進(jìn)行消息交換的服務(wù)訪問點的集合,從而滿足了這種需求。WSDL服務(wù)定義為分布式系統(tǒng)提供了可機(jī)器識別的SDK文檔,并且可用于描述自動執(zhí)行應(yīng)用程序通信中所涉及的細(xì)節(jié)。WSDL的當(dāng)前版本是1.1,規(guī)范可以從http://www.w3.org/TR/wsdl獲得。

            WSDL就是描述XMLWeb服務(wù)的標(biāo)準(zhǔn)XML格式,WSDL由Ariba、Intel、IBM微軟等開發(fā)商提出。它用一種和具體語言無關(guān)的抽象方式定義了給定Web服務(wù)收發(fā)的有關(guān)操作和消息。就其定義來說,你還不能把WSDL當(dāng)作一種對象接 口定義語言,例如,CORBA或COM等應(yīng)用程序體系結(jié)構(gòu)就會用到對象接口定義語言。 WSDL保持協(xié)議中立,但它確實內(nèi)建了綁定SOAP的支持,從而同SOAP建立了不可分割的聯(lián)系。

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

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

          1、WSDL信息模型

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

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

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

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

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


          ?

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

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

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

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

            Port描述的是一個服務(wù)訪問入口的部署細(xì)節(jié),包括通過哪個Web地址(URL)來訪問,應(yīng)當(dāng)使用怎樣的消息調(diào)用模式來訪問等。其中消息調(diào)用模式則是使用Binding結(jié)構(gòu)來表示。

            Binding結(jié)構(gòu)定義了某個PortType與某一種具體的網(wǎng)絡(luò)傳輸協(xié)議或消息傳輸協(xié)議相綁定,從這一層次開始,描述的內(nèi)容就與具體服務(wù)的部署相關(guān)了。比如可以將PortType與SOAP/HTTP綁定,也可以將PortType與MIME/SMTP相綁定等。


          ?


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 体育| 广汉市| 府谷县| 大同县| 休宁县| 镇宁| 蒲江县| 漠河县| 泸定县| 大宁县| 临沂市| 岳普湖县| 且末县| 赣榆县| 宿州市| 东明县| 青阳县| 正阳县| 安乡县| 乌鲁木齐县| 泗洪县| 阜平县| 庆安县| 涟水县| 武定县| 莱西市| 鄂伦春自治旗| 安庆市| 盱眙县| 永平县| 专栏| 汉川市| 平顺县| 宁阳县| 曲麻莱县| 荆门市| 大悟县| 平舆县| 五指山市| 乌恰县| 宜良县|