第13回 2007年7月20日 応用Java (Java/XML)
前回までやったこと 「XMLパーサ」-- Java でXMLを処理 javax.xml.stream パッケージのパーサ SAX(Simple API for XML) のパーサ DOM(Document Object Model)のパーサ パーサの応用 : 検索,フィルタ的な処理 、視覚化 パーサの上位のサービス XPath , XSLT スキーマ言語と妥当性の検証 JAXB( Javaとスキーマとの変換)
後半の内容の予定 XPath (6/15) XSLT (6/22) 名前空間(Namespace) (6/22) XML文書の妥当性の検証(6/29) XML Schema JAXB (7/6, 7/13) SOAP, Webサービ(7/20) 試験(7/27)
本日(7/20)の講義内容 SOAPメッセージ javax.xml.soap パッケージ SOAPとWebサービス SOAPとWSDL (Web Service Definition Language)
その前に前回の実習の補足 ツール schemagen schemagen persen/*.java サンプルでは person.Person.java , person.Name.java
パッケージ(package) package person; package jp.ac.wakhok.tatsuo; クラスを分類する仕組み 階層を持つ「住所」のようなもの Name
前回までの課題でも 複数の Name クラスが登場 . --+-- Name.java (パッケージなし) | +-- person --+-- Name.java( パッケージあり) 混乱なく区別するために(パッケージ名から) Name name = new Name(); person.Name name = new person.Name();
パッケージなしの場合 常にカレントディレクトリ(.) でOK vi Name.java javac Name.java java Name
パッケージありの場合 パッケージ=ディレクトリを意識 cd person vi Name.java cd .. javac person/Name.java java person.Name
クラスパス(CLASSPATH) パッケージ=ディレクトリをたどるスタート地点を指定 通常はカレント ( . ) が基本 通常はカレント ( . ) が基本 複数の場所を指定も可能 CLASSPATH=.:/usr/java/lib:../.. (Windows では区切り文字は ; になる)
XML技術の階層構造 パーサ(最下層の字句解析) SAX, DOM javax.xml.stream 一般的なXML処理 検索(XPath)、変換(XSLT), JAXB スキーマ言語( W3C XML Schema) メッセージの交換(SOAP) Webサービスなど
SOAPとは? XMLの形式でメッセージを交換 中立なデータ形式(事実上の標準) システム、言語、アプリケーション非依存 http://www.w3.org/2000/xp/Group/ メッセージが「構造」を持つ データ構造の定義は XML Schema で 処理の呼び出しも表現(JAX-RPC)
そもそも SOAP とは何の略? SOAP(Simple Object Access Protocol) 登場当時の認識 現在では広範囲の応用範囲を支える基礎技術 「SOAP は SOAP」
SOAP のメッセージの構造 <SOAP-ENV:Envelope xmlns:SOAP-ENV= “ http://schemas.xmlsoap.org/soap/envelope/”> <SOAP-ENV:Header> </SOAP-ENV:Header> <SOAP-ENV:Body> <mymessage> Hello </mymessage> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
SOAPメッセージの例(Google) <SOAP-ENV:Envelope xmlns:SOA-ENV ="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch“ SOAP-ENV:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <key xsi:type="xsd:string"> 8NfcnBhQFHL4QZbU3pX21B7NVhVZ+R+a</key> <q xsi:type="xsd:string">Tatsuo Ueda</q>
Webサービスでの例(1) Google Web Service の定義(WSDL)から <message name="doSpellingSuggestion"> <part name="key" type="xsd:string"/> <part name="phrase“ type="xsd:string"/> </message> メソッドの呼び出しを表現
Webサービスでの例(2) <message name="doSpellingSuggestionResponse"> <part name="return“ type="xsd:string"/> </message> メソッドの返り値を表現
Javaに「翻訳する」と <operation name="doSpellingSuggestion"> <input message="typens:doSpellingSuggestion"/> <output message="typens:doSpellingSuggestionResponse"/> </operation> xsd:string -> Java の Stringクラス String result = doSpellingSuggestion( String key, String phrase );
Javaに「翻訳する」と(2) 複雑な型は Schema で定義可能 (Javaのクラスに対応) <xsd:complexType name="ResultElement"> <xsd:all> <xsd:element name="URL“ type="xsd:string"/> <xsd:element name="title" type="xsd:string"/> : </xsd:all> </xsd:complexType>
Java SE 6 : javax.xml.soap SOAPMessage クラス SOAPのメッセージを表す(送受信とも) getSOAPHeader(), getSOAPBody(), addAttachment(), getAttachment() など、メッセージ操作のメソッド群 SOAPConnection クラス 通信を実行 call() メソッド SOAPMessage response = sc.call( SOAPMessage request, Object url );
Java SE 6 : javax.xml.soap SOAPMessage, SOAPConnection いずれもFactoryのパターンで利用 MessageFactory mf = MessageFactory.newInstance(); SOAPMessage request = mf.createMessage( new MimeHeaders(), new FileInputStream( source ) ); SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance() SOAPConnection connection = scf.createConnection();
試験(7/27)について 簡単なオンラインの試験(実習室、LMS) 登場した用語とその意味(用途、存在理由) 「パーサ」「XPath」「XSLT」「SOAP」 「スキーマ言語」「妥当性」 Javaの処理とパッケージ javax.xml.stream, javax.xml.stream.events javax.xml.binding, javax.xml.namespace どんな用途で、どんなクラスがあったか? 試験+13回の課題提出で評価