webservice學習筆記——入門篇
web service入門學習筆記最近要做一個java專案,裡面用到了webservice技術,經過一個多月的磕磕絆絆的摸索,總算如了點門。現將我的學習筆記貼出來,供大家參考。
一、實驗環境 win2k + jdk1.6 + javee5.0 + Myeclipse5.1jdk和javee5.0均可從http://java.sun.com/javase/downloads/index.jsp下載,安裝檔名為jdk-6-windows-i586.exejava_ee_sdk-5_02-windows.exe沒有myeclipse的也可以用eclipse代替,只要ide能執行ant指令碼就可以.
/*title: web service入門學習筆記(二)**date: 2007/01/16**author:laomai**url:
3、在Myeclipse開啟剛才的例子目錄D:/Sun/SDK/samples/javaee5/webservices/hello-jaxws下的build.xml檔案,這個一個ant指令碼,具體含義我們以後再講,現在先執行它3、在build.xml檔案中單擊右鍵,在彈出選單中選擇"run as"->"1 ant build",此時build.xml裡的內容會被執行,在Myeclipse的console中會輸出:buildfile: D:/Sun/SDK/samples/javaee5/webservices/hello-jaxws/build.xmlinit:compile-deploy-service: [echo] d:/Sun/SDKget-artifacts-windows:get-artifacts-unix:get-artifacts:compile-client: [javac] Compiling 1 source file to D:/Sun/SDK/samples/javaee5/webservices/hello-jaxws/buildrun-client-windows: [exec] Hello result = Hello Administrator!run-client-unix:run-client:all:BUILD SUCCESSFULTotal time: 43 seconds
其中 [exec] Hello result = Hello Administrator!的輸出結果說明客戶端呼叫伺服器的webservice已經成功。第一個例子就完成了。我們下面會對這個例子進行詳細講解.
/*title: web service入門學習筆記(三)、(四)**date: 2007/01/16**author:laomai**url: http://blog.csdn.net/laomai/*/
三、WebService的本質 從搞c的程式設計師的眼光來看,webservice實際上就是用java實現的rpc(遠端過程呼叫),或者說是dll的變形。伺服器把它的介面對外發布成一個wsdl檔案,客戶端根據這個wsdl的內容生成本地的代理類,再通過代理類呼叫遠端的介面,代理再把介面的執行執行結果回傳給客戶端,進行下一步處理。
四、例子原始碼剖析D:/Sun/SDK/samples/javaee5/webservices/hello-jaxws(以後簡稱為hello-jaxws)專案裡的原始檔只有三個 hello-jaxws/src/endpoint/Hello.java 提供webservice的伺服器端實現類hello-jaxws/src/client/Client.java 呼叫webservice的客戶端測試類hello-jaxws/build.xml 自動編譯的ant指令碼
下面我們把這三個檔案的內容看一下1、伺服器端的service實現類檔案Hello.java,/* src/endpoint/Hello.java檔案的內容 */package endpoint;import javax.jws.WebService;
@WebServicepublic class Hello{ public String getHello(String name) { return "Hello " + name + "!"; }}
有這個檔案可以看出,編寫一個service的實現類,把編寫普通的java類差不多,只不過又多了三點①要在該類前一個@WebService說明,②引入javax.jws.WebService;③在公開的方法前加@WebMethod說明,如果不加的話,所有的public方法都會自動變成service的對外介面.
2、客戶端測試類的實現檔案/* src/client/Client.java檔案的內容 */package client;import javax.xml.ws.WebServiceRef;import endpoint.HelloService;import endpoint.Hello;
public class Client{ @WebServiceRef(wsdlLocation="http://localhost:8080/Hello/HelloService?WSDL") static HelloService service; public static void main(String[] args) { Client client = new Client(); client.doHello(); } public void doHello() { try { Hello port = service.getHelloPort(); String ret = port.getHello(System.getProperty("user.name")); System.out.println("Hello result = " + ret); } catch(Exception e) { e.printStackTrace(); } }}客戶端呼叫程式碼要點為:①匯入WebServiceRef包 import javax.xml.ws.WebServiceRef;②匯入本地生成的stub類,另外編譯時也要指明stub類的路徑 import endpoint.HelloService; import endpoint.Hello;③指明伺服器的wsdl路徑 @WebServiceRef(wsdlLocation="http://localhost:8080/myhello/HelloService?WSDL")④宣告一個靜態的service物件 static HelloService service;⑤對要呼叫的遠端方法宣告一個代理物件,通過代理來呼叫真正的遠端方法 Hello port = service.getHelloPort(); String ret = port.getHello(System.getProperty("user.name"));
3、ant 指令碼build.xml<!-- ant 指令碼build.xml的內容 --><?xml version="1.0" encoding="UTF-8"?><project name="hello-jaxws" default="all" basedir="."> <!-- include user specific build properties --> <!-- 匯入預先j2ee預先寫好的設定檔案--> <property file="../../../bp-project/build.properties"/> <property file="${user.home}/build.properties"/> <property file="../../../bp-project/app-server.properties"/> <!-- 設定釋出目錄和類的輸出目錄 --> <property name="autodeploydir" value="${javaee.domaindir}/autodeploy"/> <property name="classesdir" value="./build"/>
<!-- 設定java的類庫路徑 --> <path id="classpath"> <pathelement location="${javaee.home}/lib/j2ee.jar"/> <pathelement location="${classesdir}"/> </path> <!-- 專案的最終任務 --> <target name="all" depends="run-client"> <!--antcall target="restore"/--> </target>
<!-- 測試作業系統環境--> <target name="init"> <condition property="windows"> <os family="windows" /> </condition> <condition property="unix"> <os family="unix" /> </condition> </target>
<!-- 編譯伺服器端並把它自動釋出到sun的伺服器上 --> <target name="compile-deploy-service" depends="init"> <mkdir dir="${classesdir}"/> <echo message="${javaee.home}"/> <javac srcdir="./src" includes="endpoint/**" destdir="${autodeploydir}" classpath="${javaee.home}/lib/j2ee.jar" /> <waitfor maxwait="100" maxwaitunit="second"> <or> <available file="${autodeploydir}/endpoint/Hello.class_deployed"/> <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/> </or> </waitfor> <condition property="deploy_succeeded"> <available file="${autodeploydir}/endpoint/Hello.class_deployed"/> </condition> <condition property="deploy_failed"> <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/> </condition> </target>
<target name="get-artifacts" depends="compile-deploy-service,get-artifacts-windows,get-artifacts-unix"/>
<!-- 生成客戶端所需的stub --> <target name="get-artifacts-windows" if="windows"> <exec executable="${javaee.home}/bin/wsimport.bat"> <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL"/> </exec> </target>
<target name="get-artifacts-unix" if="unix"> <exec executable="${javaee.home}/bin/wsimport"> <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL"/> </exec> </target>
<!-- 編譯客戶端 --> <target name="compile-client" depends="get-artifacts"> <javac srcdir="./src/client" destdir="${classesdir}"> <classpath refid="classpath"/> </javac> </target> <target name="run-client" depends="compile-client,run-client-windows,run-client-unix"/> <!-- 執行客戶端 --> <target name="run-client-windows" if="windows"> <exec executable="${javaee.home}/bin/appclient.bat" dir="${classesdir}"> <arg value="client.Client"/> </exec> </target>
<target name="run-client-unix" if="unix"> <exec executable="${javaee.home}/bin/appclient" dir="${classesdir}" failifexecutionfails="false"> <arg value="client.Client"/> </exec> </target> <!-- 以下幾個任務用與清理和解除安裝--> <!-- 刪除生成的類檔案--> <target name="clean"> <delete dir="${classesdir}"/> </target>
<!-- 刪除和解除安裝伺服器的webservice--> <target name="restore"> <delete> <fileset dir="${autodeploydir}/endpoint" includes="Hello*.*"/> </delete> </target>
<target name="undeploy"> <antcall target="restore"/> </target></project>
這個指令碼有許多在windows平臺用不到的步驟,下面我們對其進行改造,把它精簡一下.