1. 程式人生 > >webservice學習筆記——理解篇

webservice學習筆記——理解篇

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

 /*title: web service入門學習筆記(七)
**date: 2007/01/19
**author:laomai
**url: http://blog.csdn.net/laomai/
*/

七、命令列開發過程
   通過以上的學習,我們知道如何在ant指令碼和ide環境中開發一個簡單的webservice.
但是作為搞技術的人特別是搞c的人來看,上面的過程隱藏了太多的東西,
對我們有鑽研精神的人,自然就想搞清楚指令碼背後的過程。
假設我們的機器上沒有ide環境和ant工具,
我們如何“手工”編譯出自己的webservice呢?
這就是本節要講述的內容--只用命令列工具開發webservice.

再次宣告:

本部分主要參考了

http://blog.csdn.net/lin_bei/archive/2006/11/07/1371131.aspx

的內容,由於這位兄弟翻譯的不是很通順,我就按照自己的理解來改編成了
hellowrold的例子:-)。
其他部分為我原創,轉載時請註明出處。

0、設定環境變數
 把jdk和javaee的路徑如
 D:/Java/jdk1.6.0
 D:/Sun/SDK/bin加到系統的path變數中去

1、建立專案目錄
 首先建立一個專案的目錄,名為WebTest,專案目錄下又包含三個子目錄
  src/      本目錄用於存放原始碼,
  build/    本目錄用於存放輸出的檔案
  deploy/   本目錄用於對伺服器打包
  
2、編寫伺服器類實現檔案
  在專案的src目錄下建立一個個子目錄endpoint,
  在這個endpoint子目錄下新建一個Hello.java檔案,內容如下
 
 /*src/endpoint/Hello.java檔案  
  提供webservice的伺服器端實現類
 */
 package endpoint;
 
 import javax.jws.WebService;
 import javax.jws.WebMethod;
 
 @WebService
 public class Hello
 {
  @WebMethod
     public String getHello(String name)
     {
        return "Hello " + name + "!";
     }
  }
3、編譯伺服器類
 ①在build目錄下建立一個子目錄classes
   ②在命令列執行如下命令
    cd WebTest  ;進入專案目錄
    javac -classpath d:/Sun/SDK/lib/javaee.jar -d ./build/classes src/endpoint/Hello.java  ;編譯伺服器類
   執行完後會產生一個build/classes/endpoint/Hello.class檔案
 
4、生成wsdl檔案
 ①在build目錄下建立一個子目錄generated
 ②生成wsdl檔案,執行
  wsgen -cp ./build/classes -keep -d ./build/classes -r ./build/generated -wsdl  endpoint.Hello
 
 執行完成會在./build/generated產生兩個檔案
 HelloService.wsdl
 HelloService_schema1.xsd
 並且在/build/class/endpoint下建立一個jaxws目錄,下面有4個檔案
 GetHello.java                       
 GetHello.class
 GetHelloResponse.java
 GetHelloResponse.class
 
 這些檔案與與前面所說的ant指令碼中生成的
 D:/Sun/SDK/domains/domain1/generated/ejb/j2ee-modules/endpoint_Hello/endpoint/jaxws
 下的檔案相同
 
5、將伺服器打包,做成war檔案
 ①建立打包所需要的目錄
    在專案的deploy目錄下建立一個子目錄/WEB-INF,
   WEB-INF子目錄下再建立兩個子目錄
    classes/  用於存放伺服器端類
    wsdl/     用於存放wsdl檔案

 ②將各輸出檔案或目錄拷貝到相應的目錄下
  (1)把build/classes/endpoint整個目錄拷貝到deploy/WEB-INF/class目錄下
  (2)把build/generated目錄下的兩個檔案
   HelloService.wsdl、HelloService_schema1.xsd拷貝到
      deploy/WEB-INF/wsdl目錄下
 ③在deploy/WEB-INF/ 目錄下新建一個web.xml檔案,內容為
  <?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns="

