WebLogic XML プログラマーズ ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

WebLogic Server を使用した XML アプリケーションの開発

以降の節では、Java プログラミング言語と WebLogic Server を使用して XML アプリケーションを開発する方法について説明します。ここでは、Java サーブレットと Java Server Pages (JSP) を使用して Java アプリケーションを記述する方法について理解していることを前提にしています。サーブレットと JSP アプリケーションの記述方法については、『WebLogic Server Web アプリケーション、サーブレット、JSP の開発』を参照してください。

 


XML アプリケーションの開発 : 主な手順

WebLogic Server XML サブシステムを使用して XML アプリケーションを開発する場合、通常は以下のプログラミング タスクの一部または全部を実行します。

  1. XML ドキュメントを解析します。
  2. XML ドキュメントは、いくつものソースから生じる可能性があります。たとえば、クライアントからの XML ドキュメントを受信するためにサーブレットを開発したり、サーブレットまたはその他の EJB などからの XML ドキュメントを受信するために EJB を記述したりする必要が生じるでしょう。それぞれのインスタンスでは、XML ドキュメントを解析してデータを操作できるようにすることが必要な場合もあります。

    このタスクの詳細については、「XML ドキュメントの解析」を参照してください。

  3. 新しい XML ドキュメントを生成します。
  4. サーブレットまたは EJB が XML ドキュメントを受信および解析し、何らかの形でデータを操作したら、サーブレットまたは EJB は、新しい XML ドキュメントを生成してクライアントに返すか、他の EJB に渡さなければならないことがあります。

    このタスクの詳細については、「新しい XML ドキュメントの生成」を参照してください。

  5. XML データを他の形式に変換します。
  6. XML ドキュメントを解析するか、新しい XML ドキュメントを生成したら、サーブレットまたは EJB は、その XML を HTML、WML、またはプレーン テキストなどの形式に変換しなければならないことがあります。

    このタスクの詳細については、「JAXP による XML データの変換」を参照してください。

 


XML ドキュメントの解析

この節では、JAXP により DOM モードと SAX モードで XML ドキュメントを解析する方法、およびサーブレットから XML ドキュメントを解析する方法について説明します。

注意 : Streaming API for XML (StAX) を使用した XML ドキュメントの解析方法の詳細については、「Streaming API for XML (StAX) の使い方」を参照してください。

Administration Console の XML レジストリを使用して以下の項目をコンフィグレーションします。

Administration Console でこれらのタスクを実行する方法については、「WebLogic Server XML の管理」を参照してください。

SAX モードで JAXP を使用した XML ドキュメントの解析

次のサンプル コードは、SAX パーサ ファクトリをコンフィグレーションして検証パーサを作成する方法を示したものです。また、MyHandler クラスをパーサに登録する方法も示しています。MyHandler クラスは、SAX 解析イベントまたはエラーのカスタム動作を提供するために DefaultHandler クラスの任意のメソッドをオーバーライドできます。

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
...
MyHandler handler = new MyHandler();
// MyHandler は org.xml.sax.helpers.DefaultHandler を拡張する
  // SAXParserFactory のインスタンスを取得する
  SAXParserFactory spf = SAXParserFactory.newInstance();
  // 検証パーサを指定する
  spf.setValidating(true); // DTD をロードする必要がある
  // ファクトリから SAX パーサのインスタンスを取得する
  SAXParser sp = spf.newSAXParser();
  // ドキュメントを解析する
  sp.parse("http://server/file.xml", handler);
...
注意 : デフォルト パーサ以外のパーサを使用する場合は、WebLogic Server Administration Console を使用して XML レジストリでパーサを指定します。指定しなかった場合、SaxParserFactory.newInstance メソッドはデフォルト パーサを返します。デフォルト パーサ以外のパーサを使用する WebLogic Server のコンフィグレーション手順については、「デフォルト以外のパーサまたはトランスフォーマのコンフィグレーション」を参照してください。

DOM モードで JAXP を使用した XML ドキュメントの解析

