JAX-WS Web 服务入门指南
Java API for XML Web Services (JAX-WS) 2.0/2.1, 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 服务的基础知识。创建 Web 服务后,您将编写三个不同的 Web 服务客户端,这些客户端通过网络使用 Web 服务(称为“使用”Web 服务)。这三个客户端分别是 Java SE 应用程序中的 Java 类、Web 应用程序中的 Servlet 和 Web 应用程序中的 JSP 页。开发 JAX-WS Web 服务客户端是集中讨论客户端的更高级教程。
目录

要学习本教程,您需要具备以下软件和资源。
如果您使用的是 JDK 6,则必须具备 JDK 6 Update 7 或更高版本。
Tomcat 和 GlassFish 都可以随同 NetBeans IDE 的 Web 和 Java EE 分发一起安装。此外,也可以访问 GlassFish 下载页或 Apache Tomcat 下载页。
创建 Web 服务
本练习旨在创建一个适用于确定要使用的部署容器的项目。具有项目后,您将在其中创建一个 Web 服务。
选择容器
您可以在 Web 容器或 EJB 容器中部署 Web 服务。这取决于您的具体选择。例如,如果您计划部署到只有一个 Web 容器的 Tomcat Web Server,请创建一个 Web 应用程序,而不是 EJB 模块。
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。从 "Web" 类别中选择“Web 应用程序”,或从“企业”类别中选择“EJB 模块”。
- 将该项目命名为 CalculatorWSApplication。
- 根据您要使用的部署服务器,执行以下操作:
- 对于 GlassFish,请将“Java EE 版本”设置为 "Java EE 5"。
- 对于 Tomcat Web Server,请取消选中“将源代码级别设置为 1.4”复选框。
- 单击以浏览其余页面,然后单击“完成”。
NetBeans 6.1 提供了一些用于创建项目的新选项,对于这些选项,可以保留其缺省设置。例如,可以将“使用专用文件夹存储库”复选框保留为取消选中状态。
通过 Java 类创建 Web 服务
- 右键单击 "CalculatorWSApplication" 节点,然后选择“新建”>“Web 服务”。
- 将该 Web 服务命名为 CalculatorWS,在“包”中键入 org.me.calculator,然后单击“完成”。
“项目”窗口将显示新 Web 服务的结构,并且编辑器区域将出现可视设计器。对于 Web 应用程序,您现在会看到以下内容:

设计 Web 服务
本练习旨在向 Web 服务中添加一项操作,该操作用于添加从客户端接收到的两个数字。
向 Web 服务中添加操作
- 在可视设计器中单击“添加操作”。将显示一个对话框,您可以在其中定义新操作。
- 在“添加操作”对话框的上半部分中,在“名称”中键入 add,并在“返回类型”下拉列表中键入 int。在“添加操作”对话框的下半部分中,单击“添加”以创建 int 类型的参数 i。然后,再次单击“添加”以创建 int 类型的参数 j。
现在,您将看到以下内容:

- 在“添加操作”对话框的底部,单击“确定”。
现在,可视设计器将显示以下内容:

- 单击“源”,此时您会注意到前面的步骤生成了如下所示的源代码:

- 在编辑器中,将框架 add 操作扩展为以下代码(所做的更改以粗体显示):
@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 服务部署到 Web 容器时,您可以使用 IDE 测试 Web 服务,以便查看其功能是否符合预期效果。IDE 中集成了 GlassFish 所提供的测试器应用程序,使用它可以实现此目的。Tomcat Web Server 也有一种类似的工具。在 GlassFish 的测试器页上,您可以输入值并对其进行测试,但是 Tomcat Web Server 却不具备此功能。对于后一种情况,您只能看到已部署 Web 服务,而无法测试值。当前还没有用于测试 EJB 模块是否成功部署的工具。
测试是否成功部署到 Web 容器:
- 右键单击项目,然后选择“取消部署后再次部署”。IDE 将启动应用服务器,生成应用程序,然后将应用程序部署到服务器。您可以在“输出”视图中的 "CalculatorWSApplication (run-deploy)" 以及 "GlassFish V2" 或 "Tomcat" 标签中看到这些操作的进度。
- 在 IDE 的“项目”标签中,展开 CalculatorWSApplication 项目的“Web 服务”节点。右键单击 "CalculatorWS" 节点,然后选择“测试 Web 服务”。
IDE 将在浏览器中打开测试器页(如果您已将 Web 应用程序部署到 GlassFish 中)。对于 Tomcat Web Server 和 EJB 模块的部署,情况有所不同:
使用 Web 服务
现在,您已经部署了 Web 服务,接下来需要创建一个客户端,以便使用 Web 服务的 add 方法。在这里,您将创建三个客户端:Java SE 应用程序中的 Java 类、Web 应用程序中的 Servlet 和 Web 应用程序中的 JSP 页。
注意:开发 JAX-WS Web 服务客户端是集中讨论客户端的更高级教程。
客户端 1:Java SE 应用程序中的 Java 类
在本部分中,您将创建一个标准的 Java 应用程序。用于创建应用程序的向导也可以创建 Java 类。之后,您将使用 IDE 的工具来创建一个客户端,并使用在本教程开始时创建的 Web 服务。
如果您将 JDK 6 与 NetBeans IDE 6.5 结合使用,则必须具备 JDK 6 Update 7 或更高版本。
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。选择 Java 类别中的“Java 应用程序”选项。将该项目命名为 CalculatorWS_Client_Application。将“创建主类”保留为选中状态,并接受所有其他缺省设置。单击“完成”。
- 右键单击 "CalculatorWS_Client_Application" 节点,然后选择“新建”>“Web 服务客户端”。
- 在“项目”中,单击“浏览”。浏览至要使用的 Web 服务。选定 Web 服务后,单击“确定”。
- 将其他设置保留为缺省值,然后单击“完成”。
“项目”窗口将显示新的 Web 服务客户端,其中包括已创建的 add 方法的节点:

