Webサービス II (第1回)

Webサービス (第1回)
2007年9月26日
「WebサービスII」の内容


第2世代のWebサービス
Java SE 6 の標準
アノテーションの利用
アプリケーションサーバ Glassfish
EoD(Ease of Development)
移行期のため今年度3年前期の「応用
Java」と内容の一部が重複(JAXB)
本講義のキーワード




Webサービスの新しい流れ
JAXB, JAX-WS 2.0へ
Java SE 6 での位置付け
xjc, schemagen, wsgen,wsimport
Webサービスとアノテーション
EoD( Ease of Development )
SOA( Service Oriented Architecture )
新しいWebサービスの実現



JAX-WS 2.0 の API
(JAX-RPC の後継、JAX-RPC 2.0 が改称)
JAXB(Java Architecture for XML
Binding ) に基づいて実現
アノテーションの活用
W3C XML Schema  Java のクラス定義
Java自体の新しい流れ



JDK 1.4 から J2SDK 5.0へ
新しい言語仕様の拡張
Generics, 列挙型の導入=>アノテーションの
実現
J2SDK 5.0 から Java SE 6 へ
アノテーションによる EoD の本格的導入
JAXB, JAX-WS は Java SE 6 の標準に
この時間の目標




Java SE 6 のXML関連のパッケージ(復習)
JAXBとは?
ツール xjc
XML Schema から Javaのクラスを自動生成
XMLの文書 Javaのインスタンス
J2SE 1.4以降のAPI




javax.xml.parsers
org.xml.sax
org.w3c.dom
javax.xml.transform
javax.xml.transform.stream
javax.xml.transform.sax
Javax.xml.transform.dom
J2SE 5.0 の追加パッケージ





javax.xml
javax.xml.datatype
javax.xml.namespace
javax.xml.validation
javax.xml.xpath
Java SE 6 で追加(1) -- JAXB

javax.xml.bind
javax.xml.bind.annotation
javax.xml.bind.annotation.adapters
javax.xml.bind.attachment
javax.xml.bind.helpers
javax.xml.bind.util
Java SE 6 で追加(2) – 電子署名

javax.xml.crypto
javax.xml.crypto.dom
javax.xml.crypto.dsig
javax.xml.crypto.dsig.dom
javax.xml.crypto.dsig.keyinfo
javax.xml.crypto.dsig.spec
Java SE 6 で追加(3) – 入出力


javax.xml.soap
javax.xml.stream
javax.xml.stream.events
javax.xml.stream.util
Java SE 6 で追加(4) – Webサービス


javax.xml.ws
javax.xml.ws.handler
javax.xml.ws.handler.soap
javax.xml.ws.http
javax.xml.ws.soap
javax.xml.ws.spi
javax.jws
javax.jws.soap
本講義では Java SE 6が必須


2F実習室 Linux または Windows 環境
自分のマシンの場合は Java SE 6 をイン
ストール
JAXB




JAXB(Java architecture for XML Binding)
Java と XML とのマッピングを提供
新しい Webサービスを支える基礎技術
アノテーションをフルに活用
Java と XML(1)
Java のクラスとインスタンス
public class Name {
String first;
String last;
}
--------------------------------------------------Name name = new Name();
name.first=“Tatsuo”; name.last=“Ueda”;

Java と XML(2)

XMLのドキュメント
<nama>
<first>Tatsuo</fist>
<last>Ueda</last>
</name>
要素<name> -- インスタンス name
要素<first>,<last> -- フィールドに対応
Java と XML(3)



インスタンスは個々の XML文書に対応
クラスの定義は?
XML文書の定義はスキーマ言語
DTD(Document Type Definition)
XML Schema
W3C XML Schema
RELAX NG
Schematron
W3C XML Schema の特徴






優れた表現力
厳密な定義
豊富なデータ型
名前空間の利用
それ自身がXMLである!
事実上の標準規格
XML Schema の例(1)
<xsd:schema xmlns:xsd
="http://www.w3.org/2001/XMLSchema">
<xsd:element name="name" type="nameType"/>
<xsd:complexType name="nameType">
<xsd:sequence>
<xsd:element name="first" type="xsd:string"/>
<xsd:element name="last" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Java との比較(1)


String first;
public String getFirst() { returen first; }
public void setFirst( String s ) { first = s; }
<xsd:element name="first"
type="xsd:string"/>
Java との比較(2)


public class name { … }
<xsd:element
name="name“ type="nameType"/>
<xsd:complexType name="nameType">
:
String first; String last;
<xsd:sequence>
<xsd:element name="first" type="xsd:string"/>
<xsd:element name="last" type="xsd:string"/>
</xsd:sequence>
XML Schema の例(2)
<xsd:complexType name="peopleType">
<xsd:sequence>
<xsd:element name="name"
type="nameType" minOccurs="1"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
対応のまとめ




Java言語 < -- > W3C XML Schema
Java のクラス < -- > スキーマ定義ファイ
ル
Java のインスタンス < -- > XML文書
Java のプロパティ < -- > XMLの要素
新しい ツール xjc (1)


xjc ( XML to Java compiler )
W3C XML Schema 定義ファイルを
Java のクラス定義に
xjc name.xsd
元のスキーマファイル
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="name" type="Name"/>
<xsd:complexType name="Name">
<xsd:sequence>
<xsd:element name="first" type="xsd:string"/>
<xsd:element name="last" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
自動生成された Name.java(1)
package generated;
import
import
import
import
javax.xml.bind.annotation.XmlAccessType;
javax.xml.bind.annotation.XmlAccessorType;
javax.xml.bind.annotation.XmlElement;
javax.xml.bind.annotation.XmlType;
自動生成された Name.java(2)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType( name = "Name",
propOrder ={ "first", "last" } )
public class Name {
:
:
自動生成された Name.java(3)

「プロパティ」とフィールド
@XmlElement(required = true)
protected String first;
@XmlElement(required = true)
protected String last;
自動生成された Name.java(4)

getter と setter も生成
public String getFirst() {
return first;
}
public void setFirst( String value) {
this.first = value;
}
XML文書から Javaインスタンス
<name>
<first>Tatsuo</first>
<last>Ueda</last>
</name>
XML文書から Javaインスタンス
import javax.xml.bind.*;
import generated.*;
:
:
JAXBContext jc =
JAXBContext.newInstance( "generated" );
XML文書から Javaインスタンス
Unmarshaller u =
jc.createUnmarshaller(); JAXBElement
element =
(JAXBElement)u.unmarshal(
new FileInputStream( "name.xml" ) );
Name name =
(Name)element.getValue();
XML文書から Javaインスタンス
String first = name.getFirst();
String last = name.getLast();
System.out.println( first + " " + last );
JavaインスタンスからXML文書
Name name = new Name();
String first = "Fujio";
String last = "Maruyama";
name.setFirst( first );
name.setLast( last );
JavaインスタンスからXML文書
JAXBElement element =new JAXBElement(
new QName( "name" ),
Name.class, name );
Marshaller m = jc.createMarshaller();
m.setProperty(
Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE );