打印

异步JAX-WSWeb服务客户端方案

异步JAX-WSWeb服务客户端方案

作者: ,  出处:NetBeans, 责任编辑: 叶江, 
2007-03-27 13:18
  本文通过IDE开发采用异步方式使用实时Web服务的JAX-WS Web服务客户端……

  本文向您介绍了通过 IDE 开发采用异步方式使用实时 Web 服务的 JAX-WS Web 服务客户端的相关基础知识。这种实时 Web 服务是指 eSynaps Web 服务搜索服务。它将返回指向 Web 服务的 URL,其中,该服务包含了给定的搜索字符串。例如,如果您将字符串 "weather" 发送到 Web 服务,则会返回有关提供天气信息的 Web 服务 URL 的列表。在本文中,我们将使用 Java SE 应用程序中的一个简单 Java 类作为客户端。

  异步 Web 服务客户端通过“轮询”或“回调”方法来使用 Web 服务。在“轮询”方法中,您将调用一个 Web 服务方法并反复请求结果。轮询是一种阻止操作,因为它会阻止调用线程,所以这就是不在 GUI 应用程序中使用它的原因。在“回调”方法中,您在 Web 服务方法调用期间传递回调处理程序。当结果有效时,将调用该处理程序的 handleResponse() 方法。这种方法适用于 GUI 应用程序,因为您不必等待响应。例如,从 GUI 事件处理程序发出调用并立即返回控制权,这样用户界面就可以随时保持响应了。轮询方法的缺点是,即使是在捕获后使用响应,也必须对其进行轮询来查明已将其捕获。因此,我们将使用回调方法,在响应返回之前,这种方法始终保持正常状态。处理程序随后会接收响应,并对其进行处理。在我们的方案中,将使用这种方法来处理 Web 服务找到的 URL。首先,我们将解析这些 URL 以删除 XML 标记,然后在 JTextArea 中显示它们。

  当我们建立了一个工作应用程序后,需要将其迁移到 NetBeans 平台中,这样我们就可以继承 NetBeans 平台的模块化体系结构并且可以在 IDE 中开发功能丰富的客户端应用程序的 GUI 功能。

  安装和配置工作环境

  安装 NetBeans 5.5 并运行 IDE。由于本方案是在 Java SE 项目中使用 Web 服务客户端,因此您无需安装 Sun Java System Application Server 9.0。

  创建 Java SE 应用程序和 Web 服务客户端

  •   要创建 Web 服务客户端,首先需要 Java SE 应用程序、EJB 模块或 Web 模块。在此,我们将使用 Java SE 应用程序。
  •   选择“文件”>“新建项目”(Ctrl-Shift-N)。从“常规”类别中,选择“Java 应用程序”。单击“下一步”。
  •   将项目命名为 AsyncWSClient。取消选中“创建主类”复选框。单击“完成”。
  •   在“项目”窗口中,右键单击 "AsyncWSClient" 项目节点,然后选择“新建”>“文件/文件夹”(Ctrl-N)。在“新建文件”向导中,从“类别”列表中选择“Web 服务”,然后从“文件类型”列表中选择“Web 服务客户端”。单击“下一步”。
  •   选择 "WSDL URL",然后键入或粘贴以下 WSDL URL:
      http://www.esynaps.com/WebServices/SearchWS.asmx?WSDL
  •   在“包”中键入 org.me.wsc。单击“完成”。
      将在“项目”窗口的“Web 服务引用”节点下显示新的 Web 服务客户端:

  •   右键单击 "SearchWS",然后选择“编辑 Web 服务属性”。将显示编辑 Web 服务属性编辑器。
  •   在该编辑器中,展开 "Search"。选中“启用异步客户端”复选框,如下所示:


共11页。 1 2 3 4 5 6 :

TOP

