Java API for XML Web Services (JAX-WS), JSR 224 是 Java EE 5 和 EE 6 平台的一个重要组成部分。作为 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 服务的基础知识。创建 Web 服务后,您将编写三个不同的 Web 服务客户端,这些客户端通过网络使用 Web 服务(称为“使用”Web 服务)。这三个客户端分别是 Java SE 应用程序中的 Java 类、Web 应用程序中的 Servlet 和 Web 应用程序中的 JSP 页。开发 JAX-WS Web 服务客户端是集中讨论客户端的更高级教程。
重要说明:Java EE 6 项目需要使用 Tomcat 7.x、GlassFish Server 3.x 或 Oracle WebLogic Server 12c。
创建 Web 服务
本练习旨在创建一个适用于确定要使用的部署容器的项目。具有项目后,您将在其中创建一个 Web 服务。
选择容器
您可以在 Web 容器或 EJB 容器中部署 Web 服务。这取决于您的具体选择。如果要创建 Java EE 6 应用程序,则在任何情况下都使用 Web 容器,因为您可以将 EJB 直接放入 Web 应用程序中。例如,如果您计划部署到只有一个 Web 容器的 Tomcat Web Server,请创建一个 Web 应用程序,而不是 EJB 模块。
选择 "File"(文件)> "New Project"(新建项目)(在 Linux 和 Windows 上为 Ctrl-Shift-N 组合键,在 MacOS 上为 ⌘-Shift-N 组合键)。从 "Java Web" 类别中选择 "Web Application"(Web 应用程序),或从 "Java EE" 类别中选择 "EJB Module"(EJB 模块)。
您可以在 Maven 项目中创建 JAX-WS Web 服务。选择 "File"(文件)> "New Project"(新建项目)(在 Linux 和 Windows 上为 Ctrl-Shift-N 组合键,在 MacOS 上为 ⌘-Shift-N 组合键),然后从 "Maven" 类别中选择 "Maven Web Application"(Maven Web 应用程序)或 "Maven EJB module"(Maven EJB 模块)。如果您以前没有同时使用过 Maven 和 NetBeans,请参见 Maven 最佳做法。
@WebMethod
public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
int k = i + j;
return k;
}
正如您在上面的代码中所看到的一样,Web 服务仅接收两个数字,然后返回二者之和。在下一部分中,您将使用 IDE 测试 Web 服务。
部署和测试 Web 服务
在将 Web 服务部署到服务器后,如果服务器具有测试客户端,则可以使用 IDE 打开服务器的测试客户端。GlassFish 和 WebLogic 服务器提供了测试客户端。如果使用的是 Tomcat Web Server,则不提供测试客户端,但 IDE 可以打开一个页面以显示部署了 Web 服务。当前还没有用于测试 EJB 模块是否成功部署的工具。
您可以选择 "File"(文件)> "New Project"(新建项目)(在 Linux 和 Windows 上为 Ctrl-Shift-N 组合键,在 MacOS 上为 ⌘-Shift-N 组合键),然后导航至 "Samples"(样例)> "Java Web Service"(Java Web 服务)> "Calculator (EE6)"(计算器(EE6)),以打开计算器服务的完整 EE6 版本。
在此部分,您将创建一个标准的 Java 应用程序。用于创建应用程序的向导也可以创建 Java 类。之后,您将使用 IDE 的工具来创建一个客户端,并使用在本教程开始时创建的 Web 服务。
选择 "File"(文件)> "New Project"(新建项目)(在 Linux 和 Windows 上为 Ctrl-Shift-N 组合键,在 MacOS 上为 ⌘-Shift-N 组合键)。选择 "Java" 类别中的 "Java Application"(Java 应用程序)选项。将该项目命名为 CalculatorWS_Client_Application。将 "Create Main Class"(创建主类)保留为选中状态,并接受所有其他缺省设置。单击 "Finish"(完成)。
右键单击 "CalculatorWS_Client_Application" 节点,然后选择 "New"(新建)> "Web Service Client"(Web 服务客户端)。"New Web Service Client"(新建 Web 服务客户端)向导打开。
选择 "Project"(项目)作为 WSDL 源。单击 "Browse"(浏览)。浏览至 CalculatorWSApplication 项目中的 CalculatorWS Web 服务。选定 Web 服务后,单击 "OK"(确定)。
请勿选择包名。将此字段保留为空。
将其他设置保留为缺省值,然后单击 "Finish"(完成)。
"Projects"(项目)窗口将显示新的 Web 服务客户端,其中包括已创建的 add 方法的节点:
双击以在源代码编辑器中打开主类。将 add 节点拖至 main() 方法下面。
现在,您将看到以下内容:
public static void main(String[] args) {
// TODO code application logic here
}
private static int add(int i, int j) {
org.me.calculator.CalculatorWS_Service service = new org.me.calculator.CalculatorWS_Service();
org.me.calculator.CalculatorWS port = service.getCalculatorWSPort();
return port.add(i, j);
}
注意:或者,您也可以在编辑器中单击鼠标右键,然后选择 "Insert Code"(插入代码)> "Call Web Service Operation"(调用 Web 服务操作),而无需拖动 add 节点。
在 main() 方法主体中,将 TODO 注释替换为执行以下操作的代码:初始化 i 和 j 的值,调用 add(),然后输出结果。
public static void main(String[] args) { int i = 3; int j = 4; int result = add(i, j); System.out.println("Result = " + result);
}
将 main() 方法代码包含在输出异常的 try/catch 块中。
public static void main(String[] args) { try { int i = 3; int j = 4; int result = add(i, j); System.out.println("Result = " + result); } catch (Exception ex) { System.out.println("Exception: " + ex); }
}
<%
try {
org.me.calculator.CalculatorWSService service =
new org.me.calculator.CalculatorWSService();
org.me.calculator.CalculatorWS port =
service.getCalculatorWSPort();
// TODO initialize WS operation arguments here
int i = 0;
int j = 0;
// TODO process result here
int result = port.add(i, j);
out.println("Result = "+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}
%>
将 i 和 j 的值从 0 更改为其他整数,如 3 和 4。将 catch 块中注释掉的 TODO 行替换为 out.println("exception" + ex);。