http://java.sun.com/xml/ns/javaee"
   xmlns:j2ee="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <description>WebTier for the Hello Service</description>
  <display-name>HelloWAR</display-name>
  <servlet>
   <description>Endpoint for Hello Web Service</description>
   <display-name>HelloWebService</display-name>
   <servlet-name>Hello</servlet-name>
   <servlet-class>endpoint.Hello</servlet-class>
   <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
   <servlet-name>Hello</servlet-name>
   <url-pattern>/HelloService</url-pattern>
  </servlet-mapping>
  <session-config>
   <session-timeout>54</session-timeout>
  </session-config>
  </web-app>
 ④將service打包,執行
  (1)cd WebTest/deploy   ;進入打包目錄
  (2)jar cvf hello.war *  ;將當前目錄下的所有內容打包到hello.war檔案中
  
  
6、將service 類釋出到網路伺服器上
 ①啟動sun 伺服器
   方法為
  開始->程式->Sun Microsystems->Application Server PE 9->Start  Default Server
 ②在專案目錄下建立一個passwd檔案,內容是sun伺服器admin使用者的密碼,例如
  AS_ADMIN_PASSWORD=testtesttest
 ③將hello.war釋出到伺服器上,執行
  (1)cd WebTest  ;進入專案目錄
  (2)釋出伺服器包,注意這個命令是在一行執行的,
  我為了書寫方便而斷行。分號後面是註釋
  asadmin deploy
    --user admin             ;管理員使用者名稱
    --passwordfile passwd    ;密碼檔名,就是我們剛才寫的passwd檔案
    --host localhost        
    --port 4848     ;管理埠號
    --contextroot myhello   ;上下文根名稱
    --upload=true    
    --target server    
    deploy/hello.war
 
 ④在瀏覽器中輸入地址
  http://localhost:8080/myhello/HelloService?WSDL
  如果瀏覽器能顯示出正確的內容,就說明成功。

7、生成客戶端的stub類
 ①在專案的build/classes目錄下建立一個stub子目錄
 ②執行
  (1)cd WebTest   ;進入專案子目錄
  (2)wsimport -keep -d ./build/classes/stub http://localhost:8080/myhello/HelloService?WSDL
 
 執行完成後會在build/classes/stub下建立一個endpoint目錄,下面有這些檔案
  GetHello.java
  GetHelloResponse.java
  Hello.java
  HelloService.java
  GetHello.class
  GetHelloResponse.class
  Hello.class
  HelloService.class
  ObjectFactory.class
  ObjectFactory.java
  package-info.java
  package-info.class
 這些檔案和ant指令碼中import執行的結果一樣
 
8、編寫客戶端測試程式
 在專案的src目錄下建立一個子目錄client,在這個目錄下面建立一個
 Client.java檔案,內容為
 
 // src/client/Client.java檔案 呼叫伺服器提供的webservice的測試類
 package client;

 import javax.xml.ws.WebServiceRef;
 import endpoint.HelloService;
 import endpoint.Hello;

 public class Client
 {
     @WebServiceRef(wsdlLocation="http://localhost:8080/myhello/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();
         }
     }
 }
 
9、編譯客戶端程式
 執行
 (1)cd WebTest  ;進入專案目錄
 (2)javac -classpath ./build/classes/stub;d:/Sun/SDK/lib/javaee.jar;d:/Sun/SDK/lib/appserv-ws.jar -d ./build/classes/stub src/client/Client.java 
 執行成功後會在F:/exercise/java/WebTest/build/classes目錄下建立一個
 client目錄,下面有一個Client.class檔案
 
10、執行客戶端程式
 (1)cd WebTest/build/classes/stub  ;進入client的上級目錄
 (2)set  APPCPATH=.     ;設定環境變數APPCPATH,不然執行appclient程式時會出一堆莫名奇妙的錯誤
 (3)>appclient client.Client執行測試程式,結果為
  Hello result = Hello Administrator!
 執行成功


/*title: web service入門學習筆記(八)
**date: 2007/01/19
**author:laomai
**url: http://blog.csdn.net/laomai/
*/

八、小結
開發webservice的基本步驟為
1、編寫伺服器端,要點有
 ①匯入WebService包和WebMethod包
   import javax.jws.WebService;
   import javax.jws.WebMethod;
 ②實現的服務類前加@WebService符號 
 ③為了程式碼清晰,類提供的公開方法前加@WebMethod符號,這個不寫對編譯也沒影響,
  
