原文地址:
http://testwww.netbeans.org/kb/55/websvc-jax-ws_zh_CN.html
Java EE 5 中的 Web 服務(wù) (JAX-WS)
由 Geertjan Wielenga、Manisha Umbarje、Martin Grebac、Milan Kuchtiak 和 Radko Najman 撰稿并修訂
Java API for XML Web Services (JAX-WS) 2.0,JSR 224 是 Java EE 5 平臺(tái)的重要組成部分。作為 Java API for XML-based RPC 1.1 (JAX-RPC) 的后續(xù)發(fā)行版本,JAX-WS 簡(jiǎn)化了使用 Java 技術(shù)開發(fā) Web 服務(wù)的工作。并且通過對(duì)多種協(xié)議(如 SOAP 1.1、SOAP 1.2、XML)的支持,以及提供用于支持其他協(xié)議和 HTTP 的工具,它解決了 JAX-RPC 1.1 中存在的一些問題。JAX-WS 使用 JAXB 2.0 提供數(shù)據(jù)綁定服務(wù),并支持通過定制來(lái)控制生成的服務(wù)端點(diǎn)接口。通過對(duì)標(biāo)注的支持,JAX-WS 簡(jiǎn)化了 Web 服務(wù)開發(fā),并縮小了運(yùn)行時(shí) JAR 文件的大小。
本文檔向您介紹了有關(guān)使用 IDE 開發(fā) JAX-WS Web 服務(wù)以及在三個(gè)不同的客戶端(Java SE 應(yīng)用程序中的 Java 類、Web 應(yīng)用程序中的 Servlet 或 JSP 頁(yè))中使用該服務(wù)的基礎(chǔ)知識(shí)。在本文檔中創(chuàng)建的三個(gè)客戶端是獨(dú)立的應(yīng)用程序,它們都使用同一個(gè) Web 服務(wù)。
預(yù)計(jì)持續(xù)時(shí)間:25 分鐘
本教程所需的軟件
在開始之前,您需要在計(jì)算機(jī)中安裝以下軟件:
- NetBeans IDE 5.5(下載)
- Java Standard Development Kit (JDK) 版本 5.0 或版本 6.0(下載)
- Sun Java System Application Server 9.0(如果未與安裝的 NetBeans IDE 捆綁在一起,請(qǐng)下載并單獨(dú)安裝它)。
教程練習(xí)
安裝并配置教程環(huán)境
如果尚未注冊(cè) Sun Java System Application Server 9.0 的實(shí)例,則必須先進(jìn)行注冊(cè),然后才可以著手開發(fā) Java EE 5 應(yīng)用程序:
- 從主窗口中,選擇“工具”>“服務(wù)器管理器”。
- 單擊“添加服務(wù)器”。選擇 "Sun Java System Application Server",并為此實(shí)例指定一個(gè)名稱,然后,單擊“下一步”。
- 指定服務(wù)器信息、應(yīng)用服務(wù)器本地實(shí)例的位置以及要將 Web 服務(wù)部署到的域。
- 單擊“完成”。
注意:也可以部署到 Tomcat Web Server,但由于它僅具有一個(gè) Web 容器,因此應(yīng)在下一部分創(chuàng)建 Web 應(yīng)用程序,而不是 EJB 模塊。與 JSR-109 Web 服務(wù)不同的是,JAX-WS Web 服務(wù)可以成功地部署到 Tomcat Web 容器中。
創(chuàng)建 Web 服務(wù)
本練習(xí)的目的是創(chuàng)建一個(gè)適用于您決定使用的部署容器的項(xiàng)目。在建立項(xiàng)目后,您將在其中創(chuàng)建 Web 服務(wù)。
選擇容器
您可以在 Web 容器或 EJB 容器中部署 Web 服務(wù)。這要取決于具體的選擇。例如,如果您計(jì)劃部署到僅具有 Web 容器的 Tomcat Web Server 上,則應(yīng)該選擇創(chuàng)建 Web 應(yīng)用程序,而不是 EJB 模塊。
- 選擇“文件”>“新建項(xiàng)目”(Ctrl-Shift-N)。從 "Web" 類別中,選擇“Web 應(yīng)用程序”,或者從“企業(yè)”類別中,選擇“EJB 模塊”。
- 將項(xiàng)目命名為 CalculatorWSApplication。
- 根據(jù)要使用的部署服務(wù)器,請(qǐng)執(zhí)行以下操作:
- 對(duì)于 Sun Java System Application Server,將 J2EE 版本設(shè)置為 "Java EE 5"。
- 對(duì)于 Tomcat Web Server,請(qǐng)取消選中“將源代碼級(jí)別設(shè)置為 1.4”復(fù)選框。
- 單擊“完成”。
通過 Java 類創(chuàng)建 Web 服務(wù)
- 右鍵單擊 CalculatorWSApplication 節(jié)點(diǎn),然后選擇“新建”>“Web 服務(wù)”。
- 將 Web 服務(wù)命名為 CalculatorWS,在“包”中鍵入 org.me.calculator,然后單擊“完成”。
將在“項(xiàng)目”窗口中顯示新建的 Web 服務(wù)。例如,對(duì)于 Web 應(yīng)用程序,現(xiàn)在“項(xiàng)目”窗口將如下所示:
IDE 將自動(dòng)創(chuàng)建服務(wù)器所需的部署描述符(如果有)。對(duì)于 Sun Java System Application Server,則不需要部署描述符。對(duì)于部署到 Tomcat Web Server 的 Web 服務(wù),將添加 sun-jaxws.xml 以及 web.xml 中的 WSServlet 項(xiàng)。
小結(jié)
在本練習(xí)中,您創(chuàng)建了一個(gè) NetBeans 項(xiàng)目并建立了 Web 服務(wù)。
對(duì) Web 服務(wù)進(jìn)行編碼
本練習(xí)的目的是對(duì) IDE 生成的文件和代碼執(zhí)行一些有意義的操作。您將添加一個(gè)操作,該操作將從客戶端接收到的兩個(gè)數(shù)字相加起來(lái)。
將業(yè)務(wù)邏輯添加到 Web 服務(wù)
- 展開“Web 服務(wù)”節(jié)點(diǎn),然后雙擊 "CalculatorWS" 節(jié)點(diǎn)。將在源代碼編輯器中打開 Web 服務(wù)。請(qǐng)注意,代碼中已存在了一個(gè)操作。它被注釋掉了?,F(xiàn)在,我們將從頭開始創(chuàng)建一個(gè)新的操作。創(chuàng)建此操作的另一種方法是刪除代碼注釋掉的行。
- 在類主體(位于注釋掉的代碼之上或之下)中單擊鼠標(biāo)右鍵,然后選擇“Web 服務(wù)”>“添加操作”。
- 在“添加操作”對(duì)話框的上半部分,在“名稱”中鍵入 add,并從“返回類型”下拉列表中選擇 int。
- 在“添加操作”對(duì)話框的下半部分,單擊“添加”,然后創(chuàng)建一個(gè)類型為 int、名為 i 的參數(shù)。單擊“確定”。
- 重新單擊“添加”,然后創(chuàng)建一個(gè)類型為 int、名為 j 的參數(shù)。
- 單擊位于“添加操作”對(duì)話框底部的“確定”。請(qǐng)注意,add 方法的框架已添加到源代碼編輯器中:
@WebMethod
public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
// TODO implement operation
return 0;
}
- 按如下所示更改 add 方法(更改內(nèi)容以粗體顯示):
@WebMethod
public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
int k = i + j;
return k;
}
小結(jié)
在本練習(xí)中,您已為 Web 服務(wù)添加了代碼。
部署并測(cè)試 Web 服務(wù)
在將 Web 服務(wù)部署到 Web 容器時(shí),IDE 允許您測(cè)試 Web 服務(wù)以查看它是否能夠按預(yù)期的那樣工作。鑒于此目的,我們?cè)?IDE 中集成了 Sun Java System Application Server 提供的 Tester 應(yīng)用程序。對(duì)于 Tomcat Web Server,也存在類似的工具。但是,Sun Java System Application Server 的 Tester 頁(yè)允許您輸入值并對(duì)其進(jìn)行測(cè)試,而 Tomcat Web Server 則不允許這樣做。在后一種情況下,您只能看到已部署了 Web 服務(wù),但是不能對(duì)值進(jìn)行測(cè)試。目前還沒有用于測(cè)試 EJB 模塊是否已成功部署的工具。
測(cè)試是否已成功部署到 Web 容器:
- 右鍵單擊項(xiàng)目節(jié)點(diǎn),選擇“屬性”,然后單擊“運(yùn)行”。根據(jù)要使用的部署服務(wù)器,請(qǐng)執(zhí)行以下操作:
- 對(duì)于 Sun Java System Application Server,在“相對(duì) URL”字段中鍵入 /CalculatorWSService?Tester。
- 對(duì)于 Tomcat Web Server,在“相對(duì) URL”字段中鍵入 /CalculatorWS?Tester。
注意:由于部署的 EJB 模塊的結(jié)果不會(huì)顯示在瀏覽器中,因此,如果您使用的是 EJB 模塊,則不能執(zhí)行上述步驟。
- 右鍵單擊項(xiàng)目節(jié)點(diǎn),然后選擇“運(yùn)行項(xiàng)目”。
IDE 將啟動(dòng)應(yīng)用服務(wù)器、生成應(yīng)用程序,并在瀏覽器中打開 tester 頁(yè)(如果已將 Web 應(yīng)用程序部署到 Sun Java System Application Server)。對(duì)于使用 Tomcat Web Server 和部署 EJB 模塊來(lái)說,情況則有所不同:
- 如果部署到 Sun Java System Application Server,在 tester 頁(yè)上鍵入兩個(gè)數(shù)字,如下所示:
- 將顯示這兩個(gè)數(shù)字的和:
小結(jié)
在本練習(xí)中,您已部署了 Web 服務(wù)并對(duì)其進(jìn)行了測(cè)試。
使用 Web 服務(wù)
部署 Web 服務(wù)后,我們需要?jiǎng)?chuàng)建一個(gè)客戶端來(lái)使用 Web 服務(wù)的 add 方法。在本練習(xí)中,我們將創(chuàng)建三個(gè)客戶端,即 Java SE 應(yīng)用程序中的 Java 類、Web 應(yīng)用程序中的 Servlet 和 JSP 頁(yè)。
客戶端 1:Java SE 應(yīng)用程序中的 Java 類
- 選擇“文件”>“新建項(xiàng)目”(Ctrl-Shift-N)。從“常規(guī)”類別中,選擇“Java 應(yīng)用程序”。將項(xiàng)目命名為 CalculatorWS_Client_Application。
注意:在編寫本文檔時(shí),問題 10 還仍未得到解決,您必須在其路徑不包含空格的項(xiàng)目文件夾中創(chuàng)建 Web 服務(wù)客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊“完成”。
- 右鍵單擊 "CalculatorWS_Client_Application" 節(jié)點(diǎn),然后選擇“新建”>“Web 服務(wù)客戶端”。
- 在“項(xiàng)目”中,單擊“瀏覽”。找到要使用的 Web 服務(wù)。選擇 Web 服務(wù)后,單擊“確定”。
- 在“包”中鍵入 org.me.calculator.client,然后單擊“完成”。
將在“項(xiàng)目”窗口中顯示新建的 Web 服務(wù)客戶端:
- 雙擊 "Main.java" 以在源代碼編輯器中將其打開。刪除 TODO 注釋,并在該行中單擊鼠標(biāo)右鍵。選擇“Web 服務(wù)客戶端資源”>“調(diào)用 Web 服務(wù)操作”。
- 找到“添加”操作,然后單擊“確定”。
- 將帶紅色下劃線的行更改為以下內(nèi)容:
System.out.println("Sum: " + port.add(3,4));
- 右鍵單擊項(xiàng)目節(jié)點(diǎn),然后選擇“運(yùn)行項(xiàng)目”。
現(xiàn)在“輸出”窗口會(huì)顯示以下內(nèi)容:
compile:
run:
Sum: 7
BUILD SUCCESSFUL (total time: 1 second)
客戶端 2:Web 應(yīng)用程序中的 Servlet
- 選擇“文件”>“新建項(xiàng)目”(Ctrl-Shift-N)。從 "Web" 類別中,選擇“Web 應(yīng)用程序”。將項(xiàng)目命名為 CalculatorWSServletClient。
注意:在編寫本文檔時(shí),問題 10 還仍未得到解決,您必須在其路徑不包含空格的項(xiàng)目文件夾中創(chuàng)建 Web 服務(wù)客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊“完成”。
- 右鍵單擊 "CalculatorWSServletClient" 節(jié)點(diǎn),然后選擇“新建”>“Web 服務(wù)客戶端”。
- 在“項(xiàng)目”中,單擊“瀏覽”。找到要使用的 Web 服務(wù)。選擇 Web 服務(wù)后,單擊“確定”。
- 在“包”中鍵入 org.me.calculator.client,然后單擊“完成”。
將在“項(xiàng)目”窗口中顯示新建的 Web 服務(wù)客戶端:
- 右鍵單擊項(xiàng)目節(jié)點(diǎn),然后選擇“新建”> "Servlet"。將 Servlet 命名為 ClientServlet,并將它放置在名為 org.me.calculator.client 的包中。單擊“完成”。要使 Servlet 成為應(yīng)用程序的入口點(diǎn),請(qǐng)右鍵單擊該項(xiàng)目節(jié)點(diǎn),選擇“屬性”,單擊“運(yùn)行”,然后在“相對(duì) URL”中鍵入 /ClientServlet。單擊“確定”。
- 在源代碼編輯器中,刪除注釋掉 processRequest 方法主體的行。該行是注釋掉代碼部分的起始行:
/* TODO output your page here
然后,刪除注釋掉代碼部分的結(jié)束行:
*/
在以下行之后添加一些空行:
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
現(xiàn)在,在您添加的一個(gè)空行中單擊鼠標(biāo)右鍵,選擇“Web 服務(wù)客戶端資源”>“調(diào)用 Web 服務(wù)操作”。將出現(xiàn)“選擇要調(diào)用的操作”對(duì)話框。
- 找到 add 操作,然后單擊“確定”。
現(xiàn)在 processRequest 方法應(yīng)該如下所示(下面以粗體顯示添加的代碼):
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet ClientServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
try { // Call Web Service Operation
org.me.calculator.client.CalculatorWSService service = new org.me.calculator.client.CalculatorWSService();
org.me.calculator.client.CalculatorWS port = service.getCalculatorWSPort();
// TODO initialize WS operation arguments here
int arg0 = 0;
int arg1 = 0;
// TODO process result here
int result = port.add(arg0, arg1);
System.out.println("Result = "+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}
out.println("</body>");
out.println("</html>");
out.close();
}
將 arg0 和 arg1 的值更改為其他數(shù)值,如 3 和 4。
將 System.out.println 語(yǔ)句更改為 out.println。
添加輸出異常的行(如果拋出異常)。
現(xiàn)在 try/catch 塊應(yīng)該如下所示(會(huì)突出顯示新行和更改行):
try { // Call Web Service Operation
org.me.calculator.client.CalculatorWSService service = new org.me.calculator.client.CalculatorWSService();
org.me.calculator.client.CalculatorWSApplication port = service.getCalculatorWSApplicationPort();
// TODO initialize WS operation arguments here
int arg0 = 3;
int arg1 = 4;
// TODO process result here
int result = port.add(arg0, arg1);
out.println("<p>Result: " + result);
} catch (Exception ex) {
out.println("<p>Exception: " + ex);
}
- 右鍵單擊項(xiàng)目節(jié)點(diǎn),然后選擇“運(yùn)行項(xiàng)目”。
將啟動(dòng)服務(wù)器(如果它尚未運(yùn)行),生成并部署應(yīng)用程序,并且打開瀏覽器以顯示計(jì)算結(jié)果。
客戶端 3:Web 應(yīng)用程序中的 JSP 頁(yè)
- 選擇“文件”>“新建項(xiàng)目”(Ctrl-Shift-N)。從 "Web" 類別中,選擇“Web 應(yīng)用程序”。將項(xiàng)目命名為 CalculatorWSJSPClient。
注意:在編寫本文檔時(shí),問題 10 還仍未得到解決,您必須在其路徑不包含空格的項(xiàng)目文件夾中創(chuàng)建 Web 服務(wù)客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊“完成”。
- 右鍵單擊 "CalculatorWSJSPClient" 節(jié)點(diǎn),然后選擇“新建”>“Web 服務(wù)客戶端”。
- 在“項(xiàng)目”中,單擊“瀏覽”。找到要使用的 Web 服務(wù)。選擇 Web 服務(wù)后,單擊“確定”。
- 在“包”中鍵入 org.me.calculator.client,然后單擊“完成”。
將在“項(xiàng)目”窗口中顯示新建的 Web 服務(wù)客戶端。
- 在“Web 頁(yè)”文件夾中,雙擊 "index.jsp" 以在源代碼編輯器中將其打開。
- 在“Web 服務(wù)引用”節(jié)點(diǎn)中,展開表示 Web 服務(wù)的節(jié)點(diǎn)?,F(xiàn)在將公開要從客戶端調(diào)用的 add 操作。
- 將 add 操作拖動(dòng)到客戶端的 index.jsp 頁(yè)上,并將其放在 H1 標(biāo)記之下。現(xiàn)在,將在 index.jsp 頁(yè)中生成用于調(diào)用服務(wù)操作的代碼。
將 arg0 和 arg1 的值更改為其他數(shù)值,如 3 和 4。
- 右鍵單擊項(xiàng)目節(jié)點(diǎn),然后選擇“運(yùn)行項(xiàng)目”。
將啟動(dòng)服務(wù)器(如果它尚未運(yùn)行),生成并部署應(yīng)用程序,并且打開瀏覽器以顯示計(jì)算結(jié)果:
后續(xù)步驟
有關(guān)使用 NetBeans IDE 5.5 開發(fā) Java EE 應(yīng)用程序的更多信息,請(qǐng)參見以下資源:
要發(fā)送意見和建議、獲得支持以及隨時(shí)了解 NetBeans IDE Java EE 開發(fā)功能的最新開發(fā)情況,請(qǐng)加入 nbj2ee@netbeans.org 郵件列表。