blob: 80c091b3950a077edd012fd96e368d97636eb9ff [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= JAX-WS Web 服务入门指南
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: JAX-WS Web 服务入门指南 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, JAX-WS Web 服务入门指南
link:http://www.jcp.org/en/jsr/detail?id=224[+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 页。link:./client.html[+开发 JAX-WS Web 服务客户端+]是集中讨论客户端的更高级教程。
image::images/netbeans-stamp-80-74-73.png[title="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0"]
* 在以下客户端中使用 Web 服务
*要学习本教程,您需要具备以下软件和资源。*
|===
|软件或资源 |要求的版本
|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Java EE 下载包
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java 开发工具包 (JDK)+] |JDK 7 或 JDK 8
|符合 Java EE 规范的 Web 服务器或应用服务器 |GlassFish Server Open Source Edition
Oracle WebLogic Server
|===
*注:*GlassFish Server 可以随同 NetBeans IDE Java EE 发行版本一起安装。此外,也可以访问 link:https://glassfish.java.net/download.html[+GlassFish Server 下载页+]或 link:http://tomcat.apache.org/download-60.cgi[+Apache Tomcat 下载页+]。
*重要说明:*Java EE 项目需要使用 GlassFish Server Oracle WebLogic Server 12c
捆绑的 Tomcat Web 服务器不是 Java EE 完全兼容的 Web 服务器。但是,Tomcat 7.x Web 服务器可以配置为支持一些 Java EE 功能。有关如何将对 Java EE 的支持添加到 Tomcat 中的信息,请参见 link:http://openejb.apache.org/[+Apache TomEE 项目+]。
== 创建 Web 服务
本练习旨在创建一个适用于确定要使用的部署容器的项目。具有项目后,您将在其中创建一个 Web 服务。
=== 选择容器
您可以在 Web 容器或 EJB 容器中部署 Web 服务。这取决于您的具体选择。如果要创建 Java EE 应用程序,则在任何情况下都使用 Web 容器,因为您可以将 EJB 直接放入 Web 应用程序中。例如,如果您计划部署到只有一个 Web 容器的 Tomcat Web Server,请创建一个 Web 应用程序,而不是 EJB 模块。
1. 选择 "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,请参见 link:http://wiki.netbeans.org/MavenBestPractices[+Maven 最佳做法+]。
2. 将该项目命名为 ``CalculatorWSApplication`` 。为该项目选择一个位置。单击 "Next"(下一步)。
3. 选择服务器和 Java EE 版本,然后单击 "Finish"(完成)。
要使用 Oracle WebLogic Server,请link:../web/jsf-jpa-weblogic.html#01[+在 IDE 中注册服务器+]。另外,如果使用的是 WebLogic Server,请观看link:../javaee/weblogic-javaee-m1-screencast.html[+将 Web 应用程序部署到 Oracle WebLogic+] 截屏视频。
=== 通过 Java 类创建 Web 服务
1. 右键单击 ``CalculatorWSApplication`` 节点,然后选择 "New"(新建)> "Web Service"Web 服务)。
2. Web 服务命名为 ``CalculatorWS`` ,并在 "Package"(包)中键入 ``org.me.calculator`` 。将 "Create Web Service from Scratch"(从头开始创建 Web 服务)保持选中状态。
3. 如果要在 GlassFish WebLogic 上创建 Java EE 项目,请选择 "Implement Web Service as a Stateless Session Bean"(将 Web 服务作为无状态会话 Bean 实现)。
image::images/generate-ws-ee6.png[]
4. 单击 "Finish"(完成)。"Projects"(项目)窗口将显示新 Web 服务的结构,并在编辑器区域中显示源代码。
== Web 服务中添加操作
本练习旨在向 Web 服务中添加一项操作,该操作用于添加从客户端接收到的两个数字。NetBeans IDE 提供了一个对话框,用于将操作添加到 Web 服务中。您可以在 Web 服务可视设计器或 Web 服务上下文菜单中打开该对话框。
*警告:*无法在 Maven 项目中使用该可视设计器。
*将操作添加到 Web 服务中:*
1. 可以:
* 切换到编辑器的 "Design"(设计)视图。
image::images/design-view.png[]
或:
* "Projects"(项目)窗口中查找 Web 服务的节点。右键单击该节点。此时将打开一个上下文菜单。
image::images/add-op-cx-menu-item.png[]
2. 在可视设计器或上下文菜单中,单击 "Add Operation"(添加操作)。"Add Operation"(添加操作)对话框打开。
3. "Add Operation"(添加操作)对话框的上半部分中,在 "Name"(名称)中键入 ``add`` ,并在 "Return Type"(返回类型)下拉列表中键入 ``int``
4. "Add Operation"(添加操作)对话框的下半部分中,单击 "Add"(添加)以创建 ``int`` 类型的参数 ``i``
5. 然后,再次单击 "Add"(添加)以创建 ``int`` 类型的参数 ``j``
现在,您将看到以下内容:
image::images/jaxws-60-add-operation.png[]
6. "Add Operation"(添加操作)对话框的底部,单击 "OK"(确定)。您将返回到编辑器中。
7. 删除默认的 ``hello`` 操作,方法是在源代码中删除 ``hello()`` 方法或在可视设计器中选择 ``hello`` 操作并单击 "Remove Operation"(删除操作)。
现在,可视设计器将显示以下内容:
image::images/design-view-with-op.png[title="显示已添加操作的 Web 服务可视设计器"]
8. 单击 "Source"(源),然后查看在以上步骤中生成的代码。该代码会因您是否将服务创建为 Java EE 无状态 Bean 而有所不同。您能看到以下屏幕快照中的差别吗?(未作为无状态 Bean 实现的 Java EE 6 Java EE 7 服务类似于 Java EE 5 服务。)
image::images/jaxws-60-source.png[] image::images/stateless-ejb-code1.png[]
*注:*在 NetBeans IDE 7.3 7.4 中,您可以注意到生成的 ``@WebService`` 表示服务名显式指定:
``@WebService(serviceName = "CalculatorWS")``
9. 在编辑器中,将框架 ``add`` 操作扩展为以下代码(所做的更改以粗体显示):
[source,java]
----
@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 Server 提供了测试客户端。
如果您使用的是 Tomcat Web 服务器,则没有测试客户端。您只能运行项目并查看 Tomcat Web 服务页是否打开。此时,在运行项目之前,您需要将 Web 服务作为您的应用程序的入口点。要使 Web 服务成为应用程序的入口点,请右键单击 "CalculatorWSApplication" 项目节点,然后选择 "Properties"(属性)。打开 "Run"(运行)属性,然后在 "Relative URL"(相对 URL)字段中键入 ``/CalculatorWS`` 。单击 "OK"(确定)。要运行项目,请再次右键单击项目节点,然后选择 "Run"(运行)。
*测试是否成功部署到 GlassFish WebLogic Server:*
1. 右键单击该项目,然后选择 "Deploy"(部署)。IDE 将启动应用服务器,构建应用程序,然后将应用程序部署到服务器。可以在 "Output"(输出)视图中的 "CalculatorWSApplication (run-deploy)" 以及 "GlassFish" 服务器或 "Tomcat" 标签中看到这些操作的进度。
2. IDE "Projects"(项目)标签中,展开 CalculatorWSApplication 项目的 "Web Services"Web 服务)节点。右键单击 "CalculatorWS" 节点,然后选择 "Test Web Service"(测试 Web 服务)。
image::images/jax-ws-testws.png[]
IDE 在浏览器中打开测试器页(如果您已将 Web 应用程序部署到 GlassFish Server 中)。对于 Tomcat Web Server EJB 模块的部署,情况有所不同:
* 如果已部署到 GlassFish Server,请在测试器页中键入两个数字,如下所示:
image::images/jax-ws-tester.png[]
将显示这两个数字之和:
image::images/jax-ws-tester2.png[]
== [[样例]]
您可以选择 "File"(文件)> "New Project"(新建项目)(在 Linux Windows 上为 Ctrl-Shift-N 组合键,在 MacOS 上为 ⌘-Shift-N 组合键),然后导航至 "Samples"(样例)> "Web Services"Web 服务)> "Calculator (EE6)"(计算器 (EE6)),以打开计算器服务的完整 Java EE 无状态 Bean 版本。
将在 "Samples"(样例)> "Maven" 中提供 Maven 计算器服务和 Maven 计算器客户端。
== 使用 Web 服务
现在,您已经部署了 Web 服务,接下来需要创建一个客户端,以便使用 Web 服务的 ``add`` 方法。在这里,您将创建三个客户端:Java SE 应用程序中的 Java 类、Web 应用程序中的 Servlet Web 应用程序中的 JSP 页。
*注:*link:../../../kb/docs/websvc/client.html[+开发 JAX-WS Web 服务客户端+]是集中讨论客户端的更高级教程。
=== 客户端 1Java SE 应用程序中的 Java
在此部分,您将创建一个标准的 Java 应用程序。用于创建应用程序的向导也可以创建 Java 类。之后,您将使用 IDE 的工具来创建一个客户端,并使用在本教程开始时创建的 Web 服务。
1. 选择 "File"(文件)> "New Project"(新建项目)(在 Linux Windows 上为 Ctrl-Shift-N 组合键,在 MacOS 上为 ⌘-Shift-N 组合键)。选择 "Java" 类别中的 "Java Application"Java 应用程序)选项。将该项目命名为 ``CalculatorWS_Client_Application`` 。将 "Create Main Class"(创建主类)保留为选中状态,并接受所有其他默认设置。单击 "Finish"(完成)。
2. 右键单击 ``CalculatorWS_Client_Application`` 节点,然后选择 "New"(新建)> "Web Service Client"Web 服务客户端)。此时将打开新建 Web 服务客户端向导。
3. 选择 "Project"(项目)作为 WSDL 源。单击 "Browse"(浏览)。浏览至 CalculatorWSApplication 项目中的 CalculatorWS Web 服务。选定 Web 服务后,单击 "OK"(确定)。
image::images/browse-ws.png[]
4. 请勿选择包名。将此字段保留为空。
image::images/javaclient-pkg.png[]
5. 将其他设置保留为默认值,然后单击 "Finish"(完成)。
"Projects"(项目)窗口将显示新的 Web 服务客户端,其中包括已创建的 ``add`` 方法的节点:
image::images/ws-ref-in-client-project.png[]
6. 双击以在源代码编辑器中打开主类。将 ``add`` 节点拖至 ``main()`` 方法下面。
image::images/dnd-add.png[]
现在,您将看到以下内容:
[source,java]
----
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`` 节点。
7. ``main()`` 方法主体中,将 TODO 注释替换为执行以下操作的代码:初始化 ``i`` ``j`` 的值,调用 ``add()`` ,然后输出结果。
[source,java]
----
public static void main(String[] args) {int i = 3;int j = 4;int result = add(i, j);System.out.println("Result = " + result);
}
----
8. ``main()`` 方法代码包含在输出异常错误的 try/catch 块中。
[source,java]
----
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);}
}
----
9. 右键单击项目节点,然后选择 "Run"(运行)。
"Output"(输出)窗口将立即显示二者之和:
[source,java]
----
compile:
run:
Result = 7
BUILD SUCCESSFUL (total time: 1 second)
----
=== 客户端 2Web 应用程序中的 Servlet
在此部分,您将创建一个新的 Web 应用程序,随后创建一个 Servlet。然后,借助该 Servlet 使用在本教程开始时创建的 Web 服务。
1. 选择 "File"(文件)> "New Project"(新建项目)(在 Linux Windows 上为 Ctrl-Shift-N 组合键,在 MacOS 上为 ⌘-Shift-N 组合键)。从 "Java Web" 类别中选择 "Web Application"Web 应用程序)。将该项目命名为 ``CalculatorWSServletClient`` 。单击 "Next"(下一步),然后单击 "Finish"(完成)。
2. 右键单击 ``CalculatorWSServletClient`` 节点,然后选择 "New"(新建)> "Web Service Client"Web 服务客户端)。
此时将打开新建 Web 服务客户端向导。
3. 选择 "Project"(项目)作为 WSDL 源,然后单击 "Browse"(浏览)以打开 "Browse Web Services"(浏览 Web 服务)对话框。
4. "CalculatorWSApplication" 项目中选择 "CalculatorWS" Web 服务。单击 "OK"(确定)关闭 "Browse Web Services"(浏览 Web 服务)对话框。
image::images/browse-ws.png[]
5. 在新建 Web 服务客户端向导中确认包名为空,并保留其他设置的默认值。单击 "Finish"(完成)。
"Projects"(项目)窗口中的 "Web Service References"Web 服务引用)节点将显示新建客户端的结构,其中包括在本教程前面部分创建的 ``add`` 操作。
6. 右键单击 ``CalculatorWSServletClient`` 项目节点,然后选择 "New"(新建)> "Servlet"。将该 Servlet 命名为 ``ClientServlet`` ,并将其置于名为 ``org.me.calculator.client`` 的包中。单击 "Finish"(完成)。
7. 要使 servlet 成为应用程序的入口点,请右键单击 "CalculatorWSServletClient" 项目节点,然后选择 "Properties"(属性)。打开 "Run"(运行)属性,然后在 "Relative URL"(相对 URL)字段中键入 ``/ClientServlet`` 。单击 "OK"(确定)。
8. 如果 ``ClientServlet.java`` 存在错误图标,请右键单击项目节点,然后选择 "Clean and Build"(清理并构建)。
9. ``processRequest()`` 方法中,在此行后添加一些空行:
[source,xml]
----
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
----
10. 在源代码编辑器中,将 ``add`` 操作拖至 ``ClientServlet`` 类主体中的任意位置。将在类代码的末尾显示 ``add()`` 方法。
*注:*或者,您也可以在编辑器中单击鼠标右键,然后选择 "Insert Code"(插入代码)> "Call Web Service Operation"(调用 Web 服务操作),而无需拖动 ``add`` 节点。
[source,java]
----
private int add(int i, int j) {org.me.calculator.CalculatorWS port = service.getCalculatorWSPort();return port.add(i, j);
}
----
11. 添加执行以下操作的代码:初始化 ``i`` ``j`` 值,调用 ``add()`` ,然后输出结果。添加的代码以*粗体显示*:
[source,xml]
----
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
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>");
* int i = 3;
int j = 4;
int result = add(i, j);
out.println("Result = " + result);*
out.println("</body>");
out.println("</html>");
} finally { out.close();}}
----
12. 将添加的代码包含在输出异常错误的 try/catch 块中。
[source,xml]
----
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
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 {*
int i = 3;int j = 4;int result = add(i, j);out.println("Result = " + result);
*} catch (Exception ex) {
out.println("Exception: " + ex);
}*
out.println("</body>");
out.println("</html>");
} finally { out.close();}}
----
13. 右键单击项目节点,然后选择 "Run"(运行)。
将启动服务器;同时,系统将构建并部署应用程序,并且打开浏览器以显示计算结果,如下所示:
image::images/jaxws-60-webclient.png[]
=== 客户端 3Web 应用程序中的 JSP
在此部分中,您将创建一个新的 Web 应用程序,然后在 Web 应用程序向导创建的默认 JSP 页中使用 Web 服务。
*注:*如果要在 Oracle WebLogic 上运行 JSP Web 应用程序客户端,请参见link:../web/jsf-jpa-weblogic.html[+在 WebLogic 上运行 Java Server Faces 2.0 应用程序+]。
1. 选择 "File"(文件)> "New Project"(新建项目)(在 Linux Windows 上为 Ctrl-Shift-N 组合键,在 MacOS 上为 ⌘-Shift-N 组合键)。从 "Java Web" 类别中选择 "Web Application"Web 应用程序)。将该项目命名为 ``CalculatorWSJSPClient`` 。单击 "Next"(下一步),然后单击 "Finish"(完成)。
2. 在项目节点下展开 "Web Pages"Web 页)节点并删除 ``index.html``
3. 右键单击 ``Web Pages`` Web 页)节点,然后在弹出式菜单中选择 "New"(新建)> "JSP"
如果 JSP 在弹出式菜单中不可用,请选择 "New"(新建)> "Other"(其他),然后在新建文件向导的 "Web" 类别中选择 "JSP"
4. 在新建文件向导中,键入 *index* 作为 JSP 文件的名称。单击 "Finish"(完成)。
5. 右键单击 ``CalculatorWSJSPClient`` 节点,然后选择 "New"(新建)> "Web Service Client"Web 服务客户端)。
6. 选择 "Project"(项目)作为 WSDL 源。单击 "Browse"(浏览)。浏览至 CalculatorWSApplication 项目中的 CalculatorWS Web 服务。选定 Web 服务后,单击 "OK"(确定)。
image::images/browse-ws.png[]
7. 请勿选择包名。将此字段保留为空。
8. 将其他设置保留为默认值,然后单击 "Finish"(完成)。
"Projects"(项目)窗口将显示新的 Web 服务客户端,如下所示:
image::images/ws-ref-in-jsp-client.png[]
9. "Web Service References"Web 服务引用)节点中,展开表示 Web 服务的节点。此时将显示您要从客户端调用的 ``add`` 操作。
10. ``add`` 操作拖至客户端的 ``index.jsp`` 页,并将其放在 H1 标记下。在 ``index.jsp`` 页中立即生成用于调用服务操作的代码,如下所示:
[source,java]
----
<%
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);``
11. 右键单击项目节点,然后选择 "Run"(运行)。
将启动服务器(如果它尚未运行)。同时,系统将构建并部署应用程序,并且打开浏览器以显示计算结果:
image::images/jax-ws-project-jsp-result.png[]
link:/about/contact_form.html?to=3&subject=Feedback:%20JAX-WS%20Services%20in%20NetBeans%20IDE[+发送有关此教程的反馈意见+]
== 另请参见
有关使用 NetBeans IDE 开发 Java EE 应用程序的更多信息,请参见以下资源:
* link:./client.html[+开发 JAX-WS Web 服务客户端+]
* link:./rest.html[+REST 风格的 Web 服务入门指南+]
* link:./wsit.html[+Advanced Web Service Interoperability+](高级 Web 服务互操作性)
* link:../../../kb/trails/web.html[+Web 服务学习资源+]
要发送意见和建议、获得支持以及随时了解 NetBeans IDE Java EE 开发功能的最新开发情况,请link:../../../community/lists/top.html[+加入 nbj2ee@netbeans.org 邮件列表+]。