Interstage Application Server SOAPサービス ユーザーズガイド
目次 索引 前ページ次ページ

第4章 Messaging方式のアプリケーションの実装> 4.3 送信アプリケーションの作成

4.3.3 XMLデータを取り込んで使用する送信アプリケーション

 SOAPメッセージのSOAPエンベロープを作成するには、SAAJ-APIのcreateNameメソッドやaddBodyElementメソッドなどのAPIを使用してSOAPEnvelopeオブジェクトをアプリケーションロジックで組み立てる方法のほか、DOMやSAXなどのXMLデータ、および既存のファイルから読み込んだXMLデータをSOAPエンベロープの内容として取り込む方法があります。

 以下にサンプルプログラムSampleMsgCL3importXML.javaを例に用いて処理を説明します。

 import org.w3c.dom.*;
 import javax.xml.parsers.*;
 import javax.xml.soap.*;
 import java.net.URL;
 import java.io.*;
 import javax.xml.transform.Source;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamSource;

 public class SampleMsgCL3importXML
 {
  //**(1)**
  private static Source createStreamSource() throws java.io.FileNotFoundException
  {
   FileInputStream _reqMsg = new FileInputStream("send.txt");
   StreamSource _ss = new StreamSource(_reqMsg);
   return _ss;
  }

  //**(2)**
  private static Source createDOMSource() throws ParserConfigurationException
  {
   DocumentBuilderFactory _dbf = DocumentBuilderFactory.newInstance();
   _dbf.setNamespaceAware(true);
   _dbf.setValidating(false);
   DocumentBuilder _db = _dbf.newDocumentBuilder();
   Document _doc = _db.newDocument();

   Element _elm1 = _doc.createElementNS( "urn:SampleMsg", "m:RequestBody" );
   Element _elm2 = _doc.createElement("Request");
   org.w3c.dom.Text _txt = _doc.createTextNode("request string...");
   _elm2.appendChild(_txt);
   _elm1.appendChild(_elm2);
   _doc.appendChild(_elm1);

   Document _envDoc = _db.newDocument();
   Element _envElm = _envDoc.createElementNS(
         SOAPConstants.URI_NS_SOAP_ENVELOPE, "soapenv:Envelope" );
   Element _bodyElm = _envDoc.createElementNS(
         SOAPConstants.URI_NS_SOAP_ENVELOPE, "soapenv:Body" );
   org.w3c.dom.Node _envNode =
         _envDoc.importNode( _doc.getDocumentElement(), true );
   _bodyElm.appendChild(_envNode);
   _envElm.appendChild(_bodyElm);
   _envDoc.appendChild(_envElm);
   Element _envRootElm = _envDoc.getDocumentElement();

   DOMSource _ds = new DOMSource(_envRootElm.getOwnerDocument());
   return _ds;
  }

  public static void main( String[] args )
  {
   try{
    if( args.length < 1 ) usage();
    int _mode = 0;
    if( args[0].equals("DOM")) _mode = 1;
    else if( args[0].equals("Stream")) _mode = 2;
    else _mode = 3;
    if( _mode > 2 ) usage();

    String endPoint = new String("http://localhost/issoapx/services/Sample1");

    SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
    SOAPConnection conn = scf.createConnection();
    MessageFactory mf = MessageFactory.newInstance();
    SOAPMessage msg = mf.createMessage();
    SOAPPart part = msg.getSOAPPart();

    Source _source = null;
    switch(_mode) {
     case 1 :
      _source = createDOMSource();
      break;
     case 2 :
      _source = createStreamSource();
      break;
    }

    //**(3)**
    part.setContent(_source);

    msg.saveChanges();
    SOAPMessage reply = conn.call( msg, endPoint );

    SOAPPart _respPart = reply.getSOAPPart();
    //**(4)**
    _source = _respPart.getContent();
    if( _source instanceof StreamSource ){
     InputStream _is = ((StreamSource)_source).getInputStream();
     byte[] _ba = new byte[_is.available()];
     _is.read(_ba);
     FileOutputStream _replyMsg = new FileOutputStream("reply.txt");
     _replyMsg.write(_ba);
     _replyMsg.close();
    }
    conn.close();
   } catch( SOAPException e ) {
    System.out.println("SOAPException raised.");
    System.out.println(" Message:"+e.getMessage());
    System.out.println(" Cause :"+e.getCause());
    e.printStackTrace();
   } catch( Throwable t ) {
    t.printStackTrace();
   }
  }

  private static void usage()
  {
   System.out.println("usage:>java SampleMsgCL3 [DOM|Stream]");
   System.exit(1);
  }
 }

■XMLデータを使用したSOAPメッセージの組み立て

 サンプルプログラムSampleMsgCL3importXML.javaでは、DOMオブジェクトを使用する方法と、既存のXMLファイルから読み込んだデータを元にSOAPメッセージを組み立てる方法を用いています。

■XMLファイルから読み込んだデータを使用したSOAPメッセージの組み立て

 ファイルから読み込んだXMLデータなどのjava.io.InputStreamオブジェクトが入力元となるXMLデータを使用してSOAPメッセージを作成する場合はjavax.xml.transform.stream.StreamSourceオブジェクトを使用します。
 javax.xml.transform.stream.StreamSourceクラスは、javax.xml.transform.Sourceインタフェースを実装するクラスです。サンプルプログラムSampleMsgCL3importXML.javaでは、"send.txt"というファイルの内容を元にjavax.xml.transform.stream.StreamSourceオブジェクトを生成しています。−(1)

■DOMオブジェクトを使用したSOAPメッセージの組み立て

 DOM-APIを使用して組み立てられたDOMオブジェクトを使用してSOAPメッセージを作成する場合はjavax.xml.transform.dom.DOMSourceオブジェクトを使用します。
 javax.xml.transform.dom.DOMSourceクラスはjavax.xml.transform.Sourceインタフェースを実装するクラスです。サンプルプログラムSampleMsgCL3importXML.javaでは、DOM-APIを使用して以下に示すSOAPメッセージを組み立て、そのDOMオブジェクトからjavax.xml.transform.dom.DOMSourceオブジェクトを生成しています。−(2)

 <soapenv:Envelope xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/
          xmlns:xsd=http://www.w3.org/2001/XMLSchema
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
   <m:RequestBody xmlns:m="urn:SampleMsg">
    <Response>request string...</Response>
   </m:RequestBody>
  </soapenv:Body>
 </soapenv:Envelope>

■XMLデータのSOAPメッセージへの設定・取得

 ファイルから読み込んだXMLデータやDOMオブジェクトを使用したXMLオブジェクトを使用して生成されたjavax.xml.transform.SourceオブジェクトはSOAPPart.setContentメソッドを使用することでSOAPメッセージに設定することができます。−(3)

 また同様に受信したSOAPメッセージを表すSOAPMessageオブジェクトからSOAPPart.getContentメソッドを使用して受信したデータをjavax.xml.transform.Sourceオブジェクトとして取得することができます。−(4)


目次 索引 前ページ次ページ

Copyright 2003 FUJITSU LIMITED