科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用 IDE 开发 JAX-WS Web服务

使用 IDE 开发 JAX-WS Web服务

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍了使用IDE开发JAX-WS Web服务以及在不同客户端中使用该服务……

来源:IT专家网 2008年4月16日

关键字: Web服务 开发 IDE java

  • 评论
  • 分享微博
  • 分享邮件
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服务。

  在开始之前,您需要在计算机中安装以下软件:

  •   NetBeans IDE 5.5
  •   Java Standard Development Kit (JDK) 版本 5.0 或版本 6.0
  •   Sun Java System Application Server 9.0

  安装并配置教程环境

  如果尚未注册 Sun Java System Application Server 9.0 的实例,则必须先进行注册,然后才可以着手开发 Java EE 5 应用程序:

  •   从主窗口中,选择“工具”>“服务器管理器”。
  •   单击“添加服务器”。选择 "Sun Java System Application Server",并为此实例指定一个名称,然后,单击“下一步”。
  •   指定服务器信息、应用服务器本地实例的位置以及要将 Web服务部署到的域。
  •   单击“完成”。

  注意:也可以部署到 Tomcat Web Server,但由于它仅具有一个 Web 容器,因此应在下一部分创建 Web 应用程序,而不是 EJB 模块。与 JSR-109 Web服务不同的是,JAX-WS Web服务可以成功地部署到 Tomcat Web 容器中。

  创建 Web服务

  本练习的目的是创建一个适用于您决定使用的部署容器的项目。在建立项目后,您将在其中创建 Web服务。

  选择容器

  您可以在 Web 容器或 EJB 容器中部署 Web 服务。这要取决于具体的选择。例如,如果您计划部署到仅具有 Web 容器的 Tomcat Web Server 上,则应该选择创建 Web 应用程序,而不是 EJB 模块。

  •   选择“文件”>“新建项目”(Ctrl-Shift-N)。从 "Web" 类别中,选择“Web 应用程序”,或者从“企业”类别中,选择“EJB 模块”。
  •   将项目命名为 CalculatorWSApplication。
  •   根据要使用的部署服务器,请执行以下操作:
    •   对于 Sun Java System Application Server,将 J2EE 版本设置为 "Java EE 5"。
    •   对于 Tomcat Web Server,请取消选中“将源代码级别设置为 1.4”复选框。
  •   单击“完成”。

通过 Java 类创建 Web服务

  •   右键单击 CalculatorWSApplication 节点,然后选择“新建”>“Web服务”。
  •   将 Web服务命名为 CalculatorWS,在“包”中键入 org.me.calculator,然后单击“完成”。
      将在“项目”窗口中显示新建的 Web服务。例如,对于 Web 应用程序,现在“项目”窗口将如下所示:

  IDE 将自动创建服务器所需的部署描述符(如果有)。对于 Sun Java System Application Server,则不需要部署描述符。对于部署到 Tomcat Web Server 的 Web 服务,将添加 sun-jaxws.xml 以及 web.xml 中的 WSServlet 项。

  对 Web服务进行编码

  本节的目的是对 IDE 生成的文件和代码执行一些有意义的操作。您将添加一个操作,该操作将从客户端接收到的两个数字相加起来。

  将业务逻辑添加到 Web 服务

  •   展开“Web 服务”节点,然后双击 "CalculatorWS" 节点。将在源代码编辑器中打开 Web 服务。请注意,代码中已存在了一个操作。它被注释掉了。现在,我们将从头开始创建一个新的操作。创建此操作的另一种方法是删除代码注释掉的行。
  •   在类主体(位于注释掉的代码之上或之下)中单击鼠标右键,然后选择“Web 服务”>“添加操作”。
  •   在“添加操作”对话框的上半部分,在“名称”中键入 add,并从“返回类型”下拉列表中选择 int。
  •   在“添加操作”对话框的下半部分,单击“添加”,然后创建一个类型为 int、名为 i 的参数。单击“确定”。
  •   重新单击“添加”,然后创建一个类型为 int、名为 j 的参数。
  •   单击位于“添加操作”对话框底部的“确定”。请注意,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 容器时,IDE 允许您测试 Web服务以查看它是否能够按预期的那样工作。鉴于此目的,我们在 IDE 中集成了 Sun Java System Application Server 提供的 Tester 应用程序。对于 Tomcat Web Server,也存在类似的工具。但是,Sun Java System Application Server 的 Tester 页允许您输入值并对其进行测试,而 Tomcat Web Server 则不允许这样做。在后一种情况下,您只能看到已部署了 Web 服务,但是不能对值进行测试。目前还没有用于测试 EJB 模块是否已成功部署的工具。

  测试是否已成功部署到 Web 容器:

  •   右键单击项目节点,选择“属性”,然后单击“运行”。根据要使用的部署服务器,请执行以下操作:
    •   对于 Sun Java System Application Server,在“相对 URL”字段中键入 /CalculatorWSService?Tester。
    •   对于 Tomcat Web Server,在“相对 URL”字段中键入 /CalculatorWS?Tester。
        注意:由于部署的 EJB 模块的结果不会显示在浏览器中,因此,如果您使用的是 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

