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 技術開發(fā) Web 服務的工作。并且通過對多種協(xié)議(如 SOAP 1.1、SOAP 1.2、XML)的支持,以及提供用于支持其他協(xié)議和 HTTP 的工具,它解決了 JAX-RPC 1.1 中存在的一些問題。JAX-WS 使用 JAXB 2.0 提供數據綁定服務,并支持通過定制來控制生成的服務端點接口。通過對標注的支持,JAX-WS 簡化了 Web 服務開發(fā),并縮小了運行時 JAR 文件的大小。
本文檔向您介紹了有關使用 IDE 開發(fā) JAX-WS Web 服務以及在三個不同的客戶端(Java SE 應用程序中的 Java 類、Web 應用程序中的 Servlet 或 JSP 頁)中使用它的基礎知識。在本文檔中創(chuàng)建的三個客戶端是獨立的應用程序,它們都使用同一個 Web 服務。
將 Web 服務命名為 CalculatorWS,在 "Package" 中鍵入 org.me.calculator,然后單擊 "Finish"。
將在 "Projects" 窗口中顯示新建的 Web 服務。例如,對于 Web 應用程序,現在 "Projects" 窗口將如下所示:
IDE 將自動創(chuàng)建服務器所需的部署描述符(如果有)。對于 Sun Java System Application Server,則不需要部署描述符。對于部署到 Tomcat Web Server 的 Web 服務,將添加 sun-jaxws.xml 以及 web.xml 中的 WSServlet 項。
小結
在本練習中,您創(chuàng)建了一個 NetBeans 項目并建立了 Web 服務。
對 Web 服務進行編碼
本練習的目的是對 IDE 生成的文件和代碼執(zhí)行一些有意義的操作。您將添加一個操作,該操作將從客戶端接收到的兩個數字相加起來。
將業(yè)務邏輯添加到 Web 服務
展開 "Web Services" 節(jié)點,然后雙擊 CalculatorWS 節(jié)點。將在源代碼編輯器中打開 Web 服務。請注意,代碼中已存在了一個操作。它被注釋掉了。現在,我們將從頭開始創(chuàng)建一個新的操作。創(chuàng)建此操作的另一種方法是刪除代碼注釋掉的行。
在 "Add Operation" 對話框的下半部分,單擊 "Add",然后創(chuàng)建一個類型為 int、名為 i 的參數。單擊 "OK"。
重新單擊 "Add",然后創(chuàng)建一個類型為 int、名為 j 的參數。
單擊位于 "Add Operation" 對話框底部的 "OK"。
請注意,add 方法的框架已添加到源代碼編輯器中:
@WebMethod
public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
// TODO implement operation
return 0;
}
按如下所示更改 add 方法(更改內容以粗體顯示):
@WebMethod
public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
int k = i + j;
return k;
}
小結
在本練習中,您已為 Web 服務添加了代碼。
部署并測試 Web 服務
在將 Web 服務部署到 Web 容器時,IDE 允許您測試 Web 服務以查看它是否能夠按預期的那樣工作。鑒于此目的,在 IDE 中集成了 Sun Java System Application Server 提供的 Tester 應用程序。對于 Tomcat Web Server,也存在類似的工具。但是,Sun Java System Application Server 的 Tester 頁允許您輸入值并對其進行測試,而 Tomcat Web Server 則不允許這樣做。在后一種情況下,您只能看到已部署了 Web 服務,但是不能對值進行測試。目前還沒有用于測試 EJB 模塊是否已成功部署的工具。
IDE 將啟動應用服務器、生成應用程序,并在瀏覽器中打開 tester 頁(如果已將 Web 應用程序部署到 Sun Java System Application Server)。對于使用 Tomcat Web Server 和部署 EJB 模塊來說,情況則有所不同:
如果部署到 Tomcat Web Server,將看到以下內容(表明已成功部署了 Web 服務):
如果部署了 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
如果部署到 Sun Java System Application Server,在 tester 頁上鍵入兩個數字,如下所示:
將顯示這兩個數字的和:
小結
在本練習中,您已部署了 Web 服務并對其進行了測試。
使用 Web 服務
部署 Web 服務后,我們需要創(chuàng)建一個客戶端來使用 Web 服務的 add 方法。在本練習中,我們將創(chuàng)建三個客戶端,即 Java SE 應用程序中的 Java 類、Web 應用程序中的 Servlet 和 JSP 頁。
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
現在,在您添加的一個空行中單擊鼠標右鍵,選擇 "Web Service Client Resources" > "Call Web Service Operation"。將出現 "Select Operation to Invoke" 對話框。
找到 add 操作,然后單擊 "OK"。
現在 processRequest 方法應該如下所示(下面以粗體顯示添加的代碼):
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 的值更改為其他數字,如 3 和 4。
將 System.out.println 語句更改為 out.println。
添加輸出異常的行(如果拋出異常)。
現在 try/catch 塊應該如下所示(會突出顯示新行和更改行):
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);
}