Oracle Application Server Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス 10g(9.0.4) |
|
このトピックでは、OC4Jが提供する、XMLデータおよびXSL変換に使用できるタグについて説明します。また、他のOC4JタグでのXMLの追加機能のサマリーを示します。これらのタグは、JSP仕様に従って実装されます。
このトピックの構成は、次のとおりです。
注意: JSPページに対するXML関連機能の追加情報は、『Oracle Application Server Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。 |
この項では、OC4Jが提供するXML機能を備えたタグの概要を説明します。これらのタグは、XML DOMオブジェクトを入力として取得できるタグ、XML DOMオブジェクトを出力として生成できるタグ、指定したスタイルシートに基づいてXML文書を変換するタグ、およびデータを入力ストリームからXML DOMオブジェクトに解析するタグです。 次の項目について説明します。
注意: JavaServer Pages標準タグ・ライブラリ(JSTL)と、すでにOC4Jが提供しているXMLカスタム・タグ・ライブラリには、重複する機能が含まれています。標準準拠で作業を進める場合は、原則として、カスタム・ライブラリではなく、JSTLの使用をお薦めします。 「JavaServer Pages標準タグ・ライブラリのサポート」を参照してください。 ただし、既存のタグもサポート対象です。JSTLで使用できないカスタム・ライブラリの機能のうち、有効と判断される機能は、必要に応じて、将来JSTL標準に採用される予定です。 |
XML関連操作は、次のいずれか(または両方)に分類できます。
同様に、XML関連タグも、XMLプロデューサまたはXMLコンシューマ(あるいはその両方)に分類できます。 XMLプロデューサは、XMLオブジェクトをXMLコンシューマに明示的にまたは暗黙的に渡すことができます。暗黙的に渡すことを「無名の受渡し」と呼びます。
XML関連タグ間での明示的な受渡しの場合、プロデューサ・タグではtoXMLObjName
属性が、コンシューマ・タグではfromXMLObjName
属性が使用されます。 この受渡し処理は、背後で、JSPの標準pageContext
オブジェクトのgetAttribute()
メソッドとsetAttribute()
メソッドを使用して実行されます。次は、明示的な受渡しの使用例です。
<sql:dbQuery output="XML" toXMLObjName="foo" ... > ...SQL query... </sql:dbQuery> ... <ojsp:cacheXMLObj fromXMLObjName="foo" ... />
XML関連タグ間での暗黙的な受渡しの場合、toXMLObjName
属性とfromXMLObjName
属性は使用しないでください。この受渡し処理は、タグ・ハンドラ間での直接的な相互作用によって実行されます。この場合、通常タグはネストされています。次は、暗黙的な受渡しの使用例です。
<ojsp:cacheXMLObj ... > <sql:dbQuery output="XML" > ...SQL query... </sql:dbQuery> </ojsp:cacheXMLObj>
この例では、dbQuery
タグで作成されたXMLは、pageContext
オブジェクトに格納されず、cacheXMLObj
タグに直接渡されます。
暗黙的な受渡しでは、タグがコンシューマとして機能できるように、タグ・ハンドラは、OC4J ImplicitXMLObjConsumer
インタフェースを次のように実装します。
interface ImplicitXMLObjConsumer { void setImplicitFromXMLObj(); }
OC4Jが提供するタグ・ライブラリに関して、表 5-1に、XMLプロデューサまたはコンシューマとして機能できるタグのサマリーを示します。
注意:
|
この項では、OC4Jが提供するXMLユーティリティ・タグについて説明します。構成は、次のとおりです。
XMLユーティリティ・タグ・ライブラリを使用するには、タグ・ライブラリ・ディスクリプタ・ファイルxml.tld
が、アプリケーションとともにデプロイされている必要があります。また、ライブラリを使用するJSPページには、適切なtaglib
ディレクティブが存在する必要があります。 OracleASのインストール時、TLDファイルは、「予約済」のタグ・ライブラリ・ディレクトリに置かれます。 taglib
ディレクティブと予約済のタグ・ライブラリ・ディレクトリの詳細は、『Oracle Application Server Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。
XMLタグ・ライブラリを使用するには、ojsputil.jar
ファイル、xmlparserv2.jar
ファイルおよびxsu12.jar
(JDK 1.1.xの場合はxsu111.jar
)ファイルがインストール済で、クラスパスに存在している必要があります。 これらのファイルは、OC4Jに含まれています。
注意:
|
この項では、次のユーティリティ・タグについて説明します。
XMLとXSLを動的JSPページに頻繁に使用する場合は、結果をクライアントに戻す前に、サーバーでXSL変換を行う必要があります。この処理を簡素化するために、Oracleでは、XMLライブラリに2つの同義のタグを用意しています。結果をHTTPクライアントに直接出力することも、指定したXML DOMオブジェクトに出力することもできます。 この項の説明と例のように、transform
タグまたはstyleSheet
タグのいずれかを使用します。この2つのタグによって得られる効果は同じです。
それぞれのタグは、XMLプロデューサとXMLコンシューマの両方の役割を果たします。次のいずれかを入力として取得できます。
これらのタグは、次のいずれか、または両方に出力できます。ただし、いずれの場合も適用するスタイルシートを指定する必要があります。
各タグは、開始タグと終了タグの間にあるそのボディの内容に適用されます。 1つのページ内に複数のXSL変換ブロックを設定できます。この場合、各ブロックはそのブロック自体のtransform
タグまたはstyleSheet
タグでバインドされ、適切なスタイルシートへの独自のhref
ポインタを指定します。
<xml:transform href="xslRef" [ fromXMLObjName = "objectname" ] [ toXMLObjName = "objectname" ] [ toWriter = "true" | "false" ] > [...body...] </xml:transform >
または
<xml:styleSheet href="xslRef" [ fromXMLObjName = "objectname" ] [ toXMLObjName = "objectname" ] [ toWriter = "true" | "false" ] > [...body...] </xml:styleSheet >
href
(必須): XMLデータ変換に使用するXSLスタイルシートを指定します。この属性は、XMLオブジェクト(書式設定なしで変換できる)への出力またはブラウザへの出力に関係なく、必須です。
href
属性については、次の点に注意してください。
http://host[:port]/path
)、アプリケーション相対URLのJSP参照(「/
」で開始する)、およびページ相対URLのJSP参照(「/
」で開始しない)の場合があります。 アプリケーション相対パスとページ相対パスの詳細は、『Oracle Application Server Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。
fromXMLObjName
: タグ・ボディからではなく、DOMオブジェクトから入力する場合に、入力XML DOMオブジェクトを指定します。 タグ・ボディとfromXMLObjName
の両方が指定されている場合は、fromXMLObjName
が優先されます。
toXMLObjName
: DOMオブジェクトを出力先とする場合に、HTTPクライアントへの出力用のJSP Writerオブジェクトのかわりに(またはこのオブジェクトに加えて)、出力XML DOMオブジェクトの名前を指定します。 この属性は、暗黙的XMLコンシューマが存在する場合は不要です。たとえば、タグ内にtransform
タグまたはstyleSheet
タグがネストされている場合です。
toWriter
: この属性は「true
」または「false
」のいずれかで、出力先が、HTTPクライアントへの出力用JSP Writerオブジェクトであるかどうかを示します。これは、DOMオブジェクトへの出力のかわりに(または追加して)指定できます。 デフォルトは「true
」で、下位互換性を維持します。 (OracleASリリース2より前のリリースでは、この属性が唯一の出力の選択肢で、toXMLObjName
属性はありませんでした。)
XMLタグ・ライブラリには、XMLプロデューサ・ユーティリティ・タグparsexml
が含まれています。このタグでは、入力ストリームをXML DOMオブジェクトに変換します。このタグによって、指定したリソースまたはタグ・ボディから入力を取得できます。
<xml:parsexml [ resource = "xmlresource" ] [ toXMLObjName = "objectname" ] [ validateResource = "dtd_path" ] [ root = "dtd_root_element" ] > [...body...] </xml:parsexml >
resource
: タグ・ボディからではなく、リソースから入力する場合に、XMLリソースを指定します。 たとえば、次のように指定します。
resource="/dir1/hello.xml"
タグ・ボディと指定したリソースの両方がある場合は、リソースが優先されます。
toXMLObjName
: 出力先のXML DOMオブジェクトの名前を指定します。 この属性は、暗黙的XMLコンシューマが存在する場合は不要です。たとえば、タグ内にparsexml
タグがネストされている場合です。
validateResource
: XML妥当性チェックに対して、適切なDTDへのパスを指定できます。あるいは、DTDをXMLリソースに埋め込むことができます。 この属性は、リクエスト時属性ではありません。
root
: DTDのルート要素を指定して妥当性チェックをします。 この属性は、リクエスト時属性ではありません。 root
要素を指定せずにvalidateResource
を指定した場合、デフォルトのルートは、DTDのトップレベルになります。
この項では、次の例を示します。
この項では、XSLスタイルシートのサンプルと、そのスタイルシートでtransform
タグを使用して出力をフィルタ処理するJSPページのサンプルを示します。これは極端に単純化した例です。ページ内のXMLは静的なものです。より現実的な例では、JSPページを使用して、変換の実行前にXMLのすべてまたは一部を動的に生成します。
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="page"> <html> <head> <title> <xsl:value-of select="title"/> </title> </head> <body bgcolor="#ffffff"> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="title"> <h1 align="center"> <xsl:apply-templates/> </h1> </xsl:template> <xsl:template match="paragraph"> <p align="center"> <i> <xsl:apply-templates/> </i> </p> </xsl:template> </xsl:stylesheet>
<%@ page session = "false" %> <%@ taglib uri="/WEB-INF/xml.tld" prefix="xml" %> <xml:transform href="style/hello.xsl" > <page> <title>Hello</title> <content> <paragraph>This is my first XML/XSL file!</paragraph> </content> </page> </xml:transform>
この例では、次の出力が生成されます。
この例では、dbQuery
タグから結果セットを返し、transform
タグを使用して、XSLスタイルシートrowset.xsl
で問合せ結果をフィルタ処理します(コードを次に示します)。 また、dbOpen
タグを使用して接続をオープンします。接続文字列は、request
オブジェクトまたはsetconn.jsp
ページのいずれかから取得されます(コードを次に示します)。 dbOpen
タグからtransform
タグへのデータの受渡しは暗黙的に実行されます。 関連情報は、「SQL dbQueryタグ」および「SQL dbOpenタグ」を参照してください。
<%@ page import="oracle.sql.*, oracle.jdbc.driver.*, oracle.jdbc.*, java.sql.*" %> <%@ taglib uri="/WEB-INF/xml.tld" prefix="xml" %> <%@ taglib uri="/WEB-INF/sqltaglib.tld" prefix="sql" %> <% String connStr=request.getParameter("connStr"); if (connStr==null) { connStr=(String)session.getValue("connStr"); } else { session.putValue("connStr",connStr); } if (connStr==null) { %> <jsp:forward page="../../sql/setconn.jsp" /> <% } %> <h3>Transform DBQuery Tag Example</h3> <xml:transform href="style/rowset.xsl" > <sql:dbOpen connId="conn1" URL="<%= connStr %>" user="scott" password="tiger"> </sql:dbOpen> <sql:dbQuery connId="conn1" output="xml" queryId="myquery" > select ENAME, EMPNO from EMP order by ename </sql:dbQuery> <sql:dbCloseQuery queryId="myquery" /> <sql:dbClose connId="conn1" /> </xml:transform>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="ROWSET"> <html><body> <h1>A Simple XML/XSL Transformation</h1> <table border="2"> <xsl:for-each select="ROW"> <tr> <td><xsl:value-of select="@num"/></td> <td><xsl:value-of select="ENAME"/></td> <td><xsl:value-of select="EMPNO"/></td> </tr> </xsl:for-each> </table> </body></html> </xsl:template> </xsl:stylesheet>
<body bgcolor="#FFFFFF"> <font size=+0> <B>Please enter a suitable JDBC connection string, before you try the above demo</B> <pre> To use the thin driver insert your host, port and database id. Once you have set the connection string it will remain in effect until the session times out for most demos. For Connection Cache demos which use application scope on most servlet engines the connection string will remain in effect for the life of the application. </pre> <% String connStr; connStr=request.getParameter("connStr"); if (connStr==null) { connStr=(String)session.getValue("connStr"); } if (connStr==null) { connStr="jdbc:oracle:thin:@localhost:1521:orcl"; // default connection str } session.putValue("connStr",connStr); %> <FORM METHOD=get> <INPUT TYPE="text" NAME="connStr" SIZE=40 value="<%=connStr%>" > <INPUT TYPE="submit" VALUE="Set Connection String" > </FORM> </font>
この項では、XSLスタイルシートのemail.xsl
を使用して、parsexml
タグから出力を取得し、その出力をtransform
タグによってフィルタ処理する例を2つ示します。 いずれの場合も、データは、指定したリソースのXMLファイルからparsexml
タグ・ハンドラによって収集された後、toxml1
XMLオブジェクトを介してparsexml
タグからtransform
タグに明示的に渡されます。
最初の例では、XMLリソースemail.xml
と個別のDTDであるemail.dtd
を使用します。 root
属性は指定されていません。したがって、妥当性チェックは、トップレベル要素の<email>
から行われます。
第2の例では、XMLリソースemailWithDtd.xml
を使用します。このファイルには、DTDが埋め込まれています。 root
属性によって、妥当性チェックが要素<email>
から行われることが明示的に指定されています。
email.xml
、email.dtd
、emailWithDtd.xml
およびemail.xsl
の各ファイルも次に示します。
<%@ taglib uri="/WEB-INF/xml.tld" prefix="xml" %> <h3>XML Parsing Tag Email Example</h3> <xml:transform fromXMLObjName="toxml1" href="style/email.xsl"> <xml:parsexml resource="style/email.xml" validateResource="style/email.dtd" toXMLObjName="toxml1"> </xml:parsexml> </xml:transform>
<%@ taglib uri="/WEB-INF/xml.tld" prefix="xml" %> <h3>XML Parsing Tag Email Example</h3> <xml:transform fromXMLObjName="toxml1" href="style/email.xsl"> <xml:parsexml resource="style/emailWithDtd.xml" root="email" toXMLObjName="toxml1"> </xml:parsexml> </xml:transform>
<email> <recipient>Manager</recipient> <copyto>jsp_dev</copyto> <subject>XML Bug fixed</subject> <bugno>BUG 1109876!</bugno> <body>for reuse tag and checked in the latest version!</body> <sender>Developer</sender> </email>
<!ELEMENT email (recipient,copyto,subject,bugno,body,sender)> <!ELEMENT recipient (#PCDATA)> <!ELEMENT copyto (#PCDATA)> <!ELEMENT subject (#PCDATA)> <!ELEMENT bugno (#PCDATA)> <!ELEMENT body (#PCDATA)> <!ELEMENT sender (#PCDATA)>
<!DOCTYPE email [ <!ELEMENT email (recipient,copyto,subject,bugno,body,sender)> <!ELEMENT recipient (#PCDATA)> <!ELEMENT copyto (#PCDATA)> <!ELEMENT subject (#PCDATA)> <!ELEMENT bugno (#PCDATA)> <!ELEMENT body (#PCDATA)> <!ELEMENT sender (#PCDATA)>]> <email> <recipient>Manager</recipient> <copyto>jsp_dev</copyto> <subject>XML Bug fixed</subject> <bugno>BUG 1109876!</bugno> <body>for reuse tag and checked in the latest version!</body> <sender>Developer</sender> </email>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="email"> <html><body> To: <xsl:value-of select="recipient"/> CC: <xsl:value-of select="copyto"/> Subject: <xsl:value-of select="subject"/> ... <xsl:value-of select="body"/> !! Thanks <xsl:value-of select="sender"/> </body></html> </xsl:template> </xsl:stylesheet>
Copyright © 1997, 2004, Oracle. All rights reserved.