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="
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/*/)