■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |