JBoss核心Java Web服务
網(wǎng)絡(luò)服務(wù)
讓我們首先談?wù)勊旧淼腤eb服務(wù)。 什么是Web服務(wù)。 人們傾向于說Web服務(wù)不僅僅是遠(yuǎn)程方法調(diào)用(RMI)的過程。 實(shí)際上,這不僅僅與RMI有關(guān)。 Web服務(wù)是通過HTTP協(xié)議公開的端點(diǎn)(或單個(gè)端點(diǎn))的集合。 為了與這些端點(diǎn)進(jìn)行通信,我們必須創(chuàng)建客戶端以訪問端點(diǎn)。 Web服務(wù)端點(diǎn)和客戶端之間的這種通信的最大優(yōu)點(diǎn)是由SOAP協(xié)議指定的,該協(xié)議建立在HTTP協(xié)議(有時(shí)甚至是SMTP協(xié)議)的基礎(chǔ)上。
該協(xié)議定義了在端點(diǎn)和客戶端之間傳輸?shù)臄?shù)據(jù)的結(jié)構(gòu)。 數(shù)據(jù)以XML格式交換。 結(jié)果,Web服務(wù)被稱為獨(dú)立于“平臺(tái)/技術(shù)”。 例如,可以通過使用Java CXF框架或純JBoss Web服務(wù)來實(shí)現(xiàn)Web服務(wù)。 可以在非Java環(huán)境中實(shí)現(xiàn)訪問此Web服務(wù)的客戶端。 Web服務(wù)技術(shù)和客戶端技術(shù)可以完全不同,并且由于SOAP協(xié)議依賴于XML消息格式,因此它們之間仍可以進(jìn)行通信。 要使通信成功,唯一需要做的事情就是端點(diǎn)和客戶端都同意XML消息的外觀(XML文件中將包含哪種字段和內(nèi)容類型)以及進(jìn)行哪些操作(方法),客戶端可以在端點(diǎn)上調(diào)用。
這些要求由WSDL指定。 WSDL (Web服務(wù)描述語言)是一種基于XML的語言,用于描述Web服務(wù)的端點(diǎn)。 它可以定義端點(diǎn)的HTTP地址,客戶端可以在此端點(diǎn)上執(zhí)行的操作,可以傳遞給操作的數(shù)據(jù)類型以及從端點(diǎn)的那些操作返回的數(shù)據(jù)類型。 它還定義了與端點(diǎn)進(jìn)行通信時(shí)使用的XML消息的確切結(jié)構(gòu)。 這種信息通常以wsdl擴(kuò)展名存儲(chǔ)在文件中。 這就是著名的術(shù)語“ wsdl文件”如何出現(xiàn)的原因。
好的,關(guān)于Web服務(wù)就足夠了。 實(shí)際上,我可以寫很多有關(guān)Web服務(wù)和SOAP協(xié)議的信息,但這超出了本博客的范圍。 鼓勵(lì)您這樣做。 互聯(lián)網(wǎng)上有很多關(guān)于該主題的文章。
在JBoss上創(chuàng)建一個(gè)簡(jiǎn)單的Web服務(wù)
示例我將向您展示eclipse 3.7(indigo),我將使用JBoss 4.2.3.GA作為服務(wù)器。 作為項(xiàng)目構(gòu)建工具,我將使用Maven。 讓我們從在Eclipse中創(chuàng)建最簡(jiǎn)單的Web項(xiàng)目開始。 它將保存Web服務(wù)實(shí)現(xiàn)(端點(diǎn))。
它只是普通Web應(yīng)用程序的Maven項(xiàng)目。 沒什么特別的。 如果您不想使用Maven,那也可以。 您可以使用自己喜歡的任何工具來創(chuàng)建簡(jiǎn)單的Web應(yīng)用程序。
在本文中,我將不介紹如何創(chuàng)建此簡(jiǎn)單項(xiàng)目的詳細(xì)信息。 相反,我將為您提供日食中項(xiàng)目結(jié)構(gòu)的屏幕快照。
| 日食中的項(xiàng)目結(jié)構(gòu)。 |
現(xiàn)在,讓我們創(chuàng)建Web服務(wù)。 我們將采用“ 自下而上的方法 ”。 這意味著我們將首先開發(fā)一個(gè)實(shí)現(xiàn)類,然后再定義WSDL。 因此,讓我們編寫一個(gè)簡(jiǎn)單的java POJO類。 我們只是假裝我們的Web服務(wù)將某種汽車ID作為參數(shù)并返回該汽車的價(jià)格。 如果我們輸入不存在的汽車ID,則Web服務(wù)將返回相應(yīng)的錯(cuò)誤文本。
這里要注意的主要元素是CarWebService接口和CarWebServiceImpl類,它們實(shí)際上實(shí)現(xiàn)了端點(diǎn)接口。
讓我們從CarWebService接口開始。 這是代碼:
package ba.codecentric.webservice;import javax.jws.WebMethod; import javax.jws.WebService;import ba.codecentric.webservice.model.CarResponse;@WebService public interface CarWebService {@WebMethodpublic CarResponse getCarPrice(String carId);}如您所見,這是一個(gè)普通的接口定義。 這里只有兩件事需要注意:兩個(gè)注釋: @WebService和@WebMethod 。 這些注釋屬于稱為JAX-WS的技術(shù)領(lǐng)域。 JAX-WS是有關(guān)如何創(chuàng)建Web服務(wù)和客戶端的規(guī)范,它們可以與RPC調(diào)用進(jìn)行通信并交換基于XML的消息。 Java具有自己的JAX-WS實(shí)現(xiàn),使我們能夠使用這些簡(jiǎn)單的注釋來定義Web服務(wù)端點(diǎn)。 您可以在此處閱讀有關(guān)JAX-WS的更多信息。 在Java內(nèi)部,該技術(shù)處理接收和解析XML消息(通常與SOAP協(xié)議交換)。 這使開發(fā)人員免去了許多小時(shí)的辛苦工作,因此開發(fā)人員不必花費(fèi)時(shí)間編寫代碼來生成肥皂消息,發(fā)送它,然后在服務(wù)器端接收它,從xml中提取信息等。所有這些就是由Java中的JAX-WS機(jī)制在內(nèi)部完成。
因此,當(dāng)您希望在服務(wù)器上創(chuàng)建純Java Web服務(wù)端點(diǎn)時(shí),只需創(chuàng)建接口即可。 用WebService批注標(biāo)記接口,并將接口中希望公開的所有方法標(biāo)記為遠(yuǎn)程方法(帶有WebMethod批注)。 然后,這些將成為可以在接口上調(diào)用的操作。 在我的示例中,我只有一種方法,但是可以有更多種方法。
下一站是創(chuàng)建接口實(shí)現(xiàn)。 我們已經(jīng)公開了Web服務(wù)方法(端點(diǎn)的操作)。 這些方法必須執(zhí)行某些操作才能使Web服務(wù)有意義。 在Java中,這非常簡(jiǎn)單。 我們將只為接口創(chuàng)建實(shí)現(xiàn)類。
我將向您展示CarWebServiceImpl的代碼。
再次需要注意的是特殊注釋。 與界面相同,但只有一個(gè)額外的參數(shù)。 它是端點(diǎn)接口的標(biāo)準(zhǔn)名稱。 沒有其他的。
在現(xiàn)實(shí)世界中,此Web服務(wù)可能具有更復(fù)雜的代碼。 它將需要某種汽車ID,然后將在數(shù)據(jù)庫中搜索汽車。 但是在這里,我變得更加簡(jiǎn)單。 我有一張地圖,其中包含三種不同的汽車ID,其中存儲(chǔ)了ID的價(jià)格。
如果將現(xiàn)有的汽車ID傳遞給服務(wù)(例如audi,bmw),則將從服務(wù)器上的Web服務(wù)獲得響應(yīng)。 響應(yīng)將包含狀態(tài)消息(確定)和汽車價(jià)格。
如果您將不存在的汽車ID傳遞給服務(wù),則您將收到狀態(tài)錯(cuò)誤的響應(yīng),并且還會(huì)有一個(gè)詳細(xì)的字符串,告訴您未找到要搜索的汽車。 在這種情況下,汽車價(jià)格將設(shè)置為-1。
好。 就Web服務(wù)實(shí)現(xiàn)而言就是這樣。 很簡(jiǎn)單,不是嗎? 僅要做一件事。 而且這一過程更加簡(jiǎn)單。 您需要將實(shí)現(xiàn)類公開為Servlet。 您將在web.xml中執(zhí)行此操作。 這是代碼:
<servlet><servlet-name>carWebservice</servlet-name><servlet-class>ba.codecentric.webservice.impl.CarWebServiceImpl</servlet-class></servlet><servlet-mapping><servlet-name>carWebservice</servlet-name><url-pattern>/ws/car</url-pattern></servlet-mapping> 我們完成了。 現(xiàn)在,我們需要打包應(yīng)用程序并將其部署到JBoss。
JBoss將為您發(fā)布此端點(diǎn),因此您無需擔(dān)心。
所以請(qǐng)繼續(xù)。 將您的應(yīng)用程序部署到JBoss。 如果您將maven用作構(gòu)建工具,則pom.xml應(yīng)該如下所示:
由于使用了注釋,因此將Maven編譯器的源版本和目標(biāo)版本設(shè)置為Java 6。
JBoss擁有自己的小型Web應(yīng)用程序,可讓您查看當(dāng)前部署的所有Web服務(wù)以及這些Web服務(wù)的所有WSDL文件的位置。
您可以從以下URL訪問此小型應(yīng)用程序: http:// localhost:8080 / jbossws / services
當(dāng)然,只要您的JBoss服務(wù)器名稱為localhost且其http端口配置為8080。
這是我的PC上的屏幕截圖,清楚地表明了在此示例中部署的Web服務(wù)確實(shí)正在運(yùn)行。
您可以單擊端點(diǎn)的URL。 結(jié)果將是您實(shí)際上將看到端點(diǎn)的WSDL。 在該WSDL中,您將看到類似<import location ='……'>的內(nèi)容 。 location屬性的值是完整WSDL的真實(shí)URL。 所以請(qǐng)繼續(xù)。 同時(shí)在瀏覽器中打開該URL。 現(xiàn)在,您應(yīng)該看到整個(gè)WSDL(端點(diǎn)定義,可以調(diào)用的操作,發(fā)送到端點(diǎn)并從端點(diǎn)接收回的消息)。 我希望這可以使您更輕松地了解Web服務(wù)實(shí)際上是如何與客戶端交換數(shù)據(jù)的。 客戶端只是基于從Web服務(wù)獲取的WSDL文件創(chuàng)建請(qǐng)求。 在該WSDL文件中,客戶端可以看到與端點(diǎn)進(jìn)行通信所需的所有內(nèi)容。 SOAP協(xié)議和Java的JAX-WS機(jī)制負(fù)責(zé)其余所有工作。 開發(fā)人員不必查看其中已調(diào)用的操作。
創(chuàng)建一個(gè)簡(jiǎn)單的Web服務(wù)客戶端(wsconsume實(shí)用程序)
為了調(diào)用此Web服務(wù),我們需要?jiǎng)?chuàng)建一個(gè)客戶端。 客戶端可以是一個(gè)簡(jiǎn)單的Java控制臺(tái)應(yīng)用程序。 如果您不想使事情復(fù)雜化,它甚至不必是Web應(yīng)用程序。 這意味著您可以使用main()方法創(chuàng)建一個(gè)簡(jiǎn)單的Java類。 只需幾行代碼,您就完成了。 我們?cè)谶@里要做的第一件事是生成所謂的“存根類”。 這些類表示我們用于與Web服務(wù)通信的模型請(qǐng)求和響應(yīng)類。 如果您還記得的話,我已經(jīng)創(chuàng)建了一個(gè)特殊的包裝器類來返回Web服務(wù)響應(yīng)。 但是,這些存根類中不只是模型類。 在這里,您還將找到實(shí)際執(zhí)行遠(yuǎn)程端點(diǎn)調(diào)用的類以及其他一些實(shí)用程序類。 另外,您還會(huì)發(fā)現(xiàn)將Java對(duì)象編組和解編為XML消息時(shí)所需的一些JAXB注釋,反之亦然。 這些存根類是基于端點(diǎn)的WSDL文件創(chuàng)建的。 如果您還記得WSDL文件,則包含客戶端需要的所有信息。 基于WSDL文件,我們可以生成所有必需的存根類(用于與Web服務(wù)通信的模型類和用于促進(jìn)此通信的實(shí)用程序類)。 對(duì)我們來說幸運(yùn)的是,JBoss有一個(gè)小的實(shí)用程序,我們將使用它來生成這些類。 對(duì)于這些存根類,我們不必編寫任何代碼。 我們還可以告訴該工具立即在工作空間中生成類。 真的很酷的東西。 因此,讓我們?cè)囈辉嚒?該工具稱為wsconsume.bat ,位于JBoss文件夾– bin中。 對(duì)于Linux用戶,有wsconsume.sh 。
首先,我將在Eclipse中為此生成一個(gè)不同的項(xiàng)目。 我將其稱為ws-client 。 這是一個(gè)普通的Java項(xiàng)目。 您可以選擇File-> New-> Java Project并使用所有默認(rèn)設(shè)置。 好。 現(xiàn)在,我們準(zhǔn)備創(chuàng)建存根類。 我們希望wsconsume實(shí)用程序?qū)㈩惲⒓捶湃隞ava源文件的src文件夾中。 并且我們還將告訴wsconsume實(shí)用程序應(yīng)該用于這些類的軟件包的確切名稱。 我的項(xiàng)目位于此處: D:\ JBossTests \ jbossWebServiceWorkspace \ ws-client 。
因此,wsconsume utlity的命令應(yīng)為:D:\ JBossTests \ jboss-4.2.3.GA \ bin> wsconsume -v -k -p ws.client.impl -s D:\ JBossTests \ jbossWebServiceWorkspace \ ws-client \ src
http://127.0.0.1:8080/webservices/ws/car?wsdl
確保您正在jboss bin文件夾中執(zhí)行此命令。 否則,請(qǐng)確保您的路徑上具有wsconsume.bat文件,以從任何文件夾訪問該文件。
還要確保您的jboss正在運(yùn)行,并且您要為其嘗試生成客戶端的Web服務(wù)已正確部署并正在運(yùn)行。
讓我們解釋一下我在這里使用的參數(shù):
-v:詳細(xì)(如果有錯(cuò)誤,則顯示完整的錯(cuò)誤堆棧跟蹤);
-k:保留/生成Java源代碼;
-p:軟件包名稱。 生成的類將立即獲得給定的包; -s:源文件夾。 放置源文件的目錄。 我在客戶端項(xiàng)目中使用了源文件夾,這很有意義。
最后,我們有了端點(diǎn)的WSDL位置的URL。
您可以打開jboss URL http:// localhost:8080 / jbossws / services來查看當(dāng)前已部署的所有Web服務(wù)以及所有WSDL URL。 您只需將所需的WSDL URL復(fù)制/粘貼到wsconsume實(shí)用程序的命令提示符下即可。 在我們的例子中,這是我們先前創(chuàng)建的Web服務(wù)的位置。
現(xiàn)在轉(zhuǎn)到eclipse并刷新新客戶端項(xiàng)目中的src文件夾。 現(xiàn)在,您應(yīng)該具有由wsconsume實(shí)用程序生成的某些類,并且這些類應(yīng)位于指定的程序包中。 現(xiàn)在我們需要做的就是執(zhí)行此客戶端并將請(qǐng)求發(fā)送到Web服務(wù)。 只需再創(chuàng)建一個(gè)類即可。 我將其稱為CarWebserviceClient 。 我將其放入單獨(dú)的包裝中。 此類將具有普通的java main方法。 軟件包為ws.client.runner :
package ws.client.runner;import ws.client.impl.CarResponse; import ws.client.impl.CarWebService; import ws.client.impl.CarWebServiceImplService;public class CarrWebserviceClient {public static void main(String[] args) {CarWebServiceImplService service = new CarWebServiceImplService();CarWebService port = service.getCarWebServiceImplPort();CarResponse audiPrice = port.getCarPrice('audi');System.out.println('audi price: ' + audiPrice.getCarPrice() + ' EUR; web service status: ' + audiPrice.getStatus());CarResponse fordPrice = port.getCarPrice('ford');System.out.println('ford price: ' + fordPrice.getCarPrice() + ' EUR; web service status: ' + fordPrice.getStatus());}} 如您所見,上面的代碼非常簡(jiǎn)單。 您只需要實(shí)例化客戶端,然后獲取服務(wù)的端口即可。 我們可以通過調(diào)用具有相同名稱的java方法來調(diào)用Web服務(wù)操作。 只需傳遞您想要的參數(shù)即可。 您可以將audi , bmw和fiat用作硬編碼的現(xiàn)有值。 您也可以嘗試檢索一些不存在的汽車ID的價(jià)格。 我在上面的示例中嘗試過。
當(dāng)然,不要忘了運(yùn)行jboss并部署Web服務(wù),以使其工作:-)
好吧,僅此而已。 這可能是繼續(xù)進(jìn)入基于SOAP的Web服務(wù)世界的一個(gè)不錯(cuò)的起點(diǎn)。 這是最基本的示例,通過使用JAX-WS API并在jboss支持Web服務(wù)的幫助下實(shí)現(xiàn)。
參考:來自JCG合作伙伴 Branislav Vidovi的JBoss上的Core Java Web Services ? 在極客的東西:-)博客上。
翻譯自: https://www.javacodegeeks.com/2012/08/jboss-core-java-web-services.html
總結(jié)
以上是生活随笔為你收集整理的JBoss核心Java Web服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用JSF的面向服务的UI
- 下一篇: vivo手机进不了系统怎么办