Java編程中應用XFire框架挪用WebService法式接口。本站提示廣大學習愛好者:(Java編程中應用XFire框架挪用WebService法式接口)文章只能為提供參考,不一定能成為您想要的結果。以下是Java編程中應用XFire框架挪用WebService法式接口正文
JAVA挪用webservice,當你剛開端接觸的時刻你會認為它是一個噩夢,特殊是沒有一個同一的尺度完成,比起.net的那些幾步便可以完成的webservice完成,我們看著JAVA的完成真是悲傷啊。但就算是悲傷,我們也照樣要完成的。JAVA也不乏比擬好的完成,如xfire,jersey,CXF。 這裡我們就一路來看一下xfire的完成。
1)起首,固然是要下包啦,這個通俗人都曉得。http://xfire.codehaus.org/Download可以到這裡去下,可以下all也能夠下distribution。但建議照樣下all的,省得一堆奇異的成績弄得你一點信念都沒了。
包弄上去了那末怎樣辦呢?放進項目裡啊。貌似空話,但許多人就是不曉得下上去要干甚麼用。
建一個新項目,比擬我的是xfireWebservice,這裡固然是建web項目啦。
我這裡是把它一切的包都放到這外面了,究竟我們寫例子,就沒需要挑三揀四了,隨意點吧,假如想看看異常信息的同伙可以不把全體放出來,漸漸地參加,今後碰到毛病也好消除,但我們這裡就不那末做了,究竟普通缺乏甚麼類那些的異常沒甚麼好看的,年夜家可以本身消除。
2)我們起首來懂得一下xfire與其他webservice框架的分歧,它最年夜的分歧的地方在於它須要一個接口,並且假如須要用xfire來挪用響應的webservice必需曉得接口的界說,感到這裡有點限制了。但除這點,xfire挪用webservice,那是相當的便利,就跟挪用當地辦法一樣。我們直接來看例子:
起首是最主要的接口:
public interface IReaderService { public Reader getReader(String name,String password); public List<Reader> getReaders(); } 有接口,固然也要有完成類,否則接口就沒甚麼意義了。 public class ReaderService implements IReaderService{ public Reader getReader(String name,String password) { return new Reader(name,password); } public List<Reader> getReaders(){ List<Reader> readerList = new ArrayList<Reader>(); readerList.add(new Reader("shun1","123")); readerList.add(new Reader("shun2","123")); return readerList; } }
也看一下JAVABEAN,Reader類:
public class Reader{ private static final long serialVersionUID = 1L; private String name; private String password; public Reader(){} public Reader(String name,String password) { this.name = name; this.password = password; } //Get/Set辦法省略 public String toString(){ return "Name:"+name+",Password:"+password; } }
留意,我們這裡的Reader類完成了Serializable接口,為何呢?這裡,起首我們須要懂得webservice的道理,關於JAVA來說,假如我們須要在互聯網上傳對象,許多人固然會想到序列化,對了,這裡就是序列化,由於我們須要把reader作為參數來傳遞。這在之前的版本中是須要強迫完成,不然會報錯,但如今的最新的版本(其實最新的也是07年的,由於xfire曾經停滯開辟,被apache歸並為CXF項目,這個我們以後再講)曾經不須要了,至因而用甚麼方法完成的,我們這裡臨時不深究,由於它曾經被歸並到CXF中,我們假如要深刻進修,應當進修CXF較好。
3)當我們完成下面的接口和JAVABEAN的編寫後,許多人會問,我看許多webservice都邑有WSDL文件,那你這個怎樣來的?在講這個之前,我們來評論辯論一下甚麼是WSDL。或許許多公司供給的接口都照樣只是一個HTTP地址,前往XML如許的格局,我們的也是。這有一個利益,也有一個害處。利益是我們開辟的難度小了,而害處是我們須要供給給用戶一堆解釋文件,每一個前往的XML標簽是甚麼意思,這倒也沒啥,但就是比擬煩罷了。而webservice呢,害處就是我們開辟的器械略微多了點,而利益是我們不消再寫那末多解釋文件,由於有一個同一的解釋,叫WSDL,這個是webservice的解釋文檔,是同一的,不管甚麼說話都一樣,所以不存在誰看不懂的成績。
而這裡,當我們安排完成xfire後,它便可以幫我們生成WSDL文件。
成績是怎樣安排,這個其實也簡略。我們在src目次下新建一個文件夾META-INF,再建它的一個字文件夾xfire,外面樹立文件services.xml。以後的構造以下:
有人會問為何要建到src目次下,其實不是劃定建到這裡的,但由於我們須要閃開發對象幫我們本身安排這幾個文件,所以我們放到這裡,eclipse便可以幫我們本身安排到tomcat或許其他的容器中。留意,這個文件地點文件夾條理是固定的,弗成以修正。
我們直接看一下servics.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <!-- webserviceq稱號,挪用時須要指定這個 --> <name>readerService</name> <!-- 這個普通是本身公司的網址,意義不年夜 --> <namespace>http://test/HelloService</namespace> <!-- 接口類 --> <serviceClass>com.xfire.servlet.IReaderService</serviceClass> <!-- 完成類 --> <implementationClass>com.xfire.servlet.ReaderService</implementationClass> </service> </beans>
看著正文普通都沒成績的。
4)許多人認為如許就好了,不,還沒行,你指定了這個,那他人怎樣拜訪呢。怎樣把響應的要求轉發到xfire那邊,讓它停止處置呢。這裡又須要修正web.xml了。
修正後以下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> </web-app>
其實也就是添加了一個servlet和對應的mapping。接上去,我們在閱讀器上直接輸出:
http://localhost:8080/xfireWebService/services/readerService?wsdl
我們可以看到:
這裡顯示的就是wsdl,它會顯示我們界說的辦法,前往的類型。前面有對WSDL的講授。
5)下面四步完成後,我們就完成了webservice的安排了。他人便可以挪用響應的webservice來拜訪我們的辦法了。上面我們就用xfire供給的client來拜訪一下我們適才宣布的webservice:
public class ReaderClient { public static void main(String[] args) { //這裡是創立一個service,須要傳入一個接口類,由於我們前面必需挪用響應的接口辦法 Service srcModel = new ObjectServiceFactory().create(IReaderService.class); //署理工場,這裡是為了前面創立響應的接口類 XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire()); //webservice地址,不須要加wsdl String readerServiceUrl = "http://localhost:8080/xfireWebService/services/readerService"; try { //應用工場前往響應的接口類 IReaderService readerService = (IReaderService)factory.create(srcModel,readerServiceUrl); Reader reader = readerService.getReader("shun","123"); System.out.println(reader); } catch (MalformedURLException e) { e.printStackTrace(); } } }
如許,我們看到輸入成果為:
wsdl文件構造剖析
WSDL (Web Services Description Language,Web辦事描寫說話)是一種XML Application,他將Web辦事描寫界說為一組辦事拜訪點,客戶端可以經由過程這些辦事拜訪點對包括面向文檔信息或面向進程挪用的辦事停止拜訪(相似長途進程挪用)。WSDL起首對拜訪的操作和拜訪時應用的要求/呼應新聞停止籠統描寫,然後將其綁定到詳細的傳輸協定和新聞格局上以終究界說詳細安排的辦事拜訪點。相干的詳細安排的辦事拜訪點經由過程組合就成為籠統的Web辦事。 本文將具體講授WSDL文檔的構造,並剖析每一個元素的感化。
一:WSDL界說
WSDL是一個用於准確描寫Web辦事的文檔,WSDL文檔是一個遵守WSDL XML形式的XML文檔。WSDL 文檔將Web辦事界說為辦事拜訪點或端口的聚集。在 WSDL 中,因為辦事拜訪點和新聞的籠統界說已從詳細的辦事安排或數據格局綁定平分離出來,是以可以對籠統界說停止再次應用:新聞,指對交流數據的籠統描寫;而端口類型,指操作的籠統聚集。用於特定端口類型的詳細協定和數據格局標准組成了可以再次應用的綁定。將Web拜訪地址與可再次應用的綁定相干聯,可以界說一個端口,而端口的聚集則界說為辦事。
一個WSDL文檔平日包括7個主要的元素,即types、import、message、portType、operation、binding、 service元素。這些元素嵌套在definitions元素中,definitions是WSDL文檔的根元素。文章的下一部門將會具體引見WSDL 的根本構造。
二:WSDL的根本構造--概述
如第一部門最初描寫的那樣,一個根本的WSDL文檔包括7個主要的元素。上面將分離引見這幾個元素和他們的感化。
WSDL 文檔在Web辦事的界說中應用以下元素:
· Types - 數據類型界說的容器,它應用某品種型體系(普通地應用XML Schema中的類型體系)。
· Message - 通訊新聞的數據構造的籠統類型化界說。應用Types所界說的類型來界說全部新聞的數據構造。
· Operation - 對辦事中所支撐的操作的籠統描寫,普通單個Operation描寫了一個拜訪進口的要求/呼應新聞對。
· PortType - 關於某個拜訪進口點類型所支撐的操作的籠統聚集,這些操作可以由一個或多個辦事拜訪點來支撐。
· Binding - 特定端口類型的詳細協定和數據格局標准的綁定。
· Port - 界說為協定/數據格局綁定與詳細Web拜訪地址組合的單個辦事拜訪點。
· Service- 相干辦事拜訪點的聚集。
WSDL的xml schema可以參照以下網址:http://schemas.xmlsoap.org/wsdl/
三:WSDL的根本構造--胪陳
本節將經由過程一個例子具體描寫WSDL文檔每一個元素的感化。上面一個例子是一個簡略的WSDL文檔的內容,該文檔的發生可以拜見我的別的一篇文章:xfire開辟實例--HelloWorld篇 。
一個簡略的Web Service的WSDL文檔,該辦事支撐名為sayHello的獨一操作,該操作經由過程在http上運轉SOAP協定來完成的。該要求接收一個字符串name,經由處置後前往一個簡略的字符串。文檔以下:
<?xml version="1.0" encoding="UTF-8" ?> <wsdl:definitions targetNamespace="http://com.liuxiang.xfireDemo/HelloService" xmlns:tns="http://com.liuxiang.xfireDemo/HelloService" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://com.liuxiang.xfireDemo/HelloService"> <xsd:element name="sayHello"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="sayHelloResponse"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name="sayHelloResponse"> <wsdl:part name="parameters" element="tns:sayHelloResponse" /> </wsdl:message> <wsdl:message name="sayHelloRequest"> <wsdl:part name="parameters" element="tns:sayHello" /> </wsdl:message> <wsdl:portType name="HelloServicePortType"> <wsdl:operation name="sayHello"> <wsdl:input name="sayHelloRequest" message="tns:sayHelloRequest" /> <wsdl:output name="sayHelloResponse" message="tns:sayHelloResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloServiceHttpBinding" type="tns:HelloServicePortType"> <wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="sayHello"> <wsdlsoap:operation soapAction="" /> <wsdl:input name="sayHelloRequest"> <wsdlsoap:body use="literal" /> </wsdl:input> <wsdl:output name="sayHelloResponse"> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="HelloService"> <wsdl:port name="HelloServiceHttpPort" binding="tns:HelloServiceHttpBinding"> <wsdlsoap:address location="http://localhost:8080/xfire/services/HelloService" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
types元素應用XML形式說話聲明在WSDL文檔中的其他地位應用的龐雜數據類型與元素;
import元素相似於XML形式文檔中的import元素,用於從其他WSDL文檔中導入WSDL界說;
message元素應用在WSDL文檔的type元素中界說或在import元素援用的內部WSDL文檔中界說的XML形式的內置類型、龐雜類型或元素描寫了新聞的有用負載;
portType元素和operation元素描寫了Web辦事的接口並界說了他的辦法。portType元素和operation元素相似於java接口中界說的辦法聲明。operation元素應用一個或許多個message類型來界說他的輸出和輸入的有用負載;
Binding元素將portType元素和operation元素賦給一個特別的協定和編碼款式;
service元素擔任將Internet地址賦給一個詳細的綁定;
1、definitions元素
一切的WSDL文檔的根元素均是definitions元素。該元素封裝了全部文檔,同時經由過程其name供給了一個WSDL文檔。除供給一個定名空間外,該元素沒有其他感化,故不作具體描寫。
上面的代碼是一個definitions元素的構造:
<wsdl:definitions targetNamespace="http://com.liuxiang.xfireDemo/HelloService" xmlns:tns="http://com.liuxiang.xfireDemo/HelloService" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> </wsdl:definitions>
2、types元素
WSDL采取了W3C XML形式內置類型作為其根本類型體系。types元素用作一個容器,用於界說XML形式內置類型中沒有描寫的各類數據類型。當聲明新聞部門的有用負載時,新聞界說應用了在types元素中界說的數據類型和元素。在本文的WSDL文檔中的types界說:
<wsdl:types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://com.liuxiang.xfireDemo/HelloService"> <xsd:element name="sayHello"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="sayHelloResponse"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types>
下面是數據界說部門,該部門界說了兩個元素,一個是sayHello,一個是sayHelloResponse:
sayHello:界說了一個龐雜類型,僅僅包括一個簡略的字符串,未來用來描寫操作的參入傳入部門;
sayHelloResponse:界說了一個龐雜類型,僅僅包括一個簡略的字符串,未來用來描寫操作的前往值;
3、import元素
import元素使得可以在以後的WSDL文檔中應用其他WSDL文檔中指定的定名空間中的界說元素。本例子中沒有應用import元素。平日在用戶願望模塊化WSDL文檔的時刻,該功效長短常有用果的。
import的格局以下:
<wsdl:import namespace="http://xxx.xxx.xxx/xxx/xxx" location="http://xxx.xxx.xxx/xxx/xxx.wsdl"/>
必需有namespace屬性和location屬性:
namespace屬性:值必需與正導入的WSDL文檔中聲明的targetNamespace相婚配;
location屬性:必需指向一個現實的WSDL文檔,而且該文檔不克不及為空。
4、message元素
message元素描寫了Web辦事應用新聞的有用負載。message元素可以描寫輸入或許接收新聞的有用負載;還可以描寫SOAP文件頭和毛病detail元素的內容。界說message元素的方法取決於應用RPC款式照樣文檔款式的新聞傳遞。在本文中的message元素的界說,本文檔應用了采取文檔款式的新聞傳遞:
<wsdl:message name="sayHelloResponse"> <wsdl:part name="parameters" element="tns:sayHelloResponse" /> </wsdl:message> <wsdl:message name="sayHelloRequest"> <wsdl:part name="parameters" element="tns:sayHello" /> </wsdl:message>
該部門是新聞格局的籠統界說:界說了兩個新聞sayHelloResponse和sayHelloRequest:
sayHelloRequest:sayHello操作的要求新聞格局,由一個新聞片段構成,名字為parameters,元素是我們後面界說的types中的元素;
sayHelloResponse:sayHello操作的呼應新聞格局,由一個新聞片段構成,名字為parameters,元素是我們後面界說的types中的元素;
假如采取RPC款式的新聞傳遞,只須要將文檔中的element元素應以修正為type便可。
5、portType元素
portType元素界說了Web辦事的籠統接口。該接口有點相似Java的接口,都是界說了一個籠統類型和辦法,沒有界說完成。在WSDL中, portType元素是由binding和service元從來完成的,這兩個元素用來講明Web辦事完成應用的Internet協定、編碼計劃和 Internet地址。
一個portType中可以界說多個operation,一個operation可以看做是一個辦法,本文中WSDL文檔的界說:
<wsdl:portType name="HelloServicePortType"> <wsdl:operation name="sayHello"> <wsdl:input name="sayHelloRequest" message="tns:sayHelloRequest" /> <wsdl:output name="sayHelloResponse" message="tns:sayHelloResponse" /> </wsdl:operation> </wsdl:portType>
portType界說了辦事的挪用形式的類型,這裡包括一個操作sayHello辦法,同時包括input和output注解該操作是一個要求/呼應形式,要求新聞是後面界說的sayHelloRequest,呼應新聞是後面界說的sayHelloResponse。input表現傳遞到Web辦事的有用負載,output新聞表現傳遞給客戶的有用負載。
6、binding
binding元素將一個籠統portType映照到一組詳細協定(SOAO和HTTP)、新聞傳遞款式、編碼款式。平日binding元素與協定專有的元素和在一路應用,本文中的例子:
<wsdl:binding name="HelloServiceHttpBinding" type="tns:HelloServicePortType"> <wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="sayHello"> <wsdlsoap:operation soapAction="" /> <wsdl:input name="sayHelloRequest"> <wsdlsoap:body use="literal" /> </wsdl:input> <wsdl:output name="sayHelloResponse"> <wsdlsoap:body use="literal" /> </wsdl:output>