/*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="
xmlns:xsi="
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
<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://endpoint/" xmlns:xsd="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="
<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/*/)
轉自http://blog.csdn.net/laomai/archive/2007/01/23/1490829.aspx
摘要: JavaSE6.0 Web Service學習筆記(引用)
Web Service概述
Web Service的定義
W3C組織對其的定義如下,它是一個軟件系統,為了支持跨網絡的機器間相互操作交互而設計。Web Service服務通常被定義為一組模塊化的API,它們可以通過網絡進行調用,來執行遠程系統的請求服務。
這里我們從一個程序員的視角來觀察web service。在傳統的程序編...
閱讀全文