尾递归转换能加快应用程序的速度,但不是所有的 JVM 都会做这种转换,很多算法用尾递归方法表示会显得格外简明。编译器会自动把这种方法转换成循环,以提高程序的性能。但在 Java 语言规范中,并没有要求一定要作这种转换,因此,并不是所有的 Java 虚拟机(JVM)都会做这种转换。这就意味着在 Java 语言中采用尾递归表示可能导致巨大的内存占用,而这并不是我们期望的结果。Eric Allen 在本文中阐述了动态编译将会保持语言的语义,而静态编译则通常不会。他说明了为什么这是一个重要问题,并提供了一段代码来帮助判断您的即时(JIT)编译器是否会在保持语言语义的同时做尾递归代码转换。

  尾递归及其转换

  相当多的程序包含有循环,这些循环运行的时间占了程序总运行时间的很大一部分。这些循环经常要反复更新不止一个变量,而每个变量的更新又经常依赖于其它变量的值。

  如果把迭代看成是尾递归函数,那么,就可以把这些变量看成是函数的参数。简单提醒一下:如果一个调用的返回值被作为调用函数的值立即返回,那么,这个递归调用就是尾递归;尾递归不必记住调用时调用函数的上下文。

   由于这一特点,在尾递归函数和循环之间有一个很好的对应关系:可以简单地把每个递归调用看作是一个循环的多次迭代。但因为所有可变的参数值都一次传给了递归调用,所以比起循环来,在尾递归中可以更容易地得到更新值。而且,难以使用的 break 语句也常常为函数的简单返回所替代。

   但在 Java 编程中,用这种方式表示迭代将导致效率低下,因为大量的递归调用有导致堆栈溢出的危险。

   解决方案比较简单:因为尾递归函数实际上只是编写循环的一种更简单的方式,所以就让编译器把它们自动转换成循环形式。这样您就同时利用了这两种形式的优点。

   但是,尽管大家都熟知如何把一个尾递归函数自动转换成一个简单循环,Java 规范却不要求做这种转换。不作这种要求的原因大概是:通常在面向对象的语言中,这种转换不能静态地进行。相反地,这种从尾递归函数到简单循环的转换必须由 JIT 编译器动态地进行。

   要理解为什么会是这样,考虑下面一个失败的尝试:在 Integers 集上,把 Iterator 中的元素相乘。

   因为下面的程序中有一个错误,所以在运行时会抛出一个异常。但是,就象在本专栏以前的许多文章中已经论证的那样,一个程序抛出的精确异常(跟很棒的错误类型标识符一样)对于找到错误藏在程序的什么地方并没有什么帮助,我们也不想编译器以这种方式改变程序,以使编译的结果代码抛出一个不同的异常。

   清单 1. 一个把 Integer 集的 Iterator 中的元素相乘的失败尝试

  import java.util.Iterator;
  public class Example {
  public int product(Iterator i) {
  return productHelp(i, 0);
  }
  int productHelp(Iterator i, int accumulator) {
  if (i.hasNext()) {
  return productHelp(i, accumulator * ((Integer)i.next()).intValue());
  }
  else {
  return accumulator;
  }
  }
  }

   注意 product 方法中的错误。product 方法通过把 accumulator 赋值为 0 调用 productHelp。它的值应为 1。否则,在类 Example 的任何实例上调用 product 都将产生 0 值,不管 Iterator 是什么值。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章