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) 的後續發行版本,JAX-WS 簡化了使用 Java 技術開發 Web 服務的工作。並且通過對多種協議(如 SOAP 1.1、SOAP 1.2、XML)的支持,以及提供用於支持其他協議和 HTTP 的工具,它解決了 JAX-RPC 1.1 中存在的一些問題。JAX-WS 使用 JAXB 2.0 提供數據綁定服務,並支持通過定制來控制生成的服務端點接口。通過對標注的支持,JAX-WS 簡化了 Web 服務開發,並縮小了運行時 JAR 文件的大小。
本文檔向您介紹了一些有關使用 IDE 來開發 JAX-WS Web 服務以及在三個不同的客戶端(Java SE 應用程序中的 Java 類、Web 應用程序中的 Servlet 或 JSP 頁)中使用該服務的基礎知識。在本文檔中創建的三個客戶端是獨立的應用程序,它們都使用同一個 Web 服務。
安裝並配置教程環境
如果尚未注冊 Sun Java System Application Server 9.0 的實例,則必須先進行注冊,然後才可以著手開發 Java EE 5 應用程序:
從主窗口中,選擇“工具”>“服務器管理器”。
單擊“添加服務器”。選擇 "Sun Java System Application Server",並為此實例指定一個名稱,然後,單擊“下一步”。
指定服務器信息、應用服務器本地實例的位置以及要將 Web 服務部署到的域。
單擊“完成”。
注意:也可以部署到 Tomcat Web Server,但由於它僅具有一個 Web 容器,因此應在下一部分創建 Web 應用程序,而不是 EJB 模塊。與 JSR-109 Web 服務不同的是,JAX-WS Web 服務可以成功地部署到 Tomcat Web 容器中。
創建 Web 服務
本練習的目的是創建一個適用於您決定使用的部署容器的項目。在建立項目後,您將在其中創建 Web 服務。
選擇容器
您可以在 Web 容器或 EJB 容器中部署 Web 服務。這要取決於具體的選擇。例如,如果您計劃部署到僅具有 Web 容器的 Tomcat Web Server 上,則應該選擇創建 Web 應用程序,而不是 EJB 模塊。
選擇“文件”>“新建項目”(Ctrl-Shift-N)。從 "Web" 類別中,選擇“Web 應用程序”,或者從“企業”類別中,選擇“EJB 模塊”。
將項目命名為 CalculatorWSApplication。
根據要使用的部署服務器,請執行以下操作:
對於 Sun Java System Application Server,將 J2EE 版本設置為 "Java EE 5"。
對於 Tomcat Web Server,請取消選中“將源代碼級別設置為 1.4”復選框。
單擊“完成”。
通過 Java 類創建 Web 服務
右鍵單擊 CalculatorWSApplication 節點,然後選擇“新建”>“Web 服務”。
將 Web 服務命名為 CalculatorWS,在“包”中鍵入 org.me.calculator,然後單擊“完成”。
將在“項目”窗口中顯示新建的 Web 服務。例如,對於 Web 應用程序,現在“項目”窗口將如下所示:
IDE 將自動創建服務器所需的部署描述符(如果存在)。對於 Sun Java System Application Server,則不需要部署描述符。對於部署到 Tomcat Web Server 的 Web 服務,將添加 sun-jaxws.xml 以及 web.xml 中的 WSServlet 項。
小結
在本練習中,您創建了一個 NetBeans 項目並建立了 Web 服務。
對 Web 服務進行編碼
本練習的目的是對 IDE 生成的文件和代碼執行一些有意義的操作。您將添加一個操作,該操作可以將從客戶端接收到的兩個數字相加。
將業務邏輯添加到 Web 服務
展開“Web 服務”節點,然後雙擊 "CalculatorWS" 節點。將在源代碼編輯器中打開 Web 服務。請注意,代碼中已存在了一個操作。它被注釋掉了。現在,我們將從頭開始創建一個新的操作。創建此操作的另一種方法是刪除代碼注釋掉的行。
在類主體(位於注釋掉的代碼之上或之下)中單擊鼠標右鍵,然後選擇“Web 服務”>“添加操作”。
在“添加操作”對話框的上半部分,在“名稱”中鍵入 add,並從“返回類型”下拉列表中選擇 int。
在“添加操作”對話框的下半部分,單擊“添加”,然後創建一個類型為 int、名為 i 的參數。單擊“確定”。
重新單擊“添加”,然後創建一個類型為 int、名為 j 的參數。
單擊位於“添加操作”對話框底部的“確定”。請注意,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 模塊是否已成功部署的工具。
測試是否已成功部署到 Web 容器:
右鍵單擊項目節點,選擇“屬性”,然後單擊“運行”。根據要使用的部署服務器,請執行以下操作:
對於 Sun Java System Application Server,在“相對 URL”字段中鍵入 /CalculatorWSService?Tester。
對於 Tomcat Web Server,在“相對 URL”字段中鍵入 /CalculatorWS?Tester。
注意:由於部署的 EJB 模塊的結果不會顯示在浏覽器中,因此,如果您使用的是 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 服務後,我們需要創建一個客戶端來使用 Web 服務的 add 方法。在本練習中,我們將創建三個客戶端,即 Java SE 應用程序中的 Java 類、Web 應用程序中的 Servlet 和 JSP 頁。
客戶端 1:Java SE 應用程序中的 Java 類
選擇“文件”>“新建項目”(Ctrl-Shift-N)。從“常規”類別中,選擇“Java 應用程序”。將項目命名為 CalculatorWS_Client_Application。
注意:在編寫本文檔時,問題 10 尚未得到解決,您必須在路徑不包含空格的項目文件夾中創建 Web 服務客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊“完成”。
右鍵單擊 "CalculatorWS_Client_Application" 節點,然後選擇“新建”>“Web 服務客戶端”。
在“項目”中,單擊“浏覽”。找到要使用的 Web 服務。選擇 Web 服務後,單擊“確定”。
在“包”中鍵入 org.me.calculator.client,然後單擊“完成”。
將在“項目”窗口中顯示新建的 Web 服務客戶端:
雙擊 "Main.java" 以在源代碼編輯器中將其打開。刪除 TODO 注釋,並在該行中單擊鼠標右鍵。選擇“Web 服務客戶端資源”>“調用 Web 服務操作”。
找到“添加”操作,然後單擊“確定”。
將帶紅色下劃線的行更改為以下內容:System.out.println("Sum: " + port.add(3,4));
右鍵單擊項目節點,然後選擇“運行項目”。
現在“輸出”窗口會顯示以下內容:
compile:
run:
Sum: 7
BUILD SUCCESSFUL (total time: 1 second)
客戶端 2:Web 應用程序中的 Servlet
選擇“文件”>“新建項目”(Ctrl-Shift-N)。從 "Web" 類別中,選擇“Web 應用程序”。將項目命名為 CalculatorWSServletClient。
注意:在編寫本文檔時,問題 10 尚未得到解決,您必須在路徑不包含空格的項目文件夾中創建 Web 服務客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊“完成”。
右鍵單擊 "CalculatorWSServletClient" 節點,然後選擇“新建”>“Web 服務客戶端”。
在“項目”中,單擊“浏覽”。找到要使用的 Web 服務。選擇 Web 服務後,單擊“確定”。
在“包”中鍵入 org.me.calculator.client,然後單擊“完成”。
將在“項目”窗口中顯示新建的 Web 服務客戶端:
右鍵單擊項目節點,然後選擇“新建”> "Servlet"。將 Servlet 命名為 ClientServlet,並將它放置在名為 org.me.calculator.client 的包中。單擊“完成”。要使 Servlet 成為應用程序的入口點,請右鍵單擊該項目節點,選擇“屬性”,單擊“運行”,然後在“相對 URL”中鍵入 /ClientServlet。單擊“確定”。
在源代碼編輯器中,刪除注釋掉 processRequest 方法主體的行。該行是注釋掉代碼部分的起始行:/* TODO output your page here
然後,刪除注釋掉代碼部分的結束行:
*/
在以下行之後添加一些空行:
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
現在,在您添加的一個空行中單擊鼠標右鍵,選擇“Web 服務客戶端資源”>“調用 Web 服務操作”。將出現“選擇要調用的操作”對話框。
找到 add 操作,然後單擊“確定”。
現在 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);
}
右鍵單擊項目節點,然後選擇“運行項目”。
將啟動服務器(如果它尚未運行),生成並部署應用程序,並且打開浏覽器以顯示計算結果。
客戶端 3:Web 應用程序中的 JSP 頁
選擇“文件”>“新建項目”(Ctrl-Shift-N)。從 "Web" 類別中,選擇“Web 應用程序”。將項目命名為 CalculatorWSJSPClient。
注意:在編寫本文檔時,問題 10 尚未得到解決,您必須在路徑不包含空格的項目文件夾中創建 Web 服務客戶端。例如,路徑不能為 "C:\Documents and Settings\..."。
單擊“完成”。
右鍵單擊 "CalculatorWSJSPClient" 節點,然後選擇“新建”>“Web 服務客戶端”。
在“項目”中,單擊“浏覽”。找到要使用的 Web 服務。選擇 Web 服務後,單擊“確定”。
在“包”中鍵入 org.me.calculator.client,然後單擊“完成”。
將在“項目”窗口中顯示新建的 Web 服務客戶端。
在“Web 頁”文件夾中,雙擊 "index.jsp" 以在源代碼編輯器中將其打開。
在“Web 服務引用”節點中,展開表示 Web 服務的節點。現在將公開要從客戶端調用的 add 操作。
將 add 操作拖動到客戶端的 index.jsp 頁上,並將其放在 H1 標記之下。現在,將在 index.jsp 頁中生成用於調用服務操作的代碼。
將 arg0 和 arg1 的值更改為其他數值,如 3 和 4。
右鍵單擊項目節點,然後選擇“運行項目”。
將啟動服務器(如果它尚未運行),生成並部署應用程序,並且打開浏覽器以顯示計算結果: