■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年11月24日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.128

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.SOAPのアプリケーション(Webサービス)
========================================================


前回言い忘れていましたが、

--------------------------------------------------------
java org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/services/WebService1?wsdl
--------------------------------------------------------

のコマンドの実行および、それ以降の作業は、A社側(B社がWebサービスを提供
する側なのに対し、A社はWebサービスを利用する側)が行う作業です。

従って、上のコマンドのlocalhostの部分は現実的には、(インターネットを通してアクセス
するため)ドメイン名を指定するのが普通になります。

なお、上記のように直接WSDLファイルのURLを指定するほかに、UDDI(Universal Description,
Discovery and Integration)という検索システムを使ってWSDLファイルを見つける方法
もありますが、UDDIは現在普及していないし、今後も普及する動きはないため、当メール
マガジンでは割愛いたします。


それから、前回、WSDL2Java(上記)のコマンドでWSDLからスタブのクラス(interfaceもある)
を生成し、それをEclipseにコピーしたときにクラス(あるいはinterface)のソース・
コードを覗いた人は、コメント行が文字化けしていることに気づいたでしょう。
これは、WSDL2Java(上記)のコマンドで生成されたソース・コードがUTF-8で書かれて
いるのに対してEclipseのほうはデフォルトのエンコーディングがShift-JIS(正確に言うと
MS932)になっているために漢字が文字化けしてしまったものです。

そのまま無視しても構わないのですが、気になる人のために、UTF-8からShift-JISに
変換するサンプル・プログラムを提示しておきましょう。

下記のソース・コードの通りにパッケージ(jp.co.flsi.sample.util)、クラス(
EncodeConverter)を作成し、コメント行のように引数にディレクトリー名(
C:\ws_work\jp\co\flsi\webservice)を指定して実行すると、指定したディレクトリー
の中の全ファイルがUTF-8からShift-JISに変換されます。

--------------------------------------------------------
package jp.co.flsi.sample.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class EncodeConverter {

   /**
    * @param args
    * 引数の例 : C:\ws_work\jp\co\flsi\webservice
    */
   public static void main(String[] args) {
      String dirName = null;
      if (args.length < 1) {
         dirName = ".";
      }
      else {
         dirName = args[0];
      }
      File directory = new File(dirName);
      if (!directory.isDirectory()) {
         System.out.println("エラー: 指定された名前のディレクトリーは存在しません : " + dirName);
      }
      String[] fileNames = directory.list();
      try {
         for (String fileName : fileNames) {
            String inFileName = dirName + "\\" + fileName;
            File inFile = new File(inFileName);
            if (inFile.isDirectory()) continue;
            FileInputStream fis = new FileInputStream(inFileName);
            String outFileName = inFileName + ".EncConv.temp.out";
            FileOutputStream fos = new FileOutputStream(outFileName);
            InputStreamReader in = new InputStreamReader(fis, "UTF-8");
            OutputStreamWriter out = new OutputStreamWriter(fos, "Shift_JIS");
            int aChar;
            while ((aChar = in.read()) != -1) {
               out.write(aChar);
            }
            in.close();
            out.close();
            inFile.delete();
            File outFile = new File(outFileName);
            outFile.renameTo(inFile);
         }
      } catch(IOException e) {
         System.out.println("IOエラー: " + e.getMessage());
      }
   }
}
--------------------------------------------------------

なお、InputStreamReaderはvol.068などでもちらっと出てきましたが、バイト単位で
データを読み込むもので、FileInputStreamと組み合わせて使うことにより、ファイルから
バイト・データを読み込んで文字のデータ(Javaのプログラムの中に読み込むと
Unicodeに変換される)に変換して取り込むことができます。
OutputStreamWriterとFileOutputStreamの組み合わせはその逆で、文字からバイトに
変換してファイルに書き出します。
このときバイトのデータは、デフォルトではそのプラットフォーム(ここではWindows)
のデフォルトのエンコーディング(たとえばWindowsではShift-JIS)で処理されます。
明示的にエンコーディングを指定したいときは、上のソース・コードのように、
InputStreamReaderやOutputStreamWriterのコンストラクターの第二引数でエンコーディング
を指定してやればいいのです。

このソース・コードの解説はしませんので、練習問題としてご自分で解読してみて
ください。

なお、UTF-8で書かれたこれらのファイルも、以前紹介したNoEditorで開いて見ると
文字化けせずに見ることができます(自動的にUTF-8であることを認識し、UTF-8モード
で開いてくれる)。また、UTF-8から他の文字コードに変更することもできます(「整形」
メニューの「文字コード変換」を使う)。


┌補足─────────────────────────┐
Eclipseのエンコーディングを変更したいときは、パッケージ・
エクスプローラーでプロジェクトまたはパッケージまたはクラス
などを右クリックし、「プロパティー」を選択し、
「プロパティー」ウインドウで「情報」を選択し、
右側の「テキスト・エンコード」の中で選択します。
└───────────────────────────┘




では、本論に戻ることにして、Webサービスを呼び出す側(A社側)のプログラムとして
以下のようなクラスを作ってみましょう。


(1) Eclipseを起動し、パッケージ・エクスプローラーの中でJStudySoapClientの中の
srcを右クリックし、「新規」→「パッケージ」を選択します。

(5) パッケージの「名前」を
jp.co.flsi.lecture.soap.client
と入力し、「終了」ボタンをクリックしましょう。

(6) パッケージ・エクスプローラー内にできたjp.co.flsi.lecture.soap.clientを
右クリックし、「新規」→「クラス」を選択します。

(7) 「名前」を
WebService1Client
と入力し、「終了」ボタンをクリックしましょう。

(8) このWebService1Clientクラスを下記のようなソース・コードに編集しましょう。

--------------------------------------------------------
package jp.co.flsi.lecture.soap.client;

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import jp.co.flsi.webservice.WebService1;
import jp.co.flsi.webservice.WebService1Service;
import jp.co.flsi.webservice.WebService1ServiceLocator;

public class WebService1Client {
   public static void main(String[] args) throws RemoteException, ServiceException {
      WebService1Service locator = new WebService1ServiceLocator();
      WebService1 webService = locator.getWebService1();
      String[] longArray = new String[] {"munyamunya", "funyafunya"};
       String s = webService.searchBestItem(longArray);
       System.out.println("Result of searchBestItem() = " + s);
       String itemNumber = "A007";
       int quantity = 2;
       String customerId = "C007";
       s = webService.placeAnOrder(itemNumber, quantity, customerId);
       System.out.println("Result of placeAnOrder() = " + s);
   }
}
--------------------------------------------------------

なお、上のソース・コードは、このプログラムを実行するコンピューターとWebサービス
を提供するコンピューターが同一の場合のものです。
実用的なプログラムの場合には、これらはインターネットを隔てて別々のコンピューター
になりますから、その場合には、上の

      WebService1 webService = locator.getWebService1();

の部分を

      String url = "http://ドメイン名またはIPアドレス:8080/axis/services/WebService1?wsdl";
      WebService1 webService = locator.getWebService1(new URL(url));

のように書き換えて、Webサービスを提供しているコンピューターのURLを指定してやる
必要があります。上記の「ドメイン名またはIPアドレス」の所には、文字通りドメイン名か、
あるいはIPアドレスを入れますが、このプログラムを実行するコンピューターとWebサービス
を提供するコンピューターが同一の場合は例によってlocalhostを入れておけばアクセスできます。


では、Tomcatを起動(Axisを起動するため)してから、このクラスを実行してみて下さい。
ちゃんとWebサービスが実行されて、結果が返ってきますね。



(次回に続く)


では、今日はここまでにします。

何か、わからないところがありましたら、下記のWebページまで質問を
お寄せください。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2008 Future Lifestyle Inc. 不許無断複製