FeaturesPluginsDocs & SupportCommunityPartners

JAX-WS Web サービスクライアントの開発

このチュートリアルでは、NetBeans IDE 6.0 または 6.1 が提供する Web サービス機能を使用して、「Spell Checker」という Web サービスを分析してから、これと連動する Web クライアントを構築します。

目次

このページの内容は NetBeans IDE 6.0 および 6.1 が対象です

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE Web および Java EE の version 6.0 または 6.1
Java Development Kit (JDK) version 6 または
version 5
Java EE 互換の Web サーバーまたはアプリケーションサーバー Tomcat Web サーバー 6.0 および/または
GlassFish アプリケーションサーバー v2

Tomcat および GlassFish は、どちらも NetBeans IDE の Web および Java EE の配布とともにインストールできます。または、GlassFish のダウンロードページまたは Apache Tomcat のダウンロードページからダウンロードすることもできます。

クライアントは次のようなもので、データはすべて Web サービスで取得しています。

Spell Checker のレポート

このチュートリアルのアプリケーションで行うのは、チェック対象のテキストの入力、Web サービス上での処理の開始、および結果の描画だけです。Web サービスへの接続とテキストの送信に必要なコードは、IDE がすべて生成します。Spell Checker Web サービスがその他の処理を行います。スペルミスのある単語を特定し、修正候補のリストを表示します。

注: このチュートリアルで使用する Spell Checker Web サービスは、CDYNE 社が提供しています。CDYNE は、データ拡張、データ品質、およびデータ分析の各 Web サービスと、ビジネスインテリジェンスを統合する、包括的なスイートを開発、販売、およびサポートしています。Spell Checker Web サービスは、CDYNE が提供する Web サービスの 1 つです。1 つまたは複数の Web サービスに基づくアプリケーションの堅牢さは、Web サービスの可用性と信頼性によって決まります。ただし、CDYNE の FAQ では、CDYNE が「100% の可用性を目標」とし、「自然災害、テロ、その他の災害時に、Web サービスのトラフィックはセカンダリデータセンターに転送される」とあります。CDYNE のおかげでこのチュートリアルを執筆できました。サービスの開発のサポートに感謝します。

Spell Checker Web サービスの使用

Web サービスを使用するには、Web サービスクライアントを作成する必要があります。Web サービスクライアントの作成のために、NetBeans IDE 6.1 および 6.0 にはクライアント作成機能が用意されています。これは、Web サービス検索用のコードを生成する、「Web サービスクライアント」ウィザードです。また、作成した Web サービスクライアントを開発する機能もあります。これは「プロジェクト」ウィンドウ上の複数のノードからなる作業領域で行います。これらの機能は NetBeans IDE の標準インストールに含まれているため、すぐに使用できます。また、プラグインは必要ありません。

クライアントの作成

この節では、ウィザードを使用して、Web サービスの WSDL ファイルから Java オブジェクトを生成します。

  1. 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「カテゴリ」から「Web」を選択します。「プロジェクト」から「Web アプリケーション」を選択します。「次へ」をクリックします。プロジェクト名を「SpellCheckService」とし、ターゲットサーバーに適切なサーバーを指定していることを確認します。詳細は、「入門」節を参照してください。「完了」をクリックします。
  2. 「プロジェクト」ウィンドウで SpellCheckService プロジェクトノードを右クリックし、「新規」>「その他」を選択します。「新規ファイル」ウィザードで、「Web サービス」>「Web サービスクライアント」を選択します。「Web サービスクライアント」ウィザードで、次に示す Web サービスへの URL を指定します。

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

    ファイアウォールを使用している場合、プロキシサーバーの指定が必要になることがあります。そうしないと、WSDL ファイルをダウンロードできません。その場合は、「Web サービスクライアント」ウィザードで「プロキシを設定」をクリックし、プロキシのホストとポート番号を設定します。

  3. パッケージの名前は空のままにします。NetBeans IDE 6.1 では、パッケージ名を指定できません。デフォルトでは、クライアントクラスのパッケージ名は WSDL から取得されます。今回のケースでは com.cdyne.ws です。
  4. 6.1 では、JAX-WS バージョンの JAX を選択します。一部の古いサービスでは、JAX-RPC クライアントが必要です。「完了」をクリックします。
  5. 「プロジェクト」ウィンドウの「Web サービス参照」ノードは、次のようになっているはずです。
    Web サービス参照を表示している「プロジェクト」ウィンドウ

この「プロジェクト」ウィンドウは、「check」という Web サービスにより、アプリケーションで「CheckTextBody」操作が利用可能になったことを示しています。「CheckTextBody」操作は、文字列をチェックしてスペルミスを発見し、クライアントで処理するデータを返します。このチュートリアル全体で、この操作を使用します。

「ファイル」ウィンドウの build ノード内は、次のようになっているはずです。

build ノードのパッケージ構造を示す「ファイル」ビュー

「ファイル」ウィンドウには、JAX-WS Web サービスクライアントのウィザードによって生成されたクライアント用スタブが表示されています。

クライアントの開発

Web サービスクライアントを実装する方法はいくつもあります。Web サービスの WSDL ファイルは、Web サービスに送信できる情報の種類を制限するとともに、逆に受け取る情報の種類も制限します。ただし、WSDL ファイルは、必要となる情報を送信する方法や、ユーザーインタフェースを構成する内容には制限を設けません。次に構築するクライアント実装は、ユーザーがテキストを入力してチェックできるようにする JSP ページと、そのテキストを Web サービスに送信したあと結果レポートを生成するサーブレットで構成されます。

JSP ページのコーディング

今回の JSP ページは、ユーザーがテキストを入力するテキスト領域と、そのテキストを Web サービスに送信するボタンの単純な構成にします。

  1. 「プロジェクト」ウィンドウで、「Web ページ」ノードを展開して「index.jsp」をダブルクリックすると、そのファイルがソースエディタで開きます。
  2. 次のコードをコピーし、index.jsp<body> タグにペーストします。
    <body>
      <form name="Test" method="post" action="SpellCheckServlet">
         <p>Enter the text you want to check:</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>

    上記のコードでは、送信ボタンがクリックされるときに、textarea の内容が SpellCheckServlet というサーブレットに送信されることが指定されています。

サーブレットの作成およびコーディング

この節では、Web サービスと相互作用するサーブレットを作成します。ただし、あとで説明しますが、相互作用を実行するコードは IDE が提供します。結果として、開発者が処理する必要があるのはビジネスロジックだけです。つまり、送信するテキストの準備と結果の処理です。

  1. 「プロジェクト」ウィンドウでプロジェクトノードを右クリックし、「新規」>「その他」を選択します。次に、「Web」>「サーブレット」を選択します。「次へ」をクリックします。サーブレットの名前を SpellCheckServlet とし、「パッケージ」のドロップダウンに「clientservlet」と入力します。「次へ」をクリックします。次に示すように、サーブレットの URL マッピングが /SpellCheckServlet であることを確認します。
    ブラウザでの表示

    「完了」をクリックします。ソースエディタでサーブレットが開きます。

  2. ソースエディタ内の processRequest メソッド内にカーソルを置き、メソッドの直前に新しい行をいくつか加えます。
  3. 前の手順で作成したスペースで右クリックし、「Web サービスクライアントのリソース」>「Web サービスオペレーションを呼び出す」を選択します。次に示すように、「呼び出すオペレーションを選択」ダイアログで「CheckTextBody」オペレーションをクリックします。
    CheckTextBody オペレーションを表示する「呼び出すオペレーションを選択」ダイアログ

    「了解」をクリックします。

    注: このダイアログを呼び出す代わりに、オペレーションのノードを「プロジェクト」ウィンドウからエディタに直接ドラッグ&ドロップすることもできます。

    次のように、processRequest メソッドの上に Web サービスを呼び出すコードのスニペットが表示されます。

    try { // Call Web Service Operation
    com.cdyne.ws.CheckSoap port = service.getCheckSoap();
    // TODO initialize WS operation arguments here
    java.lang.String bodyText = "";
    java.lang.String licenseKey = "";
    // TODO process result here
    com.cdyne.ws.DocumentSummary result = port.checkTextBody(bodyText, licenseKey);
    System.out.println("Result = " + result);
    } catch (Exception ex) {
    // TODO handle custom exceptions here
    }

    Web サービスのオペレーションを呼び出すのに必要なのはこのメソッドだけです。また、クラスの先頭で次のコード行が宣言されます。

    @WebServiceRef(wsdlLocation = "http://ws.cdyne.com/SpellChecker/check.asmx?WSDL")
                    private Check service;
  4. processRequest メソッド全体を次のコードに置き換えます。コード内のコメントは、各行の目的を説明しています。コードをペーストしたあと、インポート部分を修正します。任意の場所で右クリックしてコンテキストメニューを開き、「インポートを修正」を選択します。
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
    
        try {
    
            // Web サービスオペレーションを呼び出す
            String TextArea1 = request.getParameter("TextArea1");
    
            com.cdyne.ws.CheckSoap port = service.getCheckSoap();
    
            // TODO ここで Web サービスオペレーションの引数を初期化
            java.lang.String bodyText = TextArea1;
            java.lang.String licenseKey = "0";
    
            // TODO ここで結果を処理
            com.cdyne.ws.DocumentSummary doc = port.checkTextBody(bodyText, licenseKey);
            String allcontent = doc.getBody();
    
            // 取得した DocumentSummary から、
            // 誤ったスペルの単語数を特定:
            int no_of_mistakes = doc.getMisspelledWordCount();
    
            // 取得した DocumentSummary から、
            // 誤ったスペルの単語の配列を特定:
            List allwrongwords = doc.getMisspelledWord();
    
            out.println("<html>");
            out.println("<head>");
    
            // レポートの名前をタイトルとしてブラウザのタイトルバーに表示:
            out.println("<title>Spell Checker Report</title>");
            out.println("</head>");
            out.println("<body>");
    
            // レポート名をヘッダーとしてレポートの本文に表示:
            out.println("<h2><font color='red'>Spell Checker Report</font></h2>");
    
            // 引用符の間にすべての情報を表示 (正しいスペルおよび間違ったスペル):
            out.println("<hr><b>Your text:</b> \"" + allcontent + "\"" + "<p>");
    
            // 誤った単語の配列 (1 つの誤った単語について 1 つの配列) のそれぞれに対し、
            // 誤った単語、修正候補の数、修正候補の配列を特定。続いて誤った単語と修正候補の数を表示し、
            // 現在の誤った単語に関連する修正候補の配列について、
            // それぞれの修正候補を表示:
            for (int i = 0; i < allwrongwords.size(); i++) {
                String onewrongword = ((Words) allwrongwords.get(i)).getWord();
                int onewordsuggestioncount = ((Words) allwrongwords.get(i)).getSuggestionCount();
                List allsuggestions = ((Words) allwrongwords.get(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.size(); k++) {
                    String onesuggestion = (String) allsuggestions.get(k);
                    out.println(onesuggestion);
                }
            }
    
            // 誤った単語の各配列のあとに水平線を表示:
            out.println("<hr>");
    
            // 誤った単語の数をまとめた Summary を作成して表示:
            out.println("<font color='red'><b>Summary:</b> " + no_of_mistakes + " mistakes (");
            for (int i = 0; i < allwrongwords.size(); i++) {
                String onewrongword = ((Words) allwrongwords.get(i)).getWord();
                out.println(onewrongword);
            }
    
            out.println(").");
            out.println("</font>");
            out.println("</body>");
            out.println("</html>");
            out.close();
    
        } catch (Exception ex) {
            System.out.println("exception" + ex);
            out.println("exception" + ex);
        }
    
        out.println("</body>");
        out.println("</html>");
        out.close();
                    }

    このコードでは、エラー処理が行われていません。詳細は、応用を参照してください。

  5. クライアントの配備

    IDE は、Ant 構築スクリプトを使用して、アプリケーションを構築および実行します。IDE は、プロジェクト作成時にユーザーが入力したオプションに基づいて、構築スクリプトを生成します。このオプションは、プロジェクトの「プロジェクトプロパティー」ダイアログ (「プロジェクト」ウィンドウでプロジェクトノードを右クリックし、「プロパティー」を選択) で微調整できます。

    1. プロジェクトのノードを右クリックし、「実行」を選択します。しばらくすると、前の節でコード入力した JSP ページが配備されて表示されるはずです。
    2. テキストを入力します。誤ったスペルの単語が含まれるようにします。
      チェックするテキストの入った JSP ページ
    3. 「Spell Check」をクリックして結果を確認します。
      誤りを表示する Spell Checker のレポート

    応用

    これで、はじめての Web サービスクライアントを IDE で完成しました。さらにスキルを伸ばし、目的に合うアプリケーションになるよう改良してみましょう。次に着手できそうなタスクを 2 つ提案します。

    • サーブレットにエラー処理のコードを追加する。
    • Web サービスから返されたデータとユーザーが対話できるように、クライアントのコードを書き直す。CDYNE のクライアント実装サイトを見ると、ヒントが得られます。そのサイトは次のような外観です。CDYNE のスペルチェックサービス


    関連項目

    NetBeans IDE を使用した Java EE アプリケーションの開発方法についての詳細は、次のリソースを参照してください。

    メーリングリストに登録することによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。

Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by