Java API for XML Web Services (JAX-WS) 2.0,JSR 224 是 Java EE 5 平臺的重要組成部分。作為 Java API for XML-based RPC 1.1 (JAX-RPC) 的后續(xù)發(fā)行版本,JAX-WS 簡化了使用 Java 技術(shù)開發(fā) Web 服務(wù)的工作。并且通過對多種協(xié)議(如 SOAP 1.1、SOAP 1.2、XML)的支持,以及提供用于支持其他協(xié)議和 HTTP 的工具,它解決了 JAX-RPC 1.1 中存在的一些問題。JAX-WS 使用 JAXB 2.0 提供數(shù)據(jù)綁定服務(wù),并支持通過定制來控制生成的服務(wù)端點(diǎn)接口。通過對標(biāo)注的支持,JAX-WS 簡化了 Web 服務(wù)開發(fā),并縮小了運(yùn)行時 JAR 文件的大小。
本文檔向您介紹了有關(guān)使用 IDE 開發(fā) JAX-WS Web 服務(wù)以及在三個不同的客戶端(Java SE 應(yīng)用程序中的 Java 類、Web 應(yīng)用程序中的 Servlet 或 JSP 頁)中使用它的基礎(chǔ)知識。在本文檔中創(chuàng)建的三個客戶端是獨(dú)立的應(yīng)用程序,它們都使用同一個 Web 服務(wù)。
預(yù)計所需時間:25 分鐘
在開始之前,您需要在計算機(jī)中安裝以下軟件:
如果尚未注冊 Sun Java System Application Server 9.0 的實(shí)例,則必須先進(jìn)行注冊,然后才可以著手開發(fā) Java EE 5 應(yīng)用程序:
注意:也可以部署到 Tomcat Web Server,但由于它僅具有一個 Web 容器,因此應(yīng)在下一部分創(chuàng)建 Web 應(yīng)用程序,而不是 EJB 模塊。與 JSR-109 Web 服務(wù)不同的是,JAX-WS Web 服務(wù)可以成功地部署到 Tomcat Web 容器中。
本練習(xí)的目的是創(chuàng)建一個適用于您決定使用的部署容器的項(xiàng)目。在建立項(xiàng)目后,您將在其中創(chuàng)建 Web 服務(wù)。
您可以在 Web 容器或 EJB 容器中部署 Web 服務(wù)。這要取決于具體的選擇。例如,如果您計劃部署到僅具有 Web 容器的 Tomcat Web Server 上,則應(yīng)該選擇創(chuàng)建 Web 應(yīng)用程序,而不是 EJB 模塊。
將在 "Projects" 窗口中顯示新建的 Web 服務(wù)。例如,對于 Web 應(yīng)用程序,現(xiàn)在 "Projects" 窗口將如下所示:
IDE 將自動創(chuàng)建服務(wù)器所需的部署描述符(如果有)。對于 Sun Java System Application Server,則不需要部署描述符。對于部署到 Tomcat Web Server 的 Web 服務(wù),將添加 sun-jaxws.xml 以及 web.xml 中的 WSServlet 項(xiàng)。
在本練習(xí)中,您創(chuàng)建了一個 NetBeans 項(xiàng)目并建立了 Web 服務(wù)。
本練習(xí)的目的是對 IDE 生成的文件和代碼執(zhí)行一些有意義的操作。您將添加一個操作,該操作將從客戶端接收到的兩個數(shù)字相加起來。
請注意,add 方法的框架已添加到源代碼編輯器中:
@WebMethod public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) { // TODO implement operation return 0; }
@WebMethod public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) { int k = i + j; return k; }
在本練習(xí)中,您已為 Web 服務(wù)添加了代碼。
在將 Web 服務(wù)部署到 Web 容器時,IDE 允許您測試 Web 服務(wù)以查看它是否能夠按預(yù)期的那樣工作。鑒于此目的,在 IDE 中集成了 Sun Java System Application Server 提供的 Tester 應(yīng)用程序。對于 Tomcat Web Server,也存在類似的工具。但是,Sun Java System Application Server 的 Tester 頁允許您輸入值并對其進(jìn)行測試,而 Tomcat Web Server 則不允許這樣做。在后一種情況下,您只能看到已部署了 Web 服務(wù),但是不能對值進(jìn)行測試。目前還沒有用于測試 EJB 模塊是否已成功部署的工具。
測試是否已成功部署到 Web 容器:
注意:由于部署的 EJB 模塊的結(jié)果不會顯示在瀏覽器中,因此,如果您使用的是 EJB 模塊,則不能執(zhí)行上述步驟。
IDE 將啟動應(yīng)用服務(wù)器、生成應(yīng)用程序,并在瀏覽器中打開 tester 頁(如果已將 Web 應(yīng)用程序部署到 Sun Java System Application Server)。對于使用 Tomcat Web Server 和部署 EJB 模塊來說,情況則有所不同:
Deployment of application CalculatorWSApplication completed successfully Enable of CalculatorWSApplication in target server completed successfully Enable of application in all targets completed successfully All operations completed successfully run-deploy: run: BUILD SUCCESSFUL
在本練習(xí)中,您已部署了 Web 服務(wù)并對其進(jìn)行了測試。
部署 Web 服務(wù)后,我們需要創(chuàng)建一個客戶端來使用 Web 服務(wù)的 add 方法。在本練習(xí)中,我們將創(chuàng)建三個客戶端,即 Java SE 應(yīng)用程序中的 Java 類、Web 應(yīng)用程序中的 Servlet 和 JSP 頁。
注意:在編寫本文檔時,問題 10 仍未得到解決,您必須在其路徑不包含空格的項(xiàng)目文件夾中創(chuàng)建 Web 服務(wù)客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊 "Finish"。
將在 "Projects" 窗口中顯示新建的 Web 服務(wù)客戶端:
System.out.println("Sum: " + port.add(3,4));
現(xiàn)在 "Output" 窗口會顯示以下內(nèi)容:
compile: run: Sum: 7 BUILD SUCCESSFUL (total time: 1 second)
注意:在編寫本文檔時,問題 10 仍未得到解決,您必須在其路徑不包含空格的項(xiàng)目文件夾中創(chuàng)建 Web 服務(wù)客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊 "Finish"。
將在 "Projects" 窗口中顯示新建的 Web 服務(wù)客戶端:
/* TODO output your page here
然后,刪除注釋掉代碼部分的結(jié)束行:
*/
在以下行之后添加一些空行:
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
現(xiàn)在,在您添加的一個空行中單擊鼠標(biāo)右鍵,選擇 "Web Service Client Resources" > "Call Web Service Operation"。將出現(xiàn) "Select Operation to Invoke" 對話框。
現(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 語句更改為 out.println。
添加輸出異常的行(如果拋出異常)。
現(xiàn)在 try/catch 塊應(yīng)該如下所示(會突出顯示新行和更改行):
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); }
將啟動服務(wù)器(如果它尚未運(yùn)行),生成并部署應(yīng)用程序,并且打開瀏覽器以顯示計算結(jié)果。
注意:在編寫本文檔時,問題 10 仍未得到解決,您必須在其路徑不包含空格的項(xiàng)目文件夾中創(chuàng)建 Web 服務(wù)客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊 "Finish"。
將在 "Projects" 窗口中顯示新建的 Web 服務(wù)客戶端。
將 arg0 和 arg1 的值更改為其他數(shù)字,如 3 和 4。
將啟動服務(wù)器(如果它尚未運(yùn)行),生成并部署應(yīng)用程序,并且打開瀏覽器以顯示計算結(jié)果:
要發(fā)送意見和建議、獲得支持以及隨時了解 NetBeans IDE J2EE 開發(fā)功能的最新開發(fā)情況,請加入 nbusers@netbeans.org 郵件列表。