- 双击 "Main.java" 以在源代码编辑器中将其打开。删除 TODO 注释,然后将以上所述的 add 节点拖至空行中。现在,您将看到以下内容:
public static void main(String[] args) {
try { // Call Web Service Operation
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);
System.out.println("Result = "+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}
}
注意:或者,您也可以在编辑器中单击鼠标右键,然后选择“Web 服务客户端资源”>“调用 Web 服务操作”,而无需拖动 add 节点。
- 初始化两个 int 参数。只需将上面的两个 int 参数的值从 0 更改为其他整数(如 3 和 4)即可。
- 右键单击项目节点,然后选择“运行”。
“输出”窗口将立即显示二者之和:
compile:
run:
Result = 7
BUILD SUCCESSFUL (total time: 1 second)
客户端 2:Web 应用程序中的 Servlet
在本部分中,您将创建一个新的 Web 应用程序,随后创建一个 Servlet。然后,借助该 Servlet 使用在本教程开始时创建的 Web 服务。
如果您使用的是 JDK 6,则必须具备 JDK 6 Update 7 或更高版本。
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。从 "Java Web" 类别中选择“Web 应用程序”。将该项目命名为 CalculatorWSServletClient。单击“完成”。
- 右键单击 "CalculatorWSServletClient" 节点,然后选择“新建”>“Web 服务客户端”。
将显示“新建 Web 服务客户端”向导。
- 在“项目”中,单击“浏览”。浏览至要使用的 Web 服务。选定 Web 服务后,单击“确定”。
- 将其他设置保留为缺省值,然后单击“完成”。
“项目”窗口中的“Web 服务参考”节点将显示新建客户端的结构,其中包括在本教程前面部分创建的 add 操作:
- 右键单击 "CalculatorWSServletClient" 项目节点,然后选择“新建”> "Servlet"。将该 Servlet 命名为 ClientServlet,并将其置于名为 org.me.calculator.client 的包中。单击“完成”。
- 右键单击 "CalculatorWSServletClient" 项目节点,然后选择“属性”。打开“运行”属性,然后取消选中“在保存时部署”。
- 要使 Servlet 成为应用程序的入口点,请右键单击项目节点,选择“属性”,单击“运行”,然后在“相对 URL”中键入 /ClientServlet。单击“确定”。
- 如果 ClientServlet.java 存在错误图标,请右键单击项目节点,然后选择“清理并生成”。
- 在源代码编辑器中,删除注释掉 processRequest 方法主体的行。该行如下所示:
/* TODO output your page here
接下来,删除被注释掉的代码部分结尾的行:
*/
在以下行后添加一些空行:
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
现在,将表示 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.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
}
out.println("</body>");
out.println("</html>");
out.close();
}
将 i 和 j 的值更改为正整数,如 3 和 4。
- 右键单击项目节点,然后选择“运行”。
将启动服务器(如果它尚未运行);同时,系统将生成并部署应用程序,并且打开浏览器以显示计算结果,如下所示:

客户端 3:Web 应用程序中的 JSP 页
在本部分中,您将创建一个新的 Web 应用程序,然后在“Web 应用程序”向导创建的缺省 JSP 页中使用 Web 服务。
如果您使用的是 JDK 6,则必须具备 JDK 6 Update 7 或更高版本。
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。从 "Web" 类别中选择“Web 应用程序”。将该项目命名为 CalculatorWSJSPClient。单击“完成”。
- 右键单击 "CalculatorWSJSPClient" 节点,然后选择“新建”>“Web 服务客户端”。
- 在“项目”中,单击“浏览”。浏览至要使用的 Web 服务。选定 Web 服务后,单击“确定”。
- 将其他设置保留为缺省值,然后单击“完成”。
“项目”窗口将显示新的 Web 服务客户端,如下所示:

- 在“Web 服务参考”节点中,展开表示 Web 服务的节点。此时将显示您要从客户端调用的 add 操作。
- 将 add 操作拖至客户端的 index.jsp 页,并将其放在 H1 标记下。将在 index.jsp 页中立即生成用于调用服务操作的代码,如下所示:
<%
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。
- 右键单击项目节点,然后选择“运行”。
将启动服务器(如果它尚未运行)。同时,系统将生成并部署应用程序,并且打开浏览器以显示计算结果:

另请参见
有关使用 NetBeans IDE 开发 Java EE 应用程序的更多信息,请参见以下资源:
要发送意见和建议、获得支持以及随时了解 NetBeans IDE Java EE 开发功能的最新开发情况,请加入 nbj2ee@netbeans.org 邮件列表。