Java創建WebService服務及客戶端實現

簡介 ? ? ??

? ? ? ?WebService是一種服務的提供方式,通過WebService,不同應用間相互間調用變的很方便,網絡上有很多常用的WebService服務,如:http://developer.51cto.com/art/200908/147125.htm,不同的語言平臺對WebService都有實現,Java的WebService實現,比較流行的有Axis2、Jaxws,本文介紹的是Axis2。

Axis2下載和部署

? ? ? ?Axis2是Apache開發的一個開源項目,再次感嘆Apache的偉大!

? ? ? ?下載地址:

? ? ? ?http://mirror.bit.edu.cn/apache//axis/axis2/java/core/1.6.2/axis2-1.6.2-war.zip

? ? ? ?將其內axis2.war解壓到<Tomcat安裝目錄>/webapps下,啟動Tomcat,war包會自動解壓,

? ? ? ?訪問http://localhost:8080/axis2/,如果看到歡迎主頁,則說明部署成功。

配置Axis2

? ? ? ?<Tomcat安裝目錄>/webapps/axis2/WEB-INF/conf/axis2.xml,配置其內兩個屬性,以便調試。

?

[html]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. <parameter?name="hotdeployment">true</parameter><!--?開啟熱部署,不需要重啟即可部署服務?-->??
  2. <parameter?name="hotupdate">true</parameter><!--?開啟熱更新,不需要重啟即可更新服務?-->??

?

編寫服務

? ? ? ?所謂服務就是編寫一個類,寫一些方法,方法返回數據,WebService客戶端獲取數據。

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. public?class?HelloService?{??
  2. ??
  3. ????public?String?sayHello()?{??
  4. ????????return?"hello";??
  5. ????}??
  6. ??????
  7. }??

0配置POJO發布服務

? ? ? ?服務類創建好后,我們需要發布到服務器上,將HelloService.class放到<Tomcat安裝目錄>/webapps/axis2/WEB-INF/pojo下,pojo沒有需要創建。

? ? ? ?至此,我們已經成功的創建了一個WebService服務了,so easy!

? ? ? ?再次訪問http://localhost:8080/axis2/,點擊Services,可以發現可用services中多了一個HelloService,其內有一個可用操作sayHello,說明發布成功。

?

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. HelloService??
  2. ??
  3. Service?Description?:?No?description?available?for?this?service??
  4. ??
  5. Service?EPR?:?http://localhost:8080/axis2/services/HelloService??
  6. ??
  7. Service?Status?:?Active??
  8. ??
  9. ??
  10. Available?Operations??
  11. sayHello??

? ? ? ?訪問http://localhost:8080/axis2/services/HelloService,頁面輸出正是我們的返回值。

?

?

[html]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. <ns:sayHelloResponse?xmlns:ns="http://ws.apache.org/axis2">??
  2. <return>hello</return>??
  3. </ns:sayHelloResponse>??

? ? ? ?這里有兩點需要注意:

?

? ? ? ?- POJO發布的類不能放在包里,既不能使用package關鍵字;

? ? ? ?- 默認的發布目錄是pojo,可以在<Tomcat安裝目錄>/webapps/axis2/WEB-INF/conf/axis2.xml中增加目錄,

?

[html]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. <deployer?extension=".class"?directory="<要增加的目錄名稱>"?class="org.apache.axis2.deployment.POJODeployer"?/>??

? ? ? ? ?要注意多個目錄見WebService要唯一,否則會重名,重名后,先部署的會成功,后部署的會報錯。

services.xml配置文件發布服務

? ? ? ?雖然POJO的方式不需要配置文件,但是其服務類不能放在包內,顯然是不符合我們日常開發的,Axis2也允許帶包的類發布WebService,如果不允許,估計就沒人用了。

? ? ? ?首先寫一個較復雜的服務類,多個方法,帶參數,有返回值的。

?

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. package?webservice.test;??
  2. ??
  3. /**?
  4. ?*?計算器運算?
  5. ?*??
  6. ?*?@author?gaoshuang?
  7. ?*/??
  8. public?class?CalculateService?{??
  9. ??
  10. ????//?加法??
  11. ????public?float?plus(float?x,?float?y)?{??
  12. ????????return?x?+?y;??
  13. ????}??
  14. ??
  15. ????//?減法??
  16. ????public?float?minus(float?x,?float?y)?{??
  17. ????????return?x?-?y;??
  18. ????}??
  19. ??
  20. ????//?乘法??
  21. ????public?float?multiply(float?x,?float?y)?{??
  22. ????????return?x?*?y;??
  23. ????}??
  24. ??
  25. ????//?除法??
  26. ????public?float?divide(float?x,?float?y)?{??
  27. ????????if?(y?!=?0)??
  28. ????????????return?x?/?y;??
  29. ????????else??
  30. ????????????return?-1;??
  31. ????}??
  32. }??

? ? ? ?然后編寫services.xml,該文件需要放在META-INF文件夾下。

?

?

[html]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <!--?服務名稱?-->??
  3. <service?name="CalculateService">??
  4. ????<!--?服務描述?-->??
  5. ????<description>??
  6. ????????加減乘除計算服務??
  7. ????</description>??
  8. ????<!--?設置服務類?-->??
  9. ????<parameter?name="ServiceClass">??
  10. ????????com.runqianapp.webservice.test.CalculateService??
  11. ????</parameter>??
  12. ????<!--?方法?-->??
  13. ????<operation?name="plus">??
  14. ????????<!--?方法處理器,RPCMessageReceiver為帶返回值的處理器,??
  15. ?????????????????????RPCInOnlyMessageReceiver為不帶返回值的處理器?-->??
  16. ????????<messageReceiver?mep="http://www.w3.org/2004/08/wsdl/in-out"??
  17. ????????????class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"?/>??
  18. ????</operation>??
  19. ????<operation?name="minus">??
  20. ????????<messageReceiver?mep="http://www.w3.org/2004/08/wsdl/in-out"??
  21. ????????????class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"?/>??
  22. ????</operation>??
  23. ????<operation?name="multiply">??
  24. ????????<messageReceiver?mep="http://www.w3.org/2004/08/wsdl/in-out"??
  25. ????????????class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"?/>??
  26. ????</operation>??
  27. ????<operation?name="divide">??
  28. ????????<messageReceiver?mep="http://www.w3.org/2004/08/wsdl/in-out"??
  29. ????????????class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"?/>??
  30. ????</operation>??
  31. </service>??

?

? ? ? ?最后將這兩個文件打成jar包,不論用工具還是手動打,打的都是最外層的文件夾。

? ? ? ?

? ? ? ?我打的名字是server.jar,更改后綴為aar,所以最后是server.aar,Axis2建議使用aar發布WebService,

? ? ? ?將server.aar放到<Tomcat安裝目錄>/webapps/axis2/WEB-INF/services下,訪問http://localhost:8080/axis2/services/listServices,

? ? ? ?多出了一個CalculateService,說明發布成功。

?

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. CalculateService??
  2. ??
  3. Service?Description?:?CalculateService??
  4. ??
  5. Service?EPR?:?http://localhost:8080/axis2/services/CalculateService??
  6. ??
  7. Service?Status?:?Active??
  8. ??
  9. ??
  10. Available?Operations??
  11. divide??
  12. plus??
  13. minus??
  14. multiply??

? ? ? ?分別訪問

?

? ? ? ?http://localhost:8080/axis2/services/CalculateService/plus?x=1&y=2

? ? ? ?http://localhost:8080/axis2/services/CalculateService/divide?x=1&y=2

? ? ? ?http://localhost:8080/axis2/services/CalculateService/minus?x=1&y=2

? ? ? ?http://localhost:8080/axis2/services/CalculateService/multiply?x=1&y=2
? ? ? ?也可以發布多個WebService,可以使用serviceGroup標簽。

?

[html]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. <serviceGroup>??
  2. <service?name="myService1">??
  3. ????...??
  4. </service>??
  5. <service?name="myService2">??
  6. ????...??
  7. </service>??
  8. </serviceGroup>??

客戶端實現

?

? ? ? ?以上介紹的都是WebService服務創建及發布,那么有了一個WebService服務后,我們如何調用呢?只在瀏覽器上訪問是沒有意義的。

? ? ? ?下載Axis2客戶端壓縮包:http://mirror.esocc.com/apache//axis/axis2/java/core/1.6.2/axis2-1.6.2-bin.zip,并解壓。

? ? ? ?新建工程WebServiceClientTest,將<Axis2客戶端安裝目錄>/lib下所有jar包添加到工程中;

? ? ? ?編寫客戶端代碼;

?

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. package?webservice.client.test;??
  2. ??
  3. import?javax.xml.namespace.QName;??
  4. ??
  5. import?org.apache.axis2.AxisFault;??
  6. import?org.apache.axis2.addressing.EndpointReference;??
  7. import?org.apache.axis2.client.Options;??
  8. import?org.apache.axis2.rpc.client.RPCServiceClient;??
  9. ??
  10. public?class?Client1?{??
  11. ??
  12. ????/**?
  13. ?????*?@param?args?
  14. ?????*?@throws?AxisFault?
  15. ?????*/??
  16. ????public?static?void?main(String[]?args)?throws?AxisFault?{??
  17. ????????//?使用RPC方式調用WebService??
  18. ????????RPCServiceClient?serviceClient?=?new?RPCServiceClient();??
  19. ????????Options?options?=?serviceClient.getOptions();??
  20. ????????//?指定調用WebService的URL??
  21. ????????EndpointReference?targetEPR?=?new?EndpointReference(??
  22. ????????????????"http://localhost:8080/axis2/services/CalculateService");??
  23. ????????options.setTo(targetEPR);??
  24. ????????//?調用方法的參數值??
  25. ????????Object[]?entryArgs?=?new?Object[]?{1,?2};??
  26. ????????//?調用方法返回值的數據類型的Class對象??
  27. ????????Class[]?classes?=?new?Class[]?{?float.class?};??
  28. ????????//?調用方法名及WSDL文件的命名空間??
  29. ????????//?命名空間是http://localhost:8080/axis2/services/CalculateService?wsdl中wsdl:definitions標簽targetNamespace屬性??
  30. ????????QName?opName?=?new?QName("http://test.webservice",?"plus");??
  31. ????????//?執行方法獲取返回值??
  32. ????????//?沒有返回值的方法使用serviceClient.invokeRobust(opName,?entryArgs)??
  33. ????????Object?result?=?serviceClient.invokeBlocking(opName,?entryArgs,?classes)[0];??
  34. ????????System.out.println(result);??
  35. ????????//?out:?3.0??
  36. ????}??
  37. ??
  38. }??

? ? ? ?以上是實現了一個簡單的WebSerivce客戶端,調用CalculateService中的plus方法,由代碼可見,這種調用方式比較雜亂,代碼不太友好。

?

wsdl2java簡化客戶端

? ? ? ?<Axis2客戶端安裝目錄>/bin目錄,其內有兩個bat,wsdl2java.bat和java2wsdl.bat,可以實現WSDL文件和Java之間的互相轉換。

? ? ? ?考慮到我們以后可能經常使用這些命令,設置環境變量,方便以后調用。在系統變量中加入AXIS2_HOME=<Axis2客戶端安裝目錄>,path中追加;%AXIS2_HOME%\bin。

? ? ? ?啟動命令提示符,進入WebServiceTestClient所在目錄,運行

?

[plain]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. wsdl2java?-uri?http://localhost:8080/axis2/services/CalculateService?wsdl?-p?webservice.client.test?-s??

? ? ? ?參數說明:uri - wsdl文件路徑,網絡路徑或本地路徑,p - 打包,這里和上一個客戶端實現類打在了一個包里,wsdl2java有很多參數,詳細可以運行該命令去查看。

?

? ? ? ?執行后,如果沒有報錯,說明運行成功,刷新項目,該包下多出了一個CalculateServiceStub類,里面的代碼極其復雜,還亂呼呼的,這我們不用管,調用該類。

?

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. package?webservice.client.test;??
  2. ??
  3. import?java.rmi.RemoteException;??
  4. ??
  5. import?webservice.client.test.CalculateServiceStub.Plus;??
  6. ??
  7. public?class?Client2?{??
  8. ??
  9. ????/**?
  10. ?????*?@param?args?
  11. ?????*?@throws?RemoteException??
  12. ?????*/??
  13. ????public?static?void?main(String[]?args)?throws?RemoteException?{??
  14. ????????CalculateServiceStub?stub?=?new?CalculateServiceStub();??
  15. ????????Plus?plus?=?new?Plus();??
  16. ????????plus.setX(1);??
  17. ????????plus.setY(2);??
  18. ????????float?result?=?stub.plus(plus).get_return();//?返回值自動轉型,這也是強大之處??
  19. ????????System.out.println(result);??
  20. ????}??
  21. ??
  22. }??

?

? ? ? ?如此做的好處就是調用時不需要在去查看WSDL,和正常使用一個類一樣,對WebService的封裝都由wsdl2java自動生成,代碼更優雅、簡潔。

利用wsdl2java輕松使用第三方WebService服務

? ? ? ?有了wsdl2java,已知一個WSDL文件我們就可以輕松的生成WebService客戶端供我們調用,給我們服務。文章開頭給出的鏈接包含了一些第三方服務,有一個服務是生成隨機個數中文,WSDL:http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl,同樣,啟動命令提示符,進入項目路徑,執行

?

[plain]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. wsdl2java?-uri?http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl?-p?webservice.client.test?-s??

? ? ? ?調用該類

?

?

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
    1. package?webservice.client.test;??
    2. ??
    3. import?java.rmi.RemoteException;??
    4. ??
    5. import?webservice.client.test.RandomFontsWebServiceStub.ArrayOfString;??
    6. import?webservice.client.test.RandomFontsWebServiceStub.GetChineseFonts;??
    7. ??
    8. public?class?ThirdClient?{??
    9. ??
    10. ????/**?
    11. ?????*?@param?args?
    12. ?????*?@throws?RemoteException??
    13. ?????*/??
    14. ????public?static?void?main(String[]?args)?throws?RemoteException?{??
    15. ????????RandomFontsWebServiceStub?stub?=?new?RandomFontsWebServiceStub();??
    16. ????????GetChineseFonts?getChineseFonts?=?new?GetChineseFonts();??
    17. ????????getChineseFonts.setByFontsLength(10);//?免費使用有限制,最多8個??
    18. ????????ArrayOfString?result?=?stub.getChineseFonts(getChineseFonts).getGetChineseFontsResult();??
    19. ????????for(String?str?:?result.getString())?{??
    20. ????????????System.out.println(str);??
    21. ????????}??
    22. ????}??
    23. ??
    24. } ?

轉載于:https://www.cnblogs.com/wlming/p/5466288.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373095.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373095.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373095.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

01-17權限管理

管理頁面&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equi…

Java靜態方法可能會產生代碼異味

代碼氣味的定義 &#xff08;來自維基百科&#xff09;&#xff1a; “程序源代碼中任何可能表明存在更深層問題的癥狀。” 在Java中&#xff0c; 靜態方法允許您在“類范圍”內執行代碼&#xff0c;而不是像成員方法這樣的實例范圍。 這意味著&#xff0c;它們依賴于類級別的變…

android json 解析圖片,JSON解析并獲取android中的圖像

我想解析包含字符串和圖像的JSON對象。我的代碼正在工作&#xff0c;但它加載圖像太慢。我想加載另一個asynctask或服務的圖像&#xff0c;以減少加載時間。我怎樣才能做到這一點&#xff1f;哪一個是最好的方法使用asynctask或服務&#xff1f;這里是我的代碼JSON解析并獲取an…

Node Express4.x 片段視圖 partials

1.在Express 4.x使用片段視圖&#xff0c;需要引入partials模塊 步驟&#xff1a; 1.在全局中安裝express-partials模塊&#xff1a; 2.在本地模塊中安裝express-partials,將模塊安裝到package.json中&#xff1a; 3.在入口文件(如&#xff1a;app.js)中引入模塊&#xff1a; v…

bzoj1690:[Usaco2007 Dec]奶牛的旅行(分數規劃+spfa判負環)

PS:此題數組名皆引用&#xff1a;戳我 題目大意&#xff1a;有n個點m條有向邊的圖&#xff0c;邊上有花費&#xff0c;點上有收益&#xff0c;點可以多次經過&#xff0c;但是收益不疊加&#xff0c;邊也可以多次經過&#xff0c;但是費用疊加。求一個環使得收益和/花費和最大&…

安全密碼存儲–請勿做的事和Java示例

安全存儲密碼的重要性 作為軟件開發人員&#xff0c;我們最重要的職責之一就是保護用戶的個人信息。 沒有我們應用程序的技術知識&#xff0c;用戶別無選擇&#xff0c;只能相信我們正在履行這一責任。 令人遺憾的是&#xff0c;在密碼方面&#xff0c;軟件開發社區的記錄不一。…

紅米note4x Android7,紅米Note4X能升級安卓7.0嗎?紅米Note4X如何升級Android7.0?

歡迎來到PPL網站的行業資訊知識分類&#xff0c;你現在觀看的這篇文章要和大家分享的是關于紅米Note4X能升級安卓7.0嗎&#xff1f;紅米Note4X如何升級Android7.0&#xff1f;的一些相關內容&#xff0c;希望大家能夠感興趣&#xff0c;并且希望我們能夠幫助到你&#xff01;在…

java基礎----數字簽名算法的介紹

數字簽名&#xff08;又稱公鑰數字簽名&#xff09;是一種類似寫在紙上的普通的物理簽名&#xff0c;但是使用了公鑰加密領域的技術實現&#xff0c;用于鑒別數字信息的方法。關于數字簽名的介紹&#xff0c;可以參見百度百科&#xff1a;http://baike.baidu.com/view/7626.htm…

Android宮格自動換行,九宮格視圖的布局及展示(相冊選擇)