2、編譯伺服器端,要點為
 ①javac命令的classpath選項中要有javaee.jar的路徑,如
  javac -classpath d:/Sun/SDK/lib/javaee.jar -d ./build src/endpoint/Hello.java
 ②用wsgen命令生成wsdl檔案.
 ③將伺服器端打包
 注意如果是sun的伺服器,那麼把service類直接編譯到
 javaee5安裝目錄/domains/domain1/autodeploy下,可以自動完成②和③的工作。
 我們介紹的sun自帶的入門指令碼就是這麼做的。
3、在客戶端機器上自動生成stub類,要點為
 ①客戶機上必須也裝有jdk和javaee5
 ②用wsimport工具將伺服器傳過來的wsdl檔案轉換成本地的stub類
4、編寫客戶端呼叫程式碼,要點:
 ①匯入WebServiceRef包
  import javax.xml.ws.WebServiceRef;
 ②匯入本地生成的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"));
5、編譯客戶端呼叫程式,注意classpath引數中要有
 ①stub類的路徑
 ②javaee.jar的路徑
 ③appserv-ws.jar的路徑
 
6、用appclient執行客戶端程式,要點為
 ①進入到客戶端程式的上級目錄
 ②把APPCPATH的值設定為當前目錄" . "
 ③appclient的第一個引數為客戶端程式名,
   後面的引數是傳給客戶端程式本身的命令列引數。

/*title: web service入門學習筆記(九)
**date: 2007/01/19
**author:laomai
**url: http://blog.csdn.net/laomai/
*/ 
 
九、本文中用到的檔案
1、WebTest專案檔案列表 
WebTest/passwd 儲存密碼的檔案,手工建立
WebTest/src 子目錄 手工建立,內容為
 endpoint/Hello.java  伺服器類的實現檔案
 client/Client.java   客戶類的實現檔案
WebTest/build
 generated 子目錄,手工建立,內容為
  HelloService.wsdl   由wsgen命令生成
  HelloService_schema1.xsd  由wsgen命令生成
 classes 子目錄,手工建立,內容為
  endpoint/Hello.class  由javac命令生成
  endpoint/jaxws子目錄,由wsgen命令自動生成,內容為
    GetHello.java
    GetHelloResponse.java
    GetHello.class
    GetHelloResponse.class
  stub 子目錄,手工建立,內容為:
   client/Client.class 由javac命令生成
   endpoint 子目錄 由wsimport命令自動生成,內容為:
    GetHello.java
    GetHelloResponse.java
    Hello.java
    HelloService.java
    ObjectFactory.java
    package-info.java
    package-info.class
    GetHello.class
    GetHelloResponse.class
    Hello.class
    HelloService.class
    ObjectFactory.class
WebTest/deploy子目錄 手工建立,內容為
 hello.war 將WEB-INF子目錄打包後生成的檔案,由jar命令生成
 WEB-INF   打包的輸入目錄,手工建立。內容包括:
  web.xml   手工建立
  classes/endpoint子目錄 為build/classes/endpoint的拷貝
  wsdl子目錄,由build/generated拷貝而來

2、生成的HelloService.wsdl檔案的內容
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://endpoint/" name="HelloService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://endpoint/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://endpoint/" schemaLocation="HelloService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="getHello">
    <part name="parameters" element="tns:getHello"/>
  </message>
  <message name="getHelloResponse">
    <part name="parameters" element="tns:getHelloResponse"/>
  </message>
  <portType name="Hello">
    <operation name="getHello">
      <input message="tns:getHello"/>
      <output message="tns:getHelloResponse"/>
    </operation>
  </portType>
  <binding name="HelloPortBinding" type="tns:Hello">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="getHello">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="HelloService">
    <port name="HelloPort" binding="tns:HelloPortBinding">
      <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
    </port>
  </service>
</definitions>

十、致謝
 在學習WebService的過程中,我得到了csdn java版的葉鋒城朋友的許多指點,
餅子堂的兄弟們也給了很多有用的資料,這裡一併表示謝意。本文也算是我給這些
朋友們的一個彙報和總結,呵呵。

(--end
/*title: web service入門學習筆記
**date: 2007/01/23
**author:laomai
**url: http://blog.csdn.net/laomai/*/

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述