次のサンプル コードでは、XML ドキュメントを解析し、DocumentBuilder オブジェクトから org.w3c.dom.Document ツリーを作成する方法を示します。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
...
// DocumentBuilderFactory のインスタンスを取得する
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
// 検証パーサを指定する
dbf.setValidating(true); // DTD をロードする必要がある
// DocumentBuilder のインスタンスをファクトリから取得する
DocumentBuilder db = dbf.newDocumentBuilder();
// ドキュメントを解析する
Document doc = db.parse(inputFile);
...
注意 : デフォルト パーサ以外のパーサを使用する場合は、WebLogic Server Administration Console でパーサを指定します。指定しなかった場合、DocumentBuilderFactory.newInstance メソッドはデフォルト パーサを返します。デフォルト パーサ以外のパーサを使用する WebLogic Server のコンフィグレーション手順については、「デフォルト以外のパーサまたはトランスフォーマのコンフィグレーション」を参照してください。

サーブレットでの XML ドキュメントの解析

Java サーブレット仕様バージョン 2.2 で、setAttribute メソッドと getAttribute メソッドのサポートが追加されました。属性は、リクエストに関連付けられたオブジェクトです。リクエスト オブジェクトは、クライアント リクエストからの全情報をカプセル化します。HTTP プロトコルでは、この情報は、リクエストの HTTP ヘッダとメッセージ本文を基にクライアントからサーバに転送されます。

WebLogic Server では、setAttribute メソッドと getAttribute メソッドを使用して XML ドキュメントを解析できます。「org.xml.sax.DefaultHandler 属性を使用したドキュメントの解析」および「org.w3c.dom.Document 属性を使用したドキュメントの解析」の説明に従って、SAX モードの検証では setAttribute メソッド、DOM モードの検証では getAttribute メソッドを使用します。

ただし、setAttribute メソッドおよび getAttribute メソッドを使用できるようにするには、デフォルトですべての WebLogic Server インスタンスにデプロイされている weblogic.servlet.XMLParsingHelper という WebLogic Server サーブレット フィルタを Web アプリケーションの一部としてコンフィグレーションする必要があります。Web アプリケーションの WEB-INF ディレクトリにある web.xml デプロイメント記述子に次の要素を追加してサーブレット フィルタをコンフィグレーションします。

<filter>
<filter-name>XMLParsingHelper</filter-name>
<filter-class>weblogic.servlet.XMLParsingHelper</filter-class>
</filter>
<filter-mapping>
<filter-name>XMLParsingHelper</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

サーブレット フィルタの詳細については、「フィルタ」を参照してください。

org.xml.sax.DefaultHandler 属性を使用したドキュメントの解析

次のサンプル コードでは、setAttribute メソッドの使い方を示します。

import weblogic.servlet.XMLProcessingException;
import org.xml.sax.helpers.DefaultHandler;
...
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try {
request.setAttribute("org.xml.sax.helpers.DefaultHandler",
new DefaultHandler());
} catch(XMLProcessingException xpe) {
System.out.println("Error in processing XML");
xpe.printStackTrace();
return;
}
...

また、現在は非推奨となっていますが、org.xml.sax.HandlerBase 属性を使用して XML ドキュメントを解析することもできます。

request.setAttribute("org.xml.sax.HandlerBase", 
new HandlerBase());
注意 : このサンプル コードは、SAX と setAttribute メソッドでドキュメントを解析する単純な方法を示したものです。ドキュメントを解析するこのメソッドは、他のサーブレット ベンダではサポートされていない WebLogic Server の便利な機能です。したがって、アプリケーションを他のサーブレット プラットフォームで実行する場合は、この機能を使用しないでください。

org.w3c.dom.Document 属性を使用したドキュメントの解析

次のサンプル コードでは、getAttribute メソッドの使い方を示します。

import org.w3c.dom.Document;
import weblogic.servlet.XMLProcessingException;
...
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try {
Document doc = request.getAttribute("org.w3c.dom.Document");
} catch(XMLProcessingException xpe) {
System.out.println("Error in processing XML");
xpe.printStackTrace();
return;
}
...
注意 : このサンプル コードは、DOM と getAttribute メソッドでドキュメントを解析する単純な方法を示したものです。ドキュメントを解析するこのメソッドは、他のサーブレット ベンダではサポートされていない WebLogic Server の便利な機能です。したがって、アプリケーションを他のサーブレット プラットフォームで実行する場合は、この機能を使用しないでください。

検証パーサと非検証パーサ

前述のとおり、整形式ドキュメントとは、W3C の XML 1.0 勧告のルールに従っている、構文的に正しいドキュメントのことです。有効なドキュメントとは、DTD またはスキーマで指定した制約に従っているドキュメントです。

非検証パーサは、ドキュメントが整形式かどうかを検証しますが、有効かどうかは検証しません。(検証パーサの使用を前提に) ドキュメント解析時の検証を有効にするには、以下を実行する必要があります。

XML ドキュメント解析時のエンティティ解決の処理

この節では、XML パーサによる外部エンティティの識別および解決方法、および XML アプリケーションによる外部エンティティ解決のパフォーマンスを向上させる WebLogic Server の機能など、外部エンティティに関する一般的な情報について説明します。

外部エンティティに関する一般的な情報

外部エンティティは、XML ドキュメント内に記述されていないものの、XML ドキュメント内で参照されるさまざまなテキストです。実際のテキストは、同じコンピュータの他のファイル、Web 上など、どこにあってもかまいません。パーサは、ドキュメントの解析時に外部エンティティ参照に出会うと、参照されたテキストをフェッチし、テキストを XML ドキュメント内に配置してから、解析を続行します。外部エンティティの例が DTD です。XML ドキュメント内に DTD のテキストがすべて記述されているのではなく、別のファイルに格納されている DTD への参照が XML ドキュメント内にあります。

外部エンティティの識別方法には、システム ID とパブリック ID の 2 つがあります。システム ID は、URI で指定された位置を基に外部エンティティを参照します。パブリック ID は、外部で宣言されている名前を使用して情報を参照します。

次の例では、パブリック ID を使用して、J2EE アプリケーション アーカイブ (*.ear) を示す application.xml ファイルの DTD を参照する方法を示します。

<!DOCTYPE application PUBLIC "-//Sun Microsystems, 
Inc.//DTD J2EE Application 1.2//EN">

次の例は、システム ID のみによる外部 DTD の参照を示します。

<!DOCTYPE application SYSTEM "http://java.sun.com/j2ee/dtds/application_1_2.dtd">

次の例は、パブリック ID およびシステム ID の両方を使用する参照です。SYSTEM キーワードが省略されています。

<!DOCTYPE application 
PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN"
"http://java.sun.com/j2ee/dtds/application_1_2.dtd">

WebLogic Server のエンティティ解決機能の使用

以下の WebLogic Server 機能を使用すると、XML アプリケーションの外部エンティティ解決のパフォーマンスを向上させることができます。

XML レジストリで、外部エンティティの場所 (ローカルまたは URL)、およびどのキャッシュ オプションが Web 上のエンティティ用かを識別するエンティティ解決エントリを作成します。システム ID またはパブリック ID を使用して外部エンティティ エントリを識別します。次に、XML ドキュメントで、この外部エンティティを参照すると、WebLogic Server は、ドキュメントの解析時にローカル コピーまたはキャッシュされたコピー (コンフィグレーションによる) を取り出します。

XML レジストリでの外部エンティティ レジストリ作成の詳細については、「外部エンティティのコンフィグレーション タスク」を参照してください。

デフォルト パーサ以外のパーサの使用

JAXP で XML ドキュメントを解析する場合、WebLogic Server XML レジストリ (Administration Console でコンフィグレーション) には以下の選択肢があります。

XML レジストリで解析オプションをコンフィグレーションする手順については、「XML パーサおよびトランスフォーマのコンフィグレーション タスク」を参照してください。

 


新しい XML ドキュメントの生成

この節では、DOM ドキュメント ツリーから JSP を使用して XML ドキュメントを生成する方法について説明します。

注意 : Streaming API for XML (StAX) を使用した XML ドキュメントの解析方法の詳細については、「Streaming API for XML (StAX) の使い方」を参照してください。

DOM ドキュメント ツリーからの XML の生成

サンプル コードの次のセグメントで示すように、javax.xml.transform.Transformer クラスを使用して、DOM オブジェクトを XML ストリームにシリアライズできます。

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
...
TransformerFactory trans_factory = TransformerFactory.newInstance();
Transformer xml_out = trans_factory.newTransformer();
Properties props = new Properties();
props.put(“method”, “xml”);
xml_out.setOutputProperties(props);
xml_out.transform(new DOMSource(doc), new StreamResult(System.out));

この例では、Transformer.transform() メソッドが DOM オブジェクトを XML ストリームに変換します。transform() メソッドは、doc 変数に格納されている DOM ツリーから作成された javax.xml.transform.dom.DOMSource オブジェクトを入力としてとり、それを javax.xml.transform.stream.StreamResult オブジェクトに変換して、結果として得られる XML ドキュメントを標準出力に書き出します。

JSP での XML ドキュメントの生成

通常、JSP は HTML の生成に使用しますが、JSP を使用して XML ドキュメントを生成することもできます。

JSP による XML の生成には、以下のように JSP ページのコンテンツ タイプを設定する必要があります。

<%@ page contentType="text/xml"%>
... XML document

次のコードでは、JSP による XML ドキュメントの生成例を示します。

<?xml version="1.0">
<%@ page contentType="text/xml" import="java.text.DateFormat,java.util.Date" %>
<message>
<text>
Hello World.
</text>
<timestamp>
<%
out.print(DateFormat.getDateInstance().format(new Date()));
%>
</timestamp>
</message>

JSP による XML の生成の詳細については、http://java.sun.com/products/jsp/html/JSPXML.html を参照してください。

 


XML ドキュメントの変換

変換とは、XML ドキュメント (変換元) を他の形式 (変換結果) に変換することです。通常は、別の XML ドキュメント、HTML、無線用マークアップ言語 (Wireless Markup Language : WML) などに変換されます。この節では、JAXP を使用して、および JSP 内から JSP タグを使用して XML ドキュメントを変換する方法について説明します。

JAXP による XML データの変換

バージョン 1.2 の JAXP では、プラグイン可能の変換が提供されています。つまり、JAXP 準拠の任意のトランスフォーマ エンジンを使用できます。

JAXP は、XML データをさまざまな形式に変換するために以下のインタフェースを提供します。

変換には、入力と出力の多くの組み合わせがあります。

JAXP による XML ドキュメント変換の例

抜粋した次のサンプル コードでは、JAXP を使用して myXMLdoc.xml を、mystylesheet.xsl スタイルシートを使用する別の XML ドキュメントに変換する方法を示します。

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
Transformer trans;
TransformerFactory factory = TransformerFactory.newInstance();
String stylesheet = “file://stylesheets/mystylesheet.xsl”;
String xml_doc = “file://xml_docs/myXMLdoc.xml”;

trans = factory.newTransformer(new StreamSource(stylesheet));
trans.transform(new StreamSource(xml_doc),
new StreamResult(System.out));

DOM ドキュメントを XML ストリームに変換する方法の例については、「JAXP による XML データの変換」を参照してください。

JSP タグによる XML データの変換

WebLogic Server では、JSP 内から XSLT トランスフォーマに簡単にアクセスするための小規模な JSP タグ ライブラリが提供されます。このタグを使用すると XML ドキュメントを HTML、WML などに変換できます。

JSP タグ ライブラリは、メイン タグの x:xslt と、x:xslt タグ内部で使用できる 2 つのサブタグ (x:stylesheet および x:xml) で構成されます。

注意 : JSP タグ ライブラリは使い勝手を良くするために用意されているだけであり、JSP 内から XSLT トランスフォーマへのアクセスに必須というわけではありません。

XSLT JSP タグ構文

XSLT JSP タグ構文は XML を基にしています。JSP タグは、開始タグ、本文 (省略可能)、対応する終了タグで構成されます。開始タグには要素名と属性 (省略可能) が含まれます。

次の構文では、WebLogic Server で提供される 3 つの XSLT JSP タグを JSP で使用する方法について示します。属性は省略可能です。また、x:stylesheet および x:xml サブタグも省略可能です。構文に続く表では、x:xslt および x:stylesheet タグの属性について示します。x:xml タグには属性はありません。

<x:xslt  [xml="uri of XML file"]
[media="media type to determine stylesheet"]
[stylesheet="uri of stylesheet"]
<x:xml>In-line XML goes here
</x:xml>
<x:stylesheet [media="media type to determine stylesheet"]
[uri="uri of stylesheet"]
</x:stylesheet>
</x:xslt>

次の表に、x:xslt タグの属性を示します。

表 3-1 x:xslt JSP タグの属性
x:xslt タグの属性
必須
データ型
説明
xml
いいえ
String
変換する XML ファイルの場所を指定する。場所は、タグが使用される Web アプリケーションのドキュメント ルートへの相対パス。
media
いいえ
String
HTML または WML など、ドキュメントの出力タイプを定義する。このタイプによって、XML ドキュメントの変換時に使用するスタイルシートが決定される。
この属性は、x:xslt タグ本文内の x:stylesheet タグで囲まれた media 属性と組み合わせて使用できる。x:xslt タグの media 属性の値は x:stylesheet タグに囲まれた media 属性の値と比較される。値が等しい場合、x:stylesheet タグの uri 属性で指定されたスタイルシートが XML ドキュメントに適用される。
注意 : 同じ x:xslt タグ内で media 属性と stylesheet 属性の両方を設定するとエラーが発生する。
stylesheet
いいえ
String
XML ドキュメントの変換に使用するスタイルシートの場所を指定する。場所は、タグが使用される Web アプリケーションのドキュメント ルートへの相対パス。
注意 : 同じ x:xslt タグ内で media 属性と stylesheet 属性の両方を設定するとエラーが発生する。

次の表に、x:stylesheet タグの属性を示します。

表 3-2 x:stylesheet JSP タグの属性
x:stylesheet タグの属性
必須
データ型
説明
media
いいえ
String
HTML または WML など、ドキュメントの出力タイプを定義する。このタイプによって、XML ドキュメントの変換時に使用するスタイルシートが決定される。
この属性は x:xslt タグに囲まれた media 属性と組み合わせて使用する。x:xslt タグの media 属性の値は x:stylesheet タグに囲まれた media 属性の値と比較される。値が等しい場合、x:stylesheet タグの uri 属性で指定されたスタイルシートが XML ドキュメントに適用される。
uri
いいえ
String
media 属性の値が、x:xslt タグに囲まれた media 属性の値と一致する場合に使用するスタイルシートの場所を指定する。場所は、タグが使用される Web アプリケーションのドキュメント ルートへの相対パス。

XSLT JSP タグの使い方

x:xslt タグは本文の有無に関わらず使用でき、属性は省略可能です。この節では、本文や 1 つまたは複数の属性を指定したかどうかによってタグの動作を決定するルールについて説明します。

x:xslt JSP タグが空タグ (本文なし) の場合、以下の説明が適用されます。

警告 : 同じ x:xslt タグ内で media 属性と stylesheet 属性の両方を設定するとエラーが発生します。

本文がある XSLT JSP タグは、<x:xml> タグまたは <x:stylesheet> タグを含んでいる場合があります。以下の説明が適用されます。

XSLT JSP タグによる XML ドキュメントの変換

