使用 NetBeans IDE 5.0 开发 Web 服务客户端教程

示例代码:

本文假设您了解在 NetBeans IDE 5.0 中创建使用 Web 服务客户端的基本流程。基本流程将在使用 NetBeans IDE 5.0 开发 Web 服务客户端快速入门指南中介绍。在使用 NetBeans IDE 5.0 开发 Web 服务客户端快速入门指南中,使用一个非常简单的 Web 服务,调用操作不需要传递参数。因为它非常简单,因此,您不需要分析 Web 服务。在本教程中,在构建客户端之前,您使用 NetBeans IDE 5.0 提供的 Web 服务设施分析 Web 服务。由于 Web 服务非常复杂,因此您需要执行该操作。分析 Web 服务之后,您使用 NetBeans IDE 5.0 创建使用它的客户端。

在本教程中创建的客户端使用拼写检查程序 Web 服务。在本教程中您发现您对应用程序的贡献是提供要检查的文本、在 Web 服务上调用操作以及渲染结果。IDE 生成联系 Web 服务和发送文本所需的所有代码。拼写检查程序 Web 服务还关心其他事项,它识别拼错的单词并提供建议替换单词的列表。

本教程介绍以下主题:

注意: 本教程中使用的拼写检查程序 Web 服务由 CDYNE 公司提供。CDYNE 开发、销售和支持广泛的数据增强,数据质量和数据分析 Web 服务以及业务智能集成。拼写检查程序 Web 服务是 CDYNE 提供的 Web 服务之一。正如使用 NetBeans IDE 5.0 开发 Web 服务客户端快速入门指南中指出的一样,基于一个或多个 Web 服务的应用程序长度取决于 Web 服务的可用性和可靠性。但是,CDYNE 的常见问题解答指出它有“100% 可用性目标”,如果发生“自然灾害”、恐怖行为或其他大灾难,则 Web 服务通信传输到我们的辅助数据中心。NetBeans 感谢 CDYNE 对本教程的编写和对 NetBeans 开发的支持。

安装并设置就绪后,本教程可以在 60 分钟内完成。

入门

安装软件

开始之前,需要在计算机上安装如下软件:

  • NetBeans IDE 5.0(下载)。
  • Sun Java System (SJS) Application Server Platform Edition 8 2005Q1(下载
  • Java Standard Development Kit (JDKTM) version 1.4.2(下载)或 5.0(下载

注册 Sun Java System Application Server

在创建、编译和部署 Web 服务之前,您必须注册 SJS Application Server 的一个本地实例。如果安装了 NetBeans IDE 5.0/SJS Application Server 包,则自动注册本地应用程序服务器。

  1. 从主窗口选择 Tools > Server Manager。
  2. 单击 Add Server。选择 Sun Java Systems Application Server 并为实例提供名称。然后单击 Next。
  3. 指定服务器信息、应用服务器的本地实例的位置和要部署到的域。

如果您在防火墙后面,则需要在 SJS Application Server 上设置代理主机和端口号。请参阅故障排除的第一部分以获得帮助。

了解示例

  1. 解压缩本页顶部连接的示例。

  2. 在 IDE 中,选择 File > Open Project,然后浏览到包含已解压缩文件的文件夹。打开项目。其形式如下:

    Projects 窗口

  3. 右键单击 Project 节点,然后选择 Run Project。应该显示由 JSP 页面组成的用户界面。输入一些文本:

    Entry 页面

    确保提供拼写错误的单词!

    如果应用程序没有部署或 JSP 页面没有显示,请参阅本教程结尾处的故障排除部分。

  4. 单击 Spell Check。Servlet 将输入的文本发送到拼写检查程序 Web 服务。然后拼写检查程序 Web 服务处理这个文本。它计算错误的单词数,识别错误的单词并生成建议替换单词的列表。完成它的工作之后,它将信息返回给 servlet,它识别该信息并产生一个报告:

    Entry 页面

熟悉了该示例后,下面从头开始看看如何构建它。


使用拼写检查程序 Web 服务

要使用 Web 服务,您需要创建一个 Web 服务客户端。对于创建 Web 服务客户端,NetBeans IDE 5.0 提供了一个客户端创建工具,即 Web Service Client 向导,该向导生成用于查询 Web 服务的代码。它还提供了用于开发创建的 Web 服务客户端的工具,即由 Projects 窗口中的节点组成的工作区域以及用于测试和分析 Web 服务的内置客户端。这些工具都是标准 NetBeans IDE 安装的一部分,它们完全可以即装即用,不需要任何插件。

创建客户端

  1. 选择 File > New Project (Ctrl-Shift-N)。在 Categories 下,选择 Web。在 Projects 下选择 Web Application。单击 Next。将该项目命名为 SpellCheckService 并确保将 Sun Java System Application Server 指定为您的目标服务器。单击 Finish。

  2. 在 Projects 窗口中,右键单击 SpellCheckService 项目节点,并选择 New > File/Folder。在 New File 向导中,选择 Web Service > Web Service Client。在 Web Service Client 向导中,指定 Web 服务的 URL:

    http://ws.cdyne.com/SpellChecker/check.asmx

    单击 Retrieve WSDL 下载。如果您位于防火墙之后,您将需要代理,否则无法下载 WSDL 文件。在这种情况下,单击 Web Service Client 向导中的 Proxy Settings,然后设置代理主机和端口号。

  3. 输入 org.netbeans.end2end.check.client 作为包名称。包名称指定将在其中生成客户端文件的包。

  4. 单击 Finish。

    在 Projects 窗口的 Web Service References 节点中,您应看到如下内容:

    Projects 窗口

    Projects 窗口显示名为“Check”的 Web 服务使操作“checkTextBody”和“suggestWord”可用于您的应用程序。“checkTextBody”操作检查字符串是否有拼写错误,并返回将由客户端处理的数据。整个教程中您都将使用该操作。将不使用用于向 Web 服务的字典建议单词的“suggestWord”操作。

    在 Files 窗口的 build 节点中,您应该看到以下内容:

    Files 窗口

    Files 窗口显示五个文件:

    • Check.java。 扩展 javax.xml.rpc.Service 的接口。
    • CheckSoap.java。 扩展 java.rmi.Remote 的接口。
    • CheckSoap_Impl.java。 CheckSoap.java 的实现类。实现两个操作即 checkTextBody(java.lang.String bodyText, java.lang.String licenseKey)suggestWord(java.lang.String word)
    • DocumentSummary.java。 用于访问返回文本的复杂的 DocumentSummary 对象、包含拼错单词的 Words 对象、拼错单词的数量和 Web 服务的版本。
    • Words.java。 用于访问每个拼错单词的数据数组的复杂的 Words 对象。该数据由拼错单词本身、包含建议替换单词数量的整数以及包含建议替换单词的数组组成。

测试 Web 服务

  1. 在 Projects 窗口的 Web Service References 节点内,双击“checkTextBody”操作。出现 Test Web Service Operation 对话框。

  2. 键入该操作所需的参数值:

    • bodyText。 您要检查的文本。记住包含几个拼错的单词。
    • licenseKey。 Web 服务所需的许可密钥。键入 0

  3. 单击 Submit。执行此步骤时,将联系 Web 服务并调用操作。等待文本进行检查和返回(时间应该不会太长)。现在应该看到下图:

    Test Web Service Client 向导

如果您看到的结果与上图相似,说明测试已经成功。Web 服务启动并运行,已处理您的文本。内置的客户端已经联系了该 Web 服务,并将您的值传递给它并检索结果。如果没有返回结果或者您位于防火墙之后,请参阅故障排除的第二部分获得帮助。

分析 Web 服务

当 IDE 使用 Web Service Client 向导中您指定的信息生成 Web 服务客户端的文件时,它为每个在 WSDL 文件中定义的复杂数据类型生成 Java 对象。拼写检查程序 WSDL 文件包含两个复杂的数据类型即 DocumentSummaryWords

<s:complexType name="DocumentSummary">
 <s:sequence>
   <s:element minOccurs="0" maxOccurs="unbounded" name="MisspelledWord" type="s0:Words" />
   <s:element minOccurs="0" maxOccurs="1" name="ver" type="s:string" />
   <s:element minOccurs="0" maxOccurs="1" name="body" type="s:string" />
   <s:element minOccurs="1" maxOccurs="1" name="MisspelledWordCount" type="s:int" />
 </s:sequence>
</s:complexType>

<s:complexType name="Words">
 <s:sequence>
   <s:element minOccurs="0" maxOccurs="unbounded" name="Suggestions" type="s:string" />
   <s:element minOccurs="0" maxOccurs="1" name="word" type="s:string" />
   <s:element minOccurs="1" maxOccurs="1" name="SuggestionCount" type="s:int" />
 </s:sequence>
</s:complexType>

为了成功实现该客户端,您需要使用这些复杂的数据类型以及每个类型提供的数据。IDE 提供几个工具使您能够以图形的方式检查每个复杂的数据类型(由它的相关 Java 对象表示)并且解压缩它的数据。下面向您介绍如何执行该操作,使用 CDYNE 的拼写检查 Web 服务的 WSDL 作为示例。

检查 DocumentSummary 对象

  1. 对于“checkTextBody”操作打开 Test Web Service Operation 对话框,如上一部分所述。填写一些文本,对于 licenseKey 参数键入 0,单击 Submit。

    Test Web Service Operation 对话框的下面部分显示以下内容:

    Test Web Service Client 向导

    这是 Web 服务的最外层。执行其他操作之前,需要处理该层。注意,最高节点名为 DocumentSummary

  2. 在 Files 窗口 (Ctrl-2) 中,展开 build 文件夹,直到您到达此处:

    现在双击 DocumentSummary.java 节点在 Source Editor 中打开它(同时查看上面的节点)。执行此操作可以显示 DocumentSummary.java 能够使用的方法。在 Source Editor 中打开它(并在 Files 窗口中查看展开的节点)之后,您可以看到 SpellChecker 服务返回的正确文本应该指定给 DocumentSummary 对象。执行该操作之后,您可以使用它的方法与正确的文本进行交互。在下一部分中,您使用 DocumentSummary 对象如下(下面的粗体代码高亮显示了 DocumentSummary 对象提供的方法):

        DocumentSummary doc = getCheckSoap().checkTextBody(text,"0");
        String allcontent = doc.getBody();
        int no_of_mistakes = doc.getMisspelledWordCount();
        Words[] allwrongwords = doc.getMisspelledWord();

    但是您对它执行任何操作之前,需要处理 Words 对象,allcontent 字符串和 no_of_mistakes 整数才可以正确使用。例如,在报告的顶部您可能想显示发送到 Web 服务的文本。该文本由 allcontent(下面以粗体显示的代码)提供:

        out.println("<b>Your text:</b> \"" + allcontent + "\"<p>");

    如果在浏览器中显示,上面一行代码的结果如下:

    在浏览器中显示

    有另一种方法名为 getVer,但是在本教程中您不需要使用它。另一方面,如果您将使客户端实现一般可用,并且在业务设置中真正地使用它,则运行检查条件非常有用,它检查 Web 服务的版本是否是您希望的版本,并且在版本不同时产生某些种类的错误消息,原因是随后的 Web 服务版本可能与您的客户端实现发生冲突。

检查 Words 对象

  1. 在 Test Web Service Operation 对话框中,展开 DocumentSummary 节点。现在展开 Words[] 节点及其一个子节点。现在 Test Web Service Operation 对话框的下面部分显示以下内容:

    Test Web Service Client 向导

    这是 Words 对象。它包含名为 Words 的数组(针对每个拼错的单词)。在上图中,您可以看到拼错单词“spell”的 Words 数组。

  2. 在 Files 窗口 (Ctrl-2) 中,展开 build 文件夹,直到您到达此处:

    现在双击 Words.java 节点在 Source Editor 中打开它(同时查看上面的节点)。执行此操作向您显示什么方法可用于 Words.java。在 Source Editor 中展开它(再在 Files 窗口中查看它的扩展节点)之后,您可以看到每个拼错的单词应该指定给 Words 数组,您可以使用 Words 对象访问该数组。执行该操作之后,您可以使用 Words 对象的方法分别与每个拼错的单词进行交互。在下一部分中,您使用 Words 对象如下(下面的粗体代码高亮显示 Words 对象提供的方法):

      for (int i = 0; i < allwrongwords.length; i++) {
    
        String onewrongword = allwrongwords[i].getWord();
        int onewordsuggestioncount = allwrongwords[i].getSuggestionCount();
        String[] allsuggestions = allwrongwords[i].getSuggestions();
    
        out.println("<hr><p><b>Wrong word:</b><font color='red'> " + onewrongword + "</font>");
        out.println("<p><b>" + onewordsuggestioncount + " suggestions:</b><br>");
    
        for (int k = 0; k < allsuggestions.length; k++) {
          String onesuggestion = allsuggestions[k];
          out.println(onesuggestion);
        }
    
      }

    在浏览器中显示,上面几行代码的结果如下:

    在浏览器中显示

    为了使事情更完美,您可以在结尾处提供一个总结:

      out.println("<font color='red'><b>Summary:</b> " + no_of_mistakes + " mistakes (");
      for (int i = 0; i < allwrongwords.length; i++) {
          String onewrongword = allwrongwords[i].getWord();
          out.println(onewrongword);
      }
      out.println(").");
      out.println("</font>");

    在浏览器中显示,上面几行代码的结果如下:

    在浏览器中显示

    当然,一些变化是可能的。您访问所需的方法之后,可以很轻松地循环返回的数据并对其执行您希望的操作。

开发客户端

有很多方法可以实现 Web 服务客户端。Web 服务的 WSDL 文件限制您向 Web 服务发送的信息类型,并且它还限制返回时您希望接收到的信息类型。但是,WSDL 文件没有对您如何 传递它需要的信息进行限制,也没有对用户界面的组成 进行限制。下面您构建的客户端实现由允许用户输入要检查的文本的 JSP 页面和将该文本传递给 Web 服务,然后产生包含结果的报告的 servlet 组成。

编写 JSP Page 的代码

  1. 在 Projects 窗口中,展开 Web Page 节点并双击 index.jsp 将它在 Source Editor 中打开。

  2. 复制以下代码并将其粘贴到 index.jsp 中的 <body> 标记上:
    <body>
      <form name="Test" method="post" action="SpellCheckServlet">
         <p><font color='red'>Enter the text you want to check:</font></p>
         <p>
         <p><textarea rows="7" name="TextArea1" cols="40" ID="Textarea1"></textarea></p>
         <p>
         <input type="submit" value="Spell Check" name="spellcheckbutton">
      </form>
    </body>

    以上代码指定单击 submit 按钮时发布到名为 SpellCheckServlet 的 servlet 的 textarea 的内容。

创建和编码 SpellCheckServlet

  1. 右键单击 Explorer 窗口中的项目节点,选择 New > File/Folder,然后选择 Web > Servlet。单击 Next。将 servlet 命名为 SpellCheckServlet 并在 Package 下拉列表中键入 org.netbeans.end2end.check.client。单击 Next。注意,该 servlet 的 URL 映射为 /SpellCheckServlet,然后单击 Finish。Servlet 在 Source Editor 中打开。

  2. 将光标放在 Source Editor 的 processRequest 方法内,右键单击并选择 Web Service Client Resources > Call Web Service Operation。单击“Select Operation to Invoke”对话框中的 checkTextBody 操作,然后单击 OK。

    现在代码位已经添加到 servlet。滚动到底部,您看到将客户端连接到 Web 服务的代码(大多数代码有红色下划线,忽略这一情况,这是一个错误,对构建和运行应用程序没有影响)。

    processRequest 方法的顶部可看到调用 Web 服务的代码片段。该方法就是您在 Web 服务上调用操作需要使用的所有方法。

  3. 用下面的代码替换整个 processRequest 方法。下面代码的行内注释解释每行的作用。
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
    
    	//Get content from JSP:
            String TextArea1 = request.getParameter("TextArea1");
    	//Invoke the operation on the web service that does the spell check.
    	//As arguments, send the content and the key:
            DocumentSummary doc = getCheckSoap().checkTextBody(TextArea1,"0");
    	//From the retrieved document summary,
    	//identify all the content, correct and incorrect:
            String allcontent = doc.getBody();
    	//From the retrieved document summary,
    	//identify the number of wrongly spelled words:
            int no_of_mistakes = doc.getMisspelledWordCount();
    	//From the retrieved document summary,
    	//identify the array of wrongly spelled words:
            Words[] allwrongwords = doc.getMisspelledWord();
    
            out.println("<html>");
    	out.println("<head>");
            //Display the report's name as a title in the browser's titlebar:
            out.println("<title>Spell Checker Report</title>");
            out.println("</head>");
            out.println("<body>");
    	//Display the report's name as a header within the body of the report:
            out.println("<h2><font color='red'>Spell Checker Report</font></h2>");
    	//Display all the content (correct as well as incorrectly spelled) between quotation marks:
            out.println("<hr><b>Your text:</b> \"" + allcontent + "\"" + "<p>");
    	//For every array of wrong words (one array per wrong word),
            //identify the wrong word, the number of suggestions, and
            //the array of suggestions. Then display the wrong word and the number of suggestions and
            //then, for the array of suggestions belonging to the current wrong word, display each
    	//suggestion:
            for (int i = 0; i < allwrongwords.length; i++) {
                String onewrongword = allwrongwords[i].getWord();
                int onewordsuggestioncount = allwrongwords[i].getSuggestionCount();
                String[] allsuggestions = allwrongwords[i].getSuggestions();
                out.println("<hr><p><b>Wrong word:</b><font color='red'> " + onewrongword + "</font>");
                out.println("<p><b>" + onewordsuggestioncount + " suggestions:</b><br>");
                for (int k = 0; k < allsuggestions.length; k++) {
                    String onesuggestion = allsuggestions[k];
                    out.println(onesuggestion);
                }
            }
    	//Display a line after each array of wrong words:
            out.println("<hr>");
    	//Summarize by providing the number of errors and display them:
            out.println("<font color='red'><b>Summary:</b> " + no_of_mistakes + " mistakes (");
            for (int i = 0; i < allwrongwords.length; i++) {
                String onewrongword = allwrongwords[i].getWord();
                out.println(onewrongword);
            }
            out.println(").");
            out.println("</font>");
            out.println("</body>");
            out.println("</html>");
            out.close();
        }
  4. 注意,上面的代码中未涉及错误处理。有关详细信息,请参阅应用您所学的知识

  5. 保存 servlet。记住您可以忽略 IDE 生成的 Web 服务方法中的红色下划线,它是已知的错误,对构建和运行应用程序没有影响。

部署客户端

IDE 使用 Ant 构建脚本构建和运行应用程序。IDE 根据您创建项目时输入的选项生成构建脚本。您可以在该项目的 Project Properties 对话框中微调这些选项(右键单击 Projects 窗口中的项目节点,然后选择 Properties)。

  1. 右键单击 Project 节点,然后选择 Run Project。

    一段时间之后,应用程序应该部署和显示您在上一部分中已进行编码的 JSP 页面。输入一些文本,确保其中一些文本有拼写错误:

    Projects 窗口

  2. 按照了解示例所述使用应用程序。有关故障排除方面的问题,请参阅故障排除

应用您所学的知识

  • 向 servlet 中添加错误处理代码。

  • 重新编写客户端,以便用户可以与从 Web 服务返回的数据交互。要获得灵感,请参阅 CDYNE 站点上的客户端实现(单击此处)。

故障排除

由于 IDE 提供与 Web 服务通信所需的大多数代码,所以只有您遇到的问题才是自己的代码中的错误。此外,虽如此,如果您在防火墙后面,则可能会遇到几个问题。随后的故障排除提示将试图解决这些问题。

  • 如果部署了应用程序而没有正确设置代理主机和端口,则会在您的浏览器中看到以下内容:

    代理问题 1

    要解决此问题,则执行以下操作:

    1. 在 Runtime 窗口中,确保 Sun Java System Application Server 正在运行。如果正在运行,则在服务器名称的右边显示文本 [running]
    2. 右键单击 JVMs 节点并选择 Properties。
    3. 单击 JVMOptions 属性右边的省略号。
    4. 将以下两个属性添加到列表中:

      • -Dhttp.proxyHost

      • -Dhttp.proxyPort

      确保为这些属性设置的值适用于您的环境。

  • 如果在 IDE 测试应用程序而没有正确设置代理主机和端口,则此错误将显示在 IDE 中:

    代理问题 1

    要解决此问题,则执行以下操作:

    1. 选择 Tools > Options。

    2. 在 Options 窗口中,设置代理主机和端口号。

下一步

有关使用 NetBeans IDE 5.0 的更多信息,请参见以下参考资料:

要发送评论和建议、获得支持和随时获得关于 NetBeans IDE J2EE 开发特性的最新发展情况,请加入 nbj2ee@netbeans.org 邮件列表。有关 NetBeans IDE 中即将到来的 J2EE 开发特性的更多信息,请参见 j2ee.netbeans.org .

 
 
 搜索