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 服务客户端是集中讨论客户端的更高级教程。
将该 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 模块是否成功部署的工具。
双击 "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)即可。
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();
}
<%
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
}
%>