JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > SOAP編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/02/03  田中宏和
Last Update 2002/12/01
SOAP編
◆SOAPとは?
 SOAPSimple Object Access Protocolの略です。他のコンピューターにあるWebサービスを呼び出すためのプロトコルです。下位プロトコルにHTTPやSMTPを使用するためファイヤーウォールなどあっても他のコンピューターにあるオブジェクトにアクセスすることができます。
◆SOAPメッセージとは?
SOAPを使用した通信はSOAPメッセージと呼ばれるメッセージを送ることで行います。SOAPメッセージはSOAPエンベロープ、SOAPヘッダ、SOAPボディから構成されます。
◆ここでの環境
OS Windows 2000
J2SE SDK 1.3.1_01
サーバー Tomcat 4.0.3
◆動作環境の整備
■環境変数CLASSPATHの設定
以下がここで使用するライブラリと環境変数CLASSPATHに設定するJARファイルです。
JavaMail(ここではバージョン1.2) mail.jar
JAF(ここではバージョン1.01) activation.jar
Xerces(ここではバージョン2.2.1) xalan.jar,xercesImpl.jar
(Xerces-J-tools.2.1.1.zipに入っています)
Apache SOAP(ここではバージョン2.3.1) soap.jar
一番下の、Apache SOAPは、JavaでSOAPを使用するためのAPIです。これは、アプリケーションサーバーでSOAPを利用できるようにするために必要になります。また、クライアントプログラムで使用するAPIも入っています。
■Tomcatを動作可能にする
Servlet編を参考にしてTomcatを使用可能にしてください。
■TomcatへのWEBアプリケーションの配置
TomcatでSOAPを利用可能にするには、Apache SOAPをダウンロードして解凍したフォルダのwebappsフォルダの下にあるsoap.warファイルをTomcatのフォルダの下にあるwebappsフォルダの下にコピーします。コピーしましたらTomcatを起動しましょう。これでApache SOAPが利用可能になります。
(参考) Tomcatのバージョンが3.2の場合の設定
Tomcatのバージョンが3.2の場合、Tomcatが使用しているXMLパーサーのバージョンが古いためうまく動きません。なぜかというと、Tomcatが起動時に設定するCLASSPATHの順番が
1.Tomcatが使用するライブラリ
2.ユーザーがCLASSPATHに指定したライブラリ
になっているためです。 Tomcatが使用するライブラリに古いXMLパーサーが含まれているのでそれが使用されてしまい正しく動作しません。
この問題を解決するには起動停止用バッチファイルの[Tomcatのフォルダ]\bin\tomcat.batを修正します。
105行目の(Tomcat 3.2.1の場合は69行目)
set CP=%CP%;%CLASSPATH%
を以下のように修正します。
set CP=[xercesImpl.jarのパス];[xalan.jarのパス];%CP%;%CLASSPATH%
◆サーバー側のクラスの作成
次にサーバー側のクラスを作ります。以下がそのソースです。「Hello World」と返すメソッドを一つだけ持つ単純なものです。
■ソースコード
HelloWorldSOAP.java(ここからダウンロード)
public class HelloWorldSOAP {
  public String sayHelloWorld() {
    return "Hello World";
  }
}
 
■コンパイル
コマンドプロンプト

C:\JavaHello\SOAP>javac HelloWorldSOAP.java

C:\JavaHello\SOAP>

■クラスファイルのコピー
コンパイルしたクラスファイルをTomcatをインストールしたフォルダの下のwebapps\soap\WEB-INF\classesの下にコピーしてください。コピーしましたら、Tomcatを再起動しましょう。
◆サービスの登録
次にApache SOAPサーバーにWEBサービスを登録します。下のURLで設定できます。
http://localhost:8080/soap/admin/index.html
Deployボタンを押してください。設定フォームが表示されます。ここで設定する項目は以下の通りです。
ID→サービスを識別するURI
Methods→メソッド名
Provider Class→クラス名
これ以外はデフォルトのままでOKです。
ID urn:HelloWorldSOAP
Methods sayHelloWorld
Provider Class HelloWorldSOAP
設定しましたら、一番下のDeployボタンを押してください。これでサービスがサーバーに登録されました。
◆クライアント側のソース
HelloWorldSOAPClient.java(ここからダウンロード)
import java.net.URL;
import org.apache.soap.Constants;
import org.apache.soap.rpc.*;

public class HelloWorldSOAPClient {
  public static void main(String[] args) {
    try {
      URL url = new URL("http://localhost:8080/soap/servlet/rpcrouter");
      // Callオブジェクトを生成
      Call call = new Call();
      // ターゲットとなるURIを指定
      call.setTargetObjectURI("urn:HelloWorldSOAP");
      // ターゲットとなるメソッドを指定
      call.setMethodName("sayHelloWorld");
      // 直列化のスタイルを指定
      call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
      // 呼び出しを実行
      Response resp = call.invoke(url, "");
      // 戻り値を取得
      Parameter ret = resp.getReturnValue();
      System.out.println(ret.getValue());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
 
◆クライアントプログラムのコンパイルと実行
さっそくコンパイルして実行してみましょう!
コマンドプロンプト

C:\JavaHello\SOAP>javac HelloWorldSOAPClient.java

C:\JavaHello\SOAP>java HelloWorldSOAPClient
Hello World

C:\JavaHello\SOAP>

おおおお!!表示されましたね!
 
◆TCP トンネル/モニタ を使用して送受信したデータを見てみよう!
Apache SOAPにはデバック用にTCP トンネル/モニタが付いています。これを使用すると、送信したデータと受信したデータが見れます。
■クライアントコードの変更
まず、クライアントコードのURLのポートの指定を適当な値に変更します。ここでは、8001にしました。
HelloWorldSOAPClient.java
import java.net.URL;
import org.apache.soap.Constants;
import org.apache.soap.rpc.*;

public class HelloWorldSOAPClient {
  public static void main(String[] args) {
    try {
      URL url = new URL("http://localhost:8001/soap/servlet/rpcrouter");
      // Callオブジェクトを生成
      Call call = new Call();
      // ターゲットとなるURIを指定
      call.setTargetObjectURI("urn:HelloWorldSOAP");
      // ターゲットとなるメソッドを指定
      call.setMethodName("sayHelloWorld");
      // 直列化のスタイルを指定
      call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
      // 呼び出しを実行
      Response resp = call.invoke(url, "");
      // 戻り値を取得
      Parameter ret = resp.getReturnValue();
      System.out.println(ret.getValue());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
 
■TCP トンネル/モニタ の起動
起動方法は以下のようになります。
java org.apache.soap.util.net.TcpTunnelGui listenport tunnelhost tunnelport
実行してみましょう。
コマンドプロンプト

C:\JavaHello\SOAP>java org.apache.soap.util.net.TcpTunnelGui 8001 localhost 8080

起動されると、以下のようなウインドウが現れます。
■クライアントコードのコンパイルと実行
コマンドプロンプト

C:\JavaHello\SOAP>javac HelloWorldSOAPClient.java

C:\JavaHello\SOAP>java HelloWorldSOAPClient
Hello World

C:\JavaHello\SOAP>

■TCP トンネル/モニタ 画面の確認
クライアントプログラムを実行すると、TCP トンネル/モニタ にはサーバーに送信したデータとサーバーから受信したデータが表示されます。おおおお!
◆送信したデータ
送信データ
POST /soap/servlet/rpcrouter HTTP/1.0
Host: localhost:8001
Content-Type: text/xml; charset=utf-8
Content-Length: 417
SOAPAction: ""

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:sayHelloWorld xmlns:ns1="urn:HelloWorldSOAP" 
                 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
</ns1:sayHelloWorld>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope> 
(一行で表示できないので改行してある部分があります)
黒い字の部分・・・HTTPヘッダー
青い字の部分・・・SOAPメッセージ(XML)
◆受信したデータ
受信データ
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=488A7B2DDBF2EC829C8A9690AA2FC5B6; Path=/soap
Content-Type: text/xml; charset=utf-8
Content-Length: 487
Date: Sun, 01 Dec 2002 10:18:19 GMT
Server: Apache Coyote/1.0
Connection: close

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:sayHelloWorldResponse xmlns:ns1="urn:HelloWorldSOAP" 
           SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="xsd:string">Hello World</return>
</ns1:sayHelloWorldResponse>

</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
(一行で表示できないので改行してある部分があります)
黒い字の部分・・・HTTPヘッダー
青い字の部分・・・SOAPメッセージ(XML)
 
(参考文献)
Apache SOAP v2.3.1 ドキュメント
■書籍
Java関連の書籍

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME