この章の内容は以下のとおりです。
サーブレットとJSPアプリケーションの記述方法については、『Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発』を参照してください。
WebLogic Server XMLサブシステムを使用してXMLアプリケーションを開発する場合、通常は以下のプログラミング・タスクの一部または全部を実行します。
XMLドキュメントを解析します。
XMLドキュメントは、いくつものソースから生じる可能性があります。たとえば、クライアントからのXMLドキュメントを受信するためにサーブレットを開発したり、サーブレットまたはその他のEJBなどからのXMLドキュメントを受信するためにEJBを記述したりする必要が生じるでしょう。それぞれのインスタンスでは、XMLドキュメントを解析してデータを操作できるようにすることが必要な場合もあります。
「XMLドキュメントの解析」を参照してください。
新しいXMLドキュメントを生成します。
サーブレットまたはEJBがXMLドキュメントを受信および解析し、何らかの形でデータを操作したら、サーブレットまたはEJBは、新しいXMLドキュメントを生成してクライアントに返すか、他のEJBに渡さなければならないことがあります。
「新しいXMLドキュメントの生成」を参照してください。
XMLデータを他の形式に変換します。
XMLドキュメントを解析するか、新しいXMLドキュメントを生成したら、サーブレットまたはEJBは、そのXMLをHTML、WML、またはプレーン・テキストなどの形式に変換しなければならないことがあります。
「JAXPによるXMLデータの変換」を参照してください。
この節では、JAXPによりDOMモードとSAXモードでXMLドキュメントを解析する方法、およびサーブレットからXMLドキュメントを解析する方法について説明します。
注意:
Streaming API for XML (StAX)を使用したXMLドキュメントの解析方法の詳細は、「Streaming API for XML (StAX)の使い方」を参照してください。
WebLogic Server管理コンソールのXMLレジストリを使用して次の項目を構成します。
ドキュメント・タイプごとのパーサー。指定したドキュメント・タイプのデフォルト・パーサーのかわりに使用されます。
外部エンティティの解決。XMLドキュメントの解析中に外部ファイルを見つけるように要求された場合にXMLパーサーが実行する処理です。
WebLogic Server管理コンソールでこれらのタスクを実行する方法の詳細は、「WebLogic Server XMLの管理」を参照してください。
次のサンプル・コードは、SAXパーサー・ファクトリを構成して検証パーサーを作成する方法を示したものです。また、MyHandler
クラスをパーサーに登録する方法も示しています。MyHandler
クラスは、SAX解析イベントまたはエラーのカスタム動作を提供するためにDefaultHandler
クラスの任意のメソッドをオーバーライドできます。
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; ... MyHandler handler = new MyHandler(); // MyHandler extends org.xml.sax.helpers.DefaultHandler. //Obtain an instance of SAXParserFactory. SAXParserFactory spf = SAXParserFactory.newInstance(); //Specify a validating parser. spf.setValidating(true); // Requires loading the DTD. //Obtain an instance of a SAX parser from the factory. SAXParser sp = spf.newSAXParser(); //Parse the documnt. sp.parse("http://server/file.xml", handler); ...
注意:
デフォルト・パーサー以外のパーサーを使用する場合は、WebLogic Server管理コンソールを使用してXMLレジストリでパーサーを指定します。指定しなかった場合、SaxParserFactory.newInstance
メソッドはデフォルト・パーサーを返します。デフォルト・パーサー以外のパーサーを使用するWebLogic Serverの構成手順については、「デフォルト以外のパーサーまたはトランスフォーマの構成」を参照してください
次のサンプル・コードでは、XMLドキュメントを解析し、DocumentBuilder
オブジェクトからorg.w3c.dom.Document
ツリーを作成する方法を示します。
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; ... //Obtain an instance of DocumentBuilderFactory. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //Specify a validating parser. dbf.setValidating(true); // Requires loading the DTD. //Obtain an instance of a DocumentBuilder from the factory. DocumentBuilder db = dbf.newDocumentBuilder(); //Parse the document. Document doc = db.parse(inputFile); ...
注意:
デフォルト・パーサー以外のパーサーを使用する場合は、WebLogic Server管理コンソールでパーサーを指定します。指定しなかった場合、DocumentBuilderFactory.newInstance
メソッドはデフォルト・パーサーを返します。デフォルト・パーサー以外のパーサーを使用するWebLogic Serverの構成手順については、「デフォルト以外のパーサーまたはトランスフォーマの構成」を参照してください
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>
サーブレット・フィルタの詳細は、Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発のフィルタを参照してください。
次のサンプル・コードでは、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の便利な機能です。したがって、アプリケーションを他のサーブレット・プラットフォームで実行する場合は、この機能を使用しないでください。
次のサンプル・コードでは、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またはスキーマで指定した制約に従っているドキュメントです。
非検証パーサーは、ドキュメントが整形式かどうかを検証しますが、有効かどうかは検証しません。(検証パーサーの使用を前提に)ドキュメント解析時の検証を有効にするには、以下を実行する必要があります。
以下の例で示すように、SAXParserFactory.setValidating()
メソッドをtrueに設定します。
SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true);
解析するXMLドキュメントで、(インラインまたは参照で) DTDまたはスキーマが定義されているようにします。
この節では、XMLパーサーによる外部エンティティの識別および解決方法、およびXMLアプリケーションによる外部エンティティ解決のパフォーマンスを向上させるWebLogic Serverの機能など、外部エンティティに関する一般的な情報について説明します。
外部エンティティは、XMLドキュメント内に記述されていないものの、XMLドキュメント内で参照される様々なテキストです。実際のテキストは、同じコンピュータの他のファイル、Web上など、どこにあってもかまいません。パーサーは、ドキュメントの解析時に外部エンティティ参照に出会うと、参照されたテキストをフェッチし、テキストをXMLドキュメント内に配置してから、解析を続行します。外部エンティティの例がDTDです。XMLドキュメント内にDTDのテキストがすべて記述されているのではなく、別のファイルに格納されているDTDへの参照がXMLドキュメント内にあります。
外部エンティティの識別方法には、システムIDとパブリックIDの2つがあります。システムIDは、URIで指定された位置を基に外部エンティティを参照します。パブリックIDは、外部で宣言されている名前を使用して情報を参照します。
次の例では、パブリックIDを使用して、Java EEアプリケーション・アーカイブ(*.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機能を使用すると、XMLアプリケーションの外部エンティティ解決のパフォーマンスを向上させることができます。
外部エンティティのコピーを、WebLogic管理サーバーのホストとなるコンピュータに永続的に格納します。
WebLogic Serverが、URLなどのHTTPインタフェースをサポートする外部リポジトリにある外部エンティティを自動的に取得およびキャッシュするように指定します。エンティティのキャッシュ先をメモリーにするかディスクにするかを指定し、キャッシュされているエントリが自動的に更新されるキャッシュの有効期限を指定できます。
この取出し/キャッシュ機能を使用すると、実際に外部エンティティをローカル・コンピュータにコピーする必要はなくなります。XMLアプリケーションは、ドキュメントを解析するたびにではなく、指定した期間でのみ外部エンティティを参照するので、アプリケーションのパフォーマンスを大幅に向上させることができ、必要に応じて外部エンティティを最新の状態で参照できます。
XMLレジストリで、外部エンティティの場所(ローカルまたはURL)、およびどのキャッシュ・オプションがWeb上のエンティティ用かを識別するエンティティ解決エントリを作成します。システムIDまたはパブリックIDを使用して外部エンティティ・エントリを識別します。次に、XMLドキュメントで、この外部エンティティを参照すると、WebLogic Serverは、ドキュメントの解析時にローカル・コピーまたはキャッシュされたコピー(構成による)を取り出します。
XMLレジストリでの外部エンティティ・レジストリ作成の詳細は、「外部エンティティの構成タスク」を参照してください
JAXPでXMLドキュメントを解析する場合、WebLogic Server XMLレジストリ(WebLogic Server管理コンソールで構成)には次の選択肢があります。
デフォルト・パーサーをサーバー全体のパーサーとして使用します。
選択した別のパーサー(別のバージョンのApache Xercesパーサーなど)をサーバー全体のパーサーとして構成します。
システムID、パブリックID、またはルート要素に基づいた特定のXMLドキュメント・タイプに対応するパーサーを構成します。
XMLレジストリで解析オプションを構成する手順については、「XMLパーサーおよびトランスフォーマの構成タスク」を参照してください
この節では、DOMドキュメント・ツリーからJSPを使用してXMLドキュメントを生成する方法について説明します。
注意:
Streaming API for XML (StAX)を使用したXMLドキュメントの生成方法の詳細は、「Streaming API for XML (StAX)の使い方」を参照してください。
サンプル・コードの次のセグメントで示すように、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は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>
変換とは、XMLドキュメント(変換元)を他の形式(変換結果)に変換することです。通常は、別のXMLドキュメント、HTML、無線用マークアップ言語(Wireless Markup Language : WML)などに変換されます。この節では、JAXPを使用して、およびJSP内からJSPタグを使用してXMLドキュメントを変換する方法について説明します。
バージョン1.2のJAXPでは、プラガブルの変換が提供されています。つまり、JAXP準拠の任意のトランスフォーマ・エンジンを使用できます。
JAXPは、XMLデータを様々な形式に変換するために以下のインタフェースを提供します。
javax.xml.transform
ドキュメントを変換するための汎用APIがあります。SAXかDOMかに関係なく、変換元および変換結果の形式を推測し、できる限り少ない候補に絞り込みます。
javax.xml.transform.stream
ストリーム固有およびURI固有の変換APIを実装します。具体的には、InputStreams
とURLを変換元、OutputStreams
とURLを変換結果として指定できるStreamSource
クラスおよびStreamResult
クラスが定義されています。
javax.xml.transform.dom
DOM固有の変換APIを実装します。具体的には、DOMツリーを変換元か変換結果、またはその両方として指定できるDOMSource
クラスおよびDOMResult
クラスが定義されています。
javax.xml.transform.sax
SAX固有の変換APIを実装します。具体的には、org.xml.sax.ContentHandler
イベントを変換元か変換結果、またはその両方として指定できるSAXSource
クラスおよびSAXResult
クラスが定義されています。
変換には、入力と出力の多くの組合せがあります。
抜粋した次のサンプル・コードでは、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データの変換」を参照してください
WebLogic Serverでは、JSP内からXSLTトランスフォーマに簡単にアクセスするための小規模なJSPタグ・ライブラリが提供されます。このタグを使用するとXMLドキュメントをHTML、WMLなどに変換できます。
注意:
この機能はWebLogic Server 12.1.2.0で非推奨となり、将来のリリースでは削除される可能性があります。
JSPタグ・ライブラリは、メイン・タグのx:xslt
と、x:xslt
タグ内部で使用できる2つのサブタグ(x:stylesheet
およびx:xml
)で構成されます。
注意:
JSPタグ・ライブラリは使い勝手を良くするために用意されているだけであり、JSP内からXSLTトランスフォーマへのアクセスに必須というわけではありません。
XSLT JSPタグ構文はXMLを基にしています。JSPタグは、開始タグ、本文(オプション)、対応する終了タグで構成されます。開始タグには要素名と属性(オプション)が含まれます。
注意:
この機能はWebLogic Server 12.1.2.0で非推奨となり、将来のリリースでは削除される可能性があります。
次の構文では、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>
表3-1 x:xsltタグの属性を示します。
表3-1 x:xslt JSPタグの属性
x:xsltタグの属性 | 必須 | データ型 | 説明 |
---|---|---|---|
xml |
いいえ |
String |
変換するXMLファイルの場所を指定します。場所は、タグが使用されるWebアプリケーションのドキュメント・ルートへの相対パス。 |
media |
いいえ |
String |
HTMLまたはWMLなど、ドキュメントの出力タイプを定義します。このタイプによって、XMLドキュメントの変換時に使用するスタイルシートが決定されます。 この属性は、 注意: 同じ |
stylesheet |
いいえ |
String |
XMLドキュメントの変換に使用するスタイルシートの場所を指定します。場所は、タグが使用されるWebアプリケーションのドキュメント・ルートへの相対パス。 注意: 同じ |
表3-2 x:stylesheet
タグの属性について説明します。
表3-2 x:stylesheet JSPタグの属性
x:stylesheetタグの属性 | 必須 | データ型 | 説明 |
---|---|---|---|
media |
いいえ |
String |
HTMLまたはWMLなど、ドキュメントの出力タイプを定義します。このタイプによって、XMLドキュメントの変換時に使用するスタイルシートが決定されます。 この属性は |
uri |
いいえ |
String |
|
x:xslt
タグは本文の有無に関わらず使用でき、属性は省略可能です。この節では、本文や1つまたは複数の属性を指定したかどうかによってタグの動作を決定するルールについて説明します。
注意:
この機能はWebLogic Server 12.1.2.0で非推奨となり、将来のリリースでは削除される可能性があります。
x:xslt
JSPタグが空タグ(本文なし)の場合、以下の説明が適用されます。
属性が設定されていない場合、XMLドキュメントはサーブレットのパスとデフォルトのメディア・スタイルシートで処理されます。XMLファイルで、<?xml-stylesheet>
処理指示を使用してデフォルトのメディア・スタイルシートを指定します。デフォルトのスタイルシートにはmedia
属性はありません。
この処理のタイプでは、XSLT処理を実行するファイル・サーブレットとしてタグ拡張を含むJSPページを登録できます。
media
属性のみが設定されている場合、XMLドキュメントは、サーブレットのパスと指定されたメディア・タイプを使用して処理されます。x:xslt
タグのmedia
タイプ属性の値は、XMLドキュメントにある<?xml-stylesheet>
処理指示のmedia
属性の値と比較されます。一致した場合は対応するスタイルシートが適用されます。一致しない場合はデフォルトのメディア・スタイルシートが使用されます。メディア・タイプ属性は、ドキュメントの出力タイプ(XML、HTML、ポストスクリプト、WMLなど)の定義に使用します。この機能を使用すると、ドキュメントの出力タイプごとにスタイルシートをまとめることができます。
xml
属性のみが設定されている場合、指定したXMLドキュメントはデフォルトのメディア・スタイルシートで処理されます。
media
およびxml
属性を設定すると、指定したXMLドキュメントは指定したメディア・タイプを使用して処理されます。
stylesheet
属性が定義されている場合、XMLドキュメントは指定したスタイルシートで処理されます。
注意:
同じx:xslt
タグ内でmedia
属性とstylesheet
属性の両方を設定するとエラーが発生します。
本文があるXSLT JSPタグは、<x:xml>
タグまたは<x:stylesheet>
タグを含んでいる場合があります。以下の説明が適用されます。
<x:xml>
タグを使用すると、XMLドキュメントをインライン処理用に指定できます。このタグには属性はありません。
<x:stylesheet>
タグは、属性を指定しない場合、デフォルトのスタイルシートをインラインで指定できます。
<x:stylesheet>
タグのuri
属性を使用して、デフォルト・スタイルシートの場所を指定します。
様々なメディア・タイプごとに異なるスタイルシートを指定する場合は、media
属性に異なる値を指定して、複数の<x:stylesheet>
タグを使用できます。タグの本文でメディア・タイプごとのスタイルシートを指定したり、uri
属性を使ってスタイルシートの場所を指定したりできます。
JSPから抜粋した次のコードは、XSLT JSPタグを使用し、JSPを要求するクライアントのタイプに従って、XMLをHTMLまたはWMLに変換する方法を示します。JSPは、クライアントがブラウザの場合はHTMLを返し、無線デバイスの場合はWMLを返します。
注意:
この機能はWebLogic Server 12.1.2.0で非推奨となり、将来のリリースでは削除される可能性があります。
最初に、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"); // default to WML client String myMedia = "wml"; // if client is an HTML browser 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レジストリ(WebLogic Server管理コンソールで構成)では、次の項目を構成します。
デフォルト・トランスフォーマをサーバー全体のトランスフォーマとして使用します。
デフォルト・トランスフォーマ以外のトランスフォーマをサーバー全体のトランスフォーマとして使用します。トランスフォーマはJAXP準拠でなくてはなりません。
Xmlレジストリで変換オプションを構成する手順については、「デフォルト以外のパーサーまたはトランスフォーマの構成」を参照してください