1. 程式人生 > >webservice學習筆記——入門篇

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:

http://blog.csdn.net/laomai/*/ 二、第一個最簡單的例子jsee5安裝以後會在系統中建立一個Application Server pe9,這是sun自帶的網路伺服器,和tomcat、weblogic的性質類似。在D:/Sun/SDK/samples/javaee5/webservices/hello-jaxws下有一個自帶的web service入門例子,(D:/Sun/SDK/為我機器上javaee5的安裝路徑)我們就先實驗它,來理解webservice的本質1、把jdk的安裝路徑如D:/Java/jdk1.6.0/bin 加到系統的path環境變數中2、執行sun自帶的網路伺服器,具體方法為    開始->程式->Sun Microsystems->Application Server PE 9->Start Default Server    然後當彈出的cmd視窗中出現提示“按任意鍵繼續時”輸入回車,視窗會關閉,此時在瀏覽器輸入   
http://localhost:8080
,應該出現如下內容:       Sun Java System Application Server Platform Edition 9.0    Your server is up and running!   說明伺服器已經啟動了

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平臺用不到的步驟,下面我們對其進行改造,把它精簡一下.