XSLT JSP タグで XML ドキュメントを変換するには、以下の手順を実行します。

  1. WL_HOME\server\ext ディレクトリの xmlx.zip ファイルを開いて、xmlx-tags.jar ファイルを Web アプリケーションの /lib ディレクトリに移動します。BEA Home は、インストールされた WebLogic Server 配布キットの最上位ディレクトリです。
  2. <taglib> エントリを web.xml ファイルに追加します。次に例を示します。
  3. <taglib>
    <taglib-uri>xmlx.tld</taglib-uri>
    <taglib-location>/WEB-INF/lib/xmlx-tags.jar</taglib-location>
    </taglib>
  4. タグを使用するには、次の行を JSP ページに追加します。
  5. <%@ taglib uri="xmlx.tld" prefix="x"%>
  6. トランスフォーマをコンフィグレーションします。以下の手順では、トランスフォーマのコンフィグレーションの一般的な方法を示します。
    1. 次のコード行を入力して xslt.jsp ファイルを作成します。
    2. <%@ taglib uri="xmlx.tld" prefix="x"%><x:xslt/>
    3. 次のように、xslt.jsp ファイルを web.xml ファイルに登録します。
    4. <servlet>
      <servlet-name>myxsltinterceptor</servlet-name>
      <jsp-file>xslt.jsp</jsp-file>
      </servlet>
      <servlet-mapping>
      <servlet-name>myxsltinterceptor</servlet-name>
      <url-pattern>/xslt/*</url-pattern>
      </servlet-mapping>
    5. XML、DTD、XSL ドキュメントまたはサーブレットを Web アプリケーションに配置します。
    6. xslt プレフィックスを XML ドキュメントのパス名に追加 (たとえば、docs/fred.xmlxslt/docs/fred.xml に変更) し、ドキュメントにアクセスします。web.xml ファイルの <url-pattern> エントリによって、WebLogic Server は、XML ドキュメントに対して自動的に XSLT トランスフォーマを実行し、ドキュメントにデフォルトのスタイルシートを設定します。
    7. メディア タイプを定義するには、XML ドキュメントのメディア タイプと出力のコンテンツ タイプを指定するコードを JSP に追加します。
    8. メディア タイプを xslt タグに渡して、応答オブジェクトのコンテンツ タイプを設定します。
注意 : 他の形の XSLT JSP タグは、スタイルシートが XML ドキュメントで指定されていない場合または XML スタイルシートがインラインで生成される場合に使用されます。

JSP での XSLT JSP タグの使用例

JSP から抜粋した次のコードは、XSLT JSP タグを使用し、JSP を要求するクライアントのタイプに従って、XML を HTML または WML に変換する方法を示します。JSP は、クライアントがブラウザの場合は HTML を返し、無線デバイスの場合は WML を返します。

最初に、JSP は HttpServletRequest オブジェクトの getHeader() メソッドを使用して、JSP を要求するクライアントのタイプを判別します。次に、myMedia 変数を wml または html に適切に設定します。JSP で myMedia 変数を html に設定した場合は、content 変数に含まれる XML ドキュメントに html.xsl スタイルシートが適用されます。同様に、JSP で myMedia 変数を wml に設定した場合は、wml.xsl スタイルシートが適用されます。

<%
   String clientType = request.getHeader("User-Agent");
   // デフォルトは WML クライアント
   String myMedia = "wml";

   // クライアントが HTML ブラウザの場合
   if (clientType.indexOf("Mozilla") != -1) {
myMedia = "http"
   }
%>

<x:xslt media="<%=myMedia%>">
  <x:xml><%=content%></x:xml>
  <x:stylesheet media="html" uri="html.xsl"/>
  <x:stylesheet media="wml" uri="wml.xsl"/>
</x:xslt>

デフォルト トランスフォーマ以外のトランスフォーマの使い方

WebLogic Server の XML レジストリ (Administration Console でコンフィグレーション) では、以下の項目をコンフィグレーションします。

XML レジストリで変換オプションをコンフィグレーションする手順については、「デフォルト以外のパーサまたはトランスフォーマのコンフィグレーション」を参照してください。


ページの先頭       前  次