上周一個朋友帶的項目出了點問題&#xff0c;招的ios開發人員在實現選取相冊圖片后用九宮格的樣式展示時遇到了瓶頸&#xff0c;花了將近2周都沒有解決。后來在跟我交流的過程中他把項目的圖片發給我看了下&#xff0c;看完我就笑了&#xff0c;這就只是個算法的問題&#xff0…

具有LCS方法的通用文本比較工具

常見的問題是檢測并顯示兩個文本&#xff08;尤其是幾百行或幾千行&#xff09;的差異。 使用純java.lang.String類方法可能是一種解決方案&#xff0c;但是對于此類操作最重要的問題是&#xff0c;“性能”將不能令人滿意。 我們需要一種有效的解決方案&#xff0c;其可能具有…

eclipse 開發 scala

(環境&#xff1a;jdk1.7,scala插件scala-2.1.1.2-site.zip) 1:下載scala插件 http://download.scala-ide.org/sdk/helium/e38/scala211/stable/site2&#xff1a;解壓到本地將這兩個文件里的jar包全部復制到eclipse的安裝目錄對應的文件夾里三&#xff1a;重啟eclipse這時會提…

關于這個博客

博客主要打算寫關于游戲制作方面的內容&#xff0c;包括directx&#xff0c;實時圖形知識等等方面的內容&#xff0c;作為一個渣暫時都是一些簡單的東西&#xff0c;努力找工作中...... 開這個博客主要目的是為了對自己做的事有個記錄吧&#xff0c;并且關于directx方面的東西本…

Quartz Scheduler失火指令說明

有時&#xff0c;Quartz無法在您需要的時間運行您的工作。 這有三個原因&#xff1a; 所有工作線程都忙于運行其他作業&#xff08;可能具有更高的優先級&#xff09; 調度程序本身已關閉 該作業是在過去的開始時間安排的&#xff08;可能是編碼錯誤&#xff09; 您可以通過…

android 代碼獲取屏幕圖像,安卓獲取屏幕以及獲得像素點 ~ 大樹洞

由于一些不可告人的需求&#xff0c;所以開始尋找各種可以實現安卓實時獲得屏幕上某個像素點的功能首先&#xff0c;將需求進行拆解&#xff0c;分別為1、獲得屏幕2、獲得屏幕上一個像素點獲得屏幕獲得屏幕分為比較多種的方式&#xff0c;在以前大致分為adb screencap 獲取當前…

海量端口掃描工具masscan

海量端口掃描工具masscanmasscan號稱是互聯網上最快的端口掃描工具&#xff0c;可以6分鐘掃描整個互聯網&#xff0c;每秒可以發送一百萬個數據包。為了提高處理速度&#xff0c;masscan定制了TCP/IP棧&#xff0c;從而不影響本地其他TCP/IP的數據傳輸。masscan提供較為豐富的選…

改進租房練習

代碼基本沒有改動&#xff0c;函數有變化&#xff0c;老師只用了一個函數&#xff0c;自己做寫了4個function&#xff0c;減少了代碼量 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio…

Google App Engine JAX-RS REST服務

在本文中&#xff0c;您將學習如何使用JAX-RS參考實現&#xff08;Jersey&#xff09;創建REST服務并將其部署在Google AppEngine上。 先決條件 對于本教程&#xff0c;您將需要&#xff1a; Google AppEngine帳戶 Eclipse Galileo&#xff08;3.5.x&#xff09; 適用于Java的…

libnids校驗和引起回放包不能正常捕捉

如題 取消校驗和校驗即可&#xff1a; struct nids_chksum_ctl temp;temp.netaddr 0;temp.mask 0;temp.action 1;nids_register_chksum_ctl(&temp,1); 在init之前。轉載于:https://www.cnblogs.com/yaoyuanfeixing/p/6308067.html

鴻蒙系統的全面開源,華為:打造全球的操作系統,鴻蒙今日全面開源!

原標題&#xff1a;華為&#xff1a;打造全球的操作系統&#xff0c;鴻蒙今日全面開源&#xff01;今日下午&#xff0c;2019華為全球開發者大會在華為松山湖基地正式開幕。華為正式對外推出了自研操作系統——鴻蒙系統(Harmony OS)。華為消費者業務CEO余承東指出&#xff0c;鴻…

android 獲取路徑目錄方法以及判斷目錄是否存在,創建目錄

Environment 常用方法&#xff1a; * 方法&#xff1a;getDataDirectory()解釋&#xff1a;返回 File &#xff0c;獲取 Android 數據目錄。* 方法&#xff1a;getDownloadCacheDirectory()解釋&#xff1a;返回 File &#xff0c;獲取 Android 下載/緩存內容目錄。* 方法&…