Oracle Application Server Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス 10g 部品番号: A97678-01 |
|
このトピックでは、OC4Jが提供する、XMLデータおよびXSL変換に使用できるタグについて説明します。また、他のOC4JタグでのXMLの追加機能のサマリーを示します。これらのタグは、JSP仕様に従って実装されます。
このトピックには、次の項目が含まれます。
注意: JSPページでのXML関連機能の追加情報は、Oracle Containers for J2EE Support for JavaServer Pages開発者ガイド 10gを参照してください。 |
この項では、OC4Jが提供するXML機能を備えたタグの概要を説明します。これらのタグは、XML DOMオブジェクトを入力として取得できるタグ、XML DOMオブジェクトを出力として生成できるタグ、指定したスタイルシートに従ってXML文書を変換するタグ、およびデータを入力ストリームからXML DOMオブジェクトに解析するタグです。次のトピックについて説明します。
注意: OC4Jで提供されるカスタムXMLタグ・ライブラリはJavaServer Pages標準タグ・ライブラリ(JSTL)に先立つものであり、機能の重複する領域があります。今後は、標準準拠のため原則としてカスタム・ライブラリのかわりにJSTLを使用することをお薦めします。「JavaServer Pages標準タグ・ライブラリのサポート」を参照してください。 ただし、既存のタグがサポート対象外になったわけではありません。カスタム・ライブラリにあってJSTLでは使用できないが、一般的に役立つと思われる機能は、必要に応じて将来的にJSTL標準に採用されていく予定です。 |
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
ディレクティブが存在する必要があります。Oracle Application Serverのインストール時に、TLDファイルは既知のタグ・ライブラリ・ディレクトリに配置されます。taglib
ディレクティブと既知のタグ・ライブラリ・ディレクトリの詳細は、Oracle Application Server Containers for J2EE Support for JavaServer Pages開発者ガイド 10gを参照してください。
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 Containers for J2EE Support for JavaServer Pages開発者ガイド 10gを参照してください。
fromXMLObjName
: タグ本体からではなく、DOMオブジェクトから入力する場合に、入力XML DOMオブジェクトを指定します。タグ本体とfromXMLObjName
指定の両方がある場合は、fromXMLObjName
が優先されます。
toXMLObjName
: HTTPクライアントへの出力用のJSP Writerオブジェクトのかわりに(またはこのオブジェクトに加えて)、DOMオブジェクトを出力先とする場合に、出力XML DOMオブジェクトの名前を指定します。この属性は、暗黙的XMLコンシューマが存在する場合は不要です。たとえば、タグ内にtransform
タグまたはstyleSheet
タグがネストされている場合です。
toWriter
: この属性は「true
」または「false
」のいずれかで、出力先が、HTTPクライアントへの出力用のJSP Writerオブジェクトであるかどうかを示します。これは、DOMオブジェクトへの出力のかわりに(または追加して)指定できます。デフォルトでは、下位互換性を維持するため、「true
」に設定されます(Oracle9iASリリース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リソースから入力する場合に、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, 2007, Oracle. All rights reserved.