作者: ,  出处:NetBeans, 责任编辑: 叶江, 
2007-03-27 13:18
  本文通过IDE开发采用异步方式使用实时Web服务的JAX-WS Web服务客户端……

  •   单击“确定”。
      现在,将显示以下对话框:

  •   单击“确定”。
      观察“输出”窗口,您会注意到 IDE 正在调用 Ant 目标来生成所需的 JAX-WS 客户端工件。

  与 Web 服务之间的异步交互

  现在,我们已通过 IDE 生成了使用 SearchWS Web 服务的 Web 服务客户端,现在将执行后续操作。严格地来讲,SearchWS Web 服务只有一个操作,即 Search,它依据我们为其提供的搜索词作为请求参数,在 Web 上搜索 URL。然而,执行此操作需要花费一些时间。因此,如果以标准同步的方式使用该结果,并静静地等待响应,我们的工作流将会中断。因此,我们需要采用异步的方式使用该结果,这就是本教程的目的所在。

  现在,我们已完成了第一步,即启用了 Web 服务客户端以允许异步操作调用。如果展开 "SearchWS" 节点,您现在会看到三个操作(如下所示):

  正如简介中所述,我们将使用上面屏幕快照中显示的 Search [异步回调] 操作。有关这两种异步方法之间差异的更多详细信息,请参见 https://jax-ws.dev.java.net/jax-ws-20-fcs/docs/asynch.html

  设计用户界面

  要允许用户指定搜索字符串、并将其发送到 Web 服务然后查看结果,我们需要创建一个用户界面。NetBeans GUI 生成器(也称为 Matisse)可以轻松地创建此应用程序部分。

  •   右键单击 "AsyncWSClient" 项目节点,然后选择“新建”>“文件/文件夹”(Ctrl-N)。在“Java GUI 窗体”类别中选择“JFrame 窗体”,然后单击“下一步”。将窗体命名为 MainForm,然后在“包”中键入 org.me.forms。单击“完成”。
  •   从组件面板 (Ctrl-Shift-8) 中添加以下控件,并按照下表列出的内容更改其属性:
组件 属性
JLabel text Enter seach text:
JTextField text
变量名称 tfWord
JButton text Search
变量名称 btSearch
JProgressBar stringPainted 启用
变量名称 pgProgress
JLabel text URLs found:
JTextArea background [204,204,204]
editable 不启用
lineWrap 启用
变量名称 taResults
共11页。 9 1 2 3 4 5 6 7 :

TOP

作者: ,  出处:NetBeans, 责任编辑: 叶江, 
2007-03-27 13:18
  本文通过IDE开发采用异步方式使用实时Web服务的JAX-WS Web服务客户端……

  注意:您可以使用“属性”窗口 (Ctrl-Shift-7) 来更改上面的属性。可以在“属性”窗口的“属性”标签中更改上面的所有属性,但变量名称除外,它们是在“代码”标签中设置的。还可以使用更简单的方法来修改变量名称,即右键单击组件,然后使用“更改变量名称”菜单项。

  另请注意,即使将 JTextArea 直接放在窗体上,GUI 生成器也会将 JTextArea 放在 JScrollPane 中。

  •   对组件重新排序并调整其大小,直至用户界面如下所示:

  添加业务逻辑

  正如本教程的简介所述,我们将使用 Java EE 5 中 JAX-WS 提供的异步回调方法与 Web 服务进行交互。在此方案中,将使用异步方法来处理 Web 服务找到的 URL。首先,我们将解析这些 URL 以删除 XML 标记,然后在 JTextArea 中显示它们。

  •   要添加用于解析返回的 URL 的代码,请单击源代码编辑器左上角的“源”按钮,然后向下滚动至文件的结尾处。在结束类的最后一个花括号的正上方,添加以下方法:

  private String removeTags(String str){
  String text = str;
  text = text.replaceAll("","");
  text = text.replaceAll("","/\n");
  text = text.replaceAll("","");
  return text;
  }

  通常,您会使用 XML 解析器来解析结果,但就本教程而言,使用 String.replace() 就足够了。

  •   其次,添加异步客户端代码。在上一步添加的方法下面,添加以下内容:

  public void callAsyncCallback(String word){
  }

  •   在“项目”窗口中,展开“Web 服务引用”> "SearchWS" > "WebSearchWS" > "WebSearchWSSoap"(如下所示):


共11页。 9 1 2 3 4 5 6 7 8 :

TOP

作者: ,  出处:NetBeans, 责任编辑: 叶江, 
2007-03-27 13:18
  本文通过IDE开发采用异步方式使用实时Web服务的JAX-WS Web服务客户端……

  •   在“项目”窗口中,将 "Search [异步回调]" 节点拖放到上面步骤 2 中创建的 callAsyncCallback 方法中。
      放置该节点后(您无需进行任何额外的编码),就会看到以下内容:

  public void callAsyncCallback(String word) {
  try { // Call Web Service Operation(async. callback)
  org.me.wsc.WebSearchWS service = new org.me.wsc.WebSearchWS();
  org.me.wsc.WebSearchWSSoap port = service.getWebSearchWSSoap();
  // TODO initialize WS operation arguments here
  java.lang.String keyWord = "";
  javax.xml.ws.AsyncHandler asyncHandler = new javax.xml.ws.AsyncHandler() {
  public void handleResponse(javax.xml.ws.Response response) {
  try {
  // TODO process asynchronous response here
  System.out.println("Result = "+ response.get());
  } catch(Exception ex) {
  // TODO handle exception
  }
  }
  };
  java.util.concurrent.Future result = port.searchAsync(keyWord, asyncHandler);
  while(!result.isDone()) {
  // do something
  Thread.sleep(100);
  }
  } catch (Exception ex) {
  // TODO handle custom exceptions here
  }
  }

  注意:还可以使用另一种方法,让 IDE 生成上述代码片段。在源代码编辑器的 callAsyncCallback 方法内单击鼠标右键,然后选择“Web 服务客户端资源”>“调用 Web 服务操作”。在出现的对话框中,选择 "Search [异步回调]" 操作,然后单击“确定”。

  •   现在,需要修改生成的代码片段以将 JTextField 中输入的词语传递给 Web 服务,并将结果放在 JTextArea 中。同时,还要确保将 Swing 调用安排在事件分发线程 (Event Dispatching Thread, AWT) 内部执行。在本方案中,不需要使用生成的 try/catch 块。最简便的更改方法是复制/粘贴下面的代码:

  public void callAsyncCallback(String word){
  org.me.wsc.WebSearchWS service = new org.me.wsc.WebSearchWS();
  org.me.wsc.WebSearchWSSoap port = service.getWebSearchWSSoap();
  javax.xml.ws.AsyncHandler asyncHandler = new javax.xml.ws.AsyncHandler() {
  public void handleResponse(final javax.xml.ws.Response response) {
  SwingUtilities.invokeLater(new Runnable() {
  public void run() {
  String results = "";
  try {
  results = response.get().getSearchResult();
  results = removeTags(results);
  taResults.setText(results);
  } catch(Exception ex) {
  ex.printStackTrace();
  }
  pgProgress.setIndeterminate(false);
  pgProgress.setString("");
  btSearch.setEnabled(true);
  }
  });
  }
  };
  port.searchAsync(word, asyncHandler);
  }

  •   最后,为了引用 javax.swing.Utilities 类,我们需要使用 import 语句。可通过在源代码编辑器中单击鼠标右键并选择“修复导入”(Alft-Shift-F),让 IDE 生成此 import 语句。
    共11页。 9 1 2 3 4 5 6 7 8 9 :

TOP

作者: ,  出处:NetBeans, 责任编辑: 叶江, 
2007-03-27 13:18
  本文通过IDE开发采用异步方式使用实时Web服务的JAX-WS Web服务客户端……

  将用户界面连接到业务逻辑上

  接下来,我们将上一部分提供的逻辑连接到用户界面上。当用户单击 JButton 时,将建立与 Web 服务的连接。在单击该按钮时,将激活进度栏并调用回调方法。

  •   在“设计”视图中,右键单击 JButton,然后选择“事件”> "Action" > "ActionPerformed"(如下所示):

  编辑器将切换到“源”视图中,并定位到 btSearchActionPerformed 方法中。

  •   插入下面突出显示的代码:

  private void btSearchActionPerformed(java.awt.event.ActionEvent evt) {
  String word = tfWord.getText();
  pgProgress.setIndeterminate(true);
  pgProgress.setString("waiting for server");
  btSearch.setEnabled(false);
  callAsyncCallback(word);
  }

  我们先将进度栏设置为不确定模式以让其连续运行,再将其文本设置为 "waiting for server"。然后,调用异步回调方法,并将从 JTextField 中检索的词语传递给该方法。

  运行应用程序

  现在,我们已创建了简单的 Swing 应用程序,可以试用一下。

  •   右键单击该项目,然后选择“运行项目”。系统会提示您将 "org.me.forms.MainForm" 设置为主类。单击“确定”。
      将生成并运行该应用程序。
  •   在 JTextField 中写入一个词语(如 "weather"),然后单击 "Search"。将激活进度栏,如下所示:


共11页。 9 1 2 3 4 5 6 7 8 9 10 :

TOP

作者: ,  出处:NetBeans, 责任编辑: 叶江, 
2007-03-27 13:18
  本文通过IDE开发采用异步方式使用实时Web服务的JAX-WS Web服务客户端……

  几秒钟后,进度栏将停止并在 JTextArea 中显示结果,如下所示:

  如果在进度栏停止后 JTextArea 仍为空,请再次单击 "Search" 以重新执行搜索。存储本方案使用的 Web 服务的 Internet 服务器有时会被来自客户端的请求阻塞。

  注意:如果您处于防火墙的保护下,应用程序会自动知道要使用的正确代理服务器和代理端口。在您创建 Web 服务客户端后,系统设置就已写入到 project.properties 文件的 run.jvmargs 属性中了。如果在“项目”窗口中右键单击项目,然后选择“属性”并单击“运行”类别,您还可以在“VM 选项”字段中看到生成的值。如果需要,您可以对其进行更改。

  扩展和分发应用程序

  现在,我们创建了一个完全能够正常使用的应用程序,该考虑如何快速且有效地对其扩展了。例如,我们可能希望在应用程序中添加 Google 工具栏。完成此操作的一种简便方法是,将应用程序移到 NetBeans 平台上。当它位于 NetBeans 平台上,该应用程序可以具有其自己的更新中心向导(与 IDE 的“工具”菜单下面的更新中心向导相同),我们可以利用该向导来添加外部模块,如 Google 工具栏模块。

  我们还需要考虑应用程序的分发策略。在生成 Java 项目时,IDE 将在应用程序的 dist 文件夹中创建一个 JAR 文件。除 JAR 文件外,我们可能还希望提供一个可执行文件。另外,还可以使用 Java Web Start 技术,通过浏览器来启动应用程序。当我们将应用程序移到 NetBeans 平台上时,IDE 可以使用多种方法来支持应用程序,其中包括创建 ZIP 分发和可启动的 Web 应用程序(只需单击一下菜单项即可完成)。

  包装基础结构

  简单的 Swing 应用程序包含若干个工件,NetBeans 平台可通过“包装”模块来使用这些工件。包装模块不包含任何代码,但可以将库放在应用程序的类路径上。我们需要将几个 JAR 文件放在应用程序的类路径上。首先,需要 IDE 生成的 JAX-WS 客户端工件。其次,需要 JFrame 窗体中引用的 Java EE 5 JAR 文件。将这些 JAR 文件放在类路径上后,我们就可以在 NetBeans 平台应用程序中使用它们了。

  •   右键单击该项目,然后选择“生成项目”。在“文件”窗口 (Ctrl-2) 中,查看 dist 文件夹,您会注意到一个名为 AsyncWSClient.jar 的 JAR 文件。与其他 JAR 文件相比,该 JAR 文件包含了与前面部分叙述的 Web 服务进行交互的 JAX-WS 客户端工件。
      现在,我们将创建一个模块套件项目以提供功能丰富的新客户端应用程序的框架。
  •   选择“文件”>“新建项目”(Ctrl-Shift-N),然后从“NetBeans 插件模块”类别中选择“模块套件项目”。单击“下一步”。创建一个名为 WebServiceLocator 的模块套件项目。单击“完成”。
  •   “项目”窗口中将显示新 WebServiceLocator 应用程序的项目结构。该项目结构表示在 NetBeans 平台上构建的应用程序的框架。
      现在,我们需要将包含 Web 服务客户端工件的 JAR 文件添加到应用程序中。
  •   在“项目”窗口中,展开 "WebServiceLocator" 项目,右键单击“模块”,选择“添加新库”,然后创建一个库包装模块项目。在“库”文本字段中,浏览至 dist 文件夹,它包含了上面步骤 1 中所述的 JAR 文件。您会看到类似于以下内容的界面:


共11页。 9 1 2 3 4 5 6 7 8 9 10 11 :

TOP

当前时区 GMT+8, 现在时间是 2008-12-3 15:21
新ICP备05002317号
Powered by Discuz! 6.0.0 © 2001-2007 Comsenz Inc.
Processed in 0.042957 second(s), 7 queries, Gzip enabled
TOP
清除 Cookies - 联系我们 - 网络游戏代理 - Archiver - - WAP
Designed By Discuz! 百宝箱论坛