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 服务。
将 Web 服务命名为 CalculatorWS,在 "Package" 中键入 org.me.calculator,然后单击 "Finish"。
将在 "Projects" 窗口中显示新建的 Web 服务。例如,对于 Web 应用程序,现在 "Projects" 窗口将如下所示:
IDE 将自动创建服务器所需的部署描述符(如果有)。对于 Sun Java System Application Server,则不需要部署描述符。对于部署到 Tomcat Web Server 的 Web 服务,将添加 sun-jaxws.xml 以及 web.xml 中的 WSServlet 项。
小结
在本练习中,您创建了一个 NetBeans 项目并建立了 Web 服务。
对 Web 服务进行编码
本练习的目的是对 IDE 生成的文件和代码执行一些有意义的操作。您将添加一个操作,该操作将从客户端接收到的两个数字相加起来。
将业务逻辑添加到 Web 服务
展开 "Web Services" 节点,然后双击 CalculatorWS 节点。将在源代码编辑器中打开 Web 服务。请注意,代码中已存在了一个操作。它被注释掉了。现在,我们将从头开始创建一个新的操作。创建此操作的另一种方法是删除代码注释掉的行。
在 "Add Operation" 对话框的下半部分,单击 "Add",然后创建一个类型为 int、名为 i 的参数。单击 "OK"。
重新单击 "Add",然后创建一个类型为 int、名为 j 的参数。
单击位于 "Add Operation" 对话框底部的 "OK"。
请注意,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 模块是否已成功部署的工具。
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 页。
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
现在,在您添加的一个空行中单击鼠标右键,选择 "Web Service Client Resources" > "Call Web Service Operation"。将出现 "Select Operation to Invoke" 对话框。
找到 add 操作,然后单击 "OK"。
现在 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);
}