Java API for XML Web Services (JAX-WS), JSR 224 是 Java EE 平台的一个重要组成部分。作为 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 项目需要使用 GlassFish Server 或 Oracle WebLogic Server 12c。
捆绑的 Tomcat Web 服务器不是 Java EE 完全兼容的 Web 服务器。但是,Tomcat 7.x Web 服务器可以配置为支持一些 Java EE 功能。有关如何将对 Java EE 的支持添加到 Tomcat 中的信息,请参见 Apache TomEE 项目。
创建 Web 服务
本练习旨在创建一个适用于确定要使用的部署容器的项目。具有项目后,您将在其中创建一个 Web 服务。
选择容器
您可以在 Web 容器或 EJB 容器中部署 Web 服务。这取决于您的具体选择。如果要创建 Java EE 应用程序,则在任何情况下都使用 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 最佳做法。
在此部分,您将创建一个标准的 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 服务客户端)。此时将打开新建 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);。