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ù)開(kāi)發(fā) Web 服務(wù)的工作。并且通過(guò)對(duì)多種協(xié)議(如 SOAP 1.1、SOAP 1.2、XML)的支持,以及提供用于支持其他協(xié)議和 HTTP 的工具,它解決了 JAX-RPC 1.1 中存在的一些問(wèn)題。JAX-WS 使用 JAXB 2.0 提供數(shù)據(jù)綁定服務(wù),并支持通過(guò)定制來(lái)控制生成的服務(wù)端點(diǎn)接口。通過(guò)對(duì)標(biāo)注的支持,JAX-WS 簡(jiǎn)化了 Web 服務(wù)開(kāi)發(fā),并縮小了運(yùn)行時(shí) JAR 文件的大小。
本文檔向您介紹了有關(guān)使用 IDE 開(kāi)發(fā) JAX-WS Web 服務(wù)以及在三個(gè)不同的客戶(hù)端(Java SE 應(yīng)用程序中的 Java 類(lèi)、Web 應(yīng)用程序中的 Servlet 或 JSP 頁(yè))中使用它的基礎(chǔ)知識(shí)。在本文檔中創(chuàng)建的三個(gè)客戶(hù)端是獨(dú)立的應(yīng)用程序,它們都使用同一個(gè) Web 服務(wù)。
如果尚未注冊(cè) Sun Java System Application Server 9.0 的實(shí)例,則必須先進(jìn)行注冊(cè),然后才可以著手開(kāi)發(fā) Java EE 5 應(yīng)用程序:
從主窗口中,選擇 "Tools" > "Server Manager"。
單擊 "Add Server..."。選擇 "Sun Java System Application Server",并為此實(shí)例指定一個(gè)名稱(chēng),然后單擊 "Next"。
指定服務(wù)器信息、應(yīng)用服務(wù)器本地實(shí)例的位置以及要將 Web 服務(wù)部署到的域。
單擊 "Finish"。
注意:也可以部署到 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 模塊。
將 Web 服務(wù)命名為 CalculatorWS,在 "Package" 中鍵入 org.me.calculator,然后單擊 "Finish"。
將在 "Projects" 窗口中顯示新建的 Web 服務(wù)。例如,對(duì)于 Web 應(yīng)用程序,現(xiàn)在 "Projects" 窗口將如下所示:
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è)操作,該操作將從客戶(hù)端接收到的兩個(gè)數(shù)字相加起來(lái)。
將業(yè)務(wù)邏輯添加到 Web 服務(wù)
展開(kāi) "Web Services" 節(jié)點(diǎn),然后雙擊 CalculatorWS 節(jié)點(diǎn)。將在源代碼編輯器中打開(kāi) Web 服務(wù)。請(qǐng)注意,代碼中已存在了一個(gè)操作。它被注釋掉了?,F(xiàn)在,我們將從頭開(kāi)始創(chuàng)建一個(gè)新的操作。創(chuàng)建此操作的另一種方法是刪除代碼注釋掉的行。
@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ù)期的那樣工作。鑒于此目的,在 IDE 中集成了 Sun Java System Application Server 提供的 Tester 應(yīng)用程序。對(duì)于 Tomcat Web Server,也存在類(lèi)似的工具。但是,Sun Java System Application Server 的 Tester 頁(yè)允許您輸入值并對(duì)其進(jìn)行測(cè)試,而 Tomcat Web Server 則不允許這樣做。在后一種情況下,您只能看到已部署了 Web 服務(wù),但是不能對(duì)值進(jìn)行測(cè)試。目前還沒(méi)有用于測(cè)試 EJB 模塊是否已成功部署的工具。
IDE 將啟動(dòng)應(yīng)用服務(wù)器、生成應(yīng)用程序,并在瀏覽器中打開(kāi) tester 頁(yè)(如果已將 Web 應(yīng)用程序部署到 Sun Java System Application Server)。對(duì)于使用 Tomcat Web Server 和部署 EJB 模塊來(lái)說(shuō),情況則有所不同:
如果部署到 Tomcat Web Server,將看到以下內(nèi)容(表明已成功部署了 Web 服務(wù)):
如果部署了 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 頁(yè)上鍵入兩個(gè)數(shù)字,如下所示:
將顯示這兩個(gè)數(shù)字的和:
小結(jié)
在本練習(xí)中,您已部署了 Web 服務(wù)并對(duì)其進(jìn)行了測(cè)試。
使用 Web 服務(wù)
部署 Web 服務(wù)后,我們需要?jiǎng)?chuàng)建一個(gè)客戶(hù)端來(lái)使用 Web 服務(wù)的 add 方法。在本練習(xí)中,我們將創(chuàng)建三個(gè)客戶(hù)端,即 Java SE 應(yīng)用程序中的 Java 類(lèi)、Web 應(yīng)用程序中的 Servlet 和 JSP 頁(yè)。
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
現(xiàn)在,在您添加的一個(gè)空行中單擊鼠標(biāo)右鍵,選擇 "Web Service Client Resources" > "Call Web Service Operation"。將出現(xiàn) "Select Operation to Invoke" 對(duì)話(huà)框。
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();
}
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);
}