Oracle Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス 10g(10.1.3.1.0) B31854-01 |
|
この章では、JSPページで使用できる各種のOC4Jユーティリティ機能について説明します。この章の構成は次のとおりです。
標準サーブレットとJSPテクノロジでサポートされるのは、セッション・ベースのイベントのみです。Oracleでは、このサポートを、oracle.jsp.webutil.tagutil.event
パッケージのJspScopeListener
インタフェースとJspScopeEvent
クラスを使用して、ページ・ベース、リクエスト・ベースおよびアプリケーション・ベースのイベントにまで拡張します。
次の各項では、JspScopeListener
機能について説明して例を示します。
アプリケーション内のJavaオブジェクトの場合は、JspScopeListener
インタフェースを適切なクラスに実装してから、そのクラスのオブジェクトをjsp:useBean
などのタグを使用して、JSPスコープに連結します。
スコープの最後に到達すると、JspScopeListener
を実装したオプションとそのスコープに連結されたオブジェクトが通知されます。JSPコンテナでは、JspScopeEvent
インスタンスをJspScopeListener
インタフェースに指定されているoutOfScope()
メソッドを使用して、該当するオブジェクトに送信することによって、この通知を実行します。
このイベント・リスナーの機能は、page
スコープやrequest
スコープに関するオブジェクト・リソースを、エラー状態に関係なく常に解放しておこうとする開発者にとっては、大きな利点となります。この機能によって、開発者は、自分のページ実装をJavaのtry
/catch
/finally
ブロックで囲む必要がなくなります。
JspScopeEvent
オブジェクトのプロパティには、次の内容が含まれています。
int
型の定数PAGE_SCOPE
、REQUEST_SCOPE
、SESSION_SCOPE
またはAPPLICATION_SCOPE
のいずれかで表します。)このスコープは次のJspScopeEvent
メソッドで取得できます。
public int getScope()
page
、request
、session
またはapplication
のいずれか)これは関連スコープを管理するオブジェクトです。このオブジェクトは次のJspScopeEvent
メソッドで取得できます。
public java.lang.Object getContainer()
これはJspScopeListener
を実装するクラスのインスタンス名です。このクラスのインスタンスはpage
、request
、session
またはapplication
オブジェクト(使用可能な場合)の属性であるため、このインスタンス名は属性名です。この名前は次のJspScopeEvent
メソッドで取得できます。
public String getName()
application
オブジェクトこのオブジェクトは次のJspScopeEvent
メソッドで取得できます。
public ServletContext getApplication()
JspScopeEvent
クラスには次のコンストラクタがあります。
public JspScopeEvent (ServletContext sc, Object container, String name, int scope)
JspScopeListener
は、様々な機能を使用して異なるスコープをサポートします。ただし、すべてはサーブレットとJSPの標準に基づいて実装されます。
OC4J環境でページを実行する場合は、便宜上、page
スコープに対するOC4J固有の実行時実装もあります。
これらの機能については次の項を参照してください。
JspScopeListener
の実装には、次の内容が必要です。
JspScopeListener
インタフェースとJspScopeEvent
クラス、およびoracle.jsp.webutil.tagutil.event.impl
パッケージのクラス。これらは、すべてojsputil.jar
ファイルに含まれています。
request
スコープのオブジェクトは、サーブレット・フィルタによってサポートされています。フィルタ処理は、指定したURLパターンに一致するすべてのサーブレットに適用されます。
リクエスト・スコープ・オブジェクトのイベント処理をサポートするには、次のようなエントリをアプリケーションのweb.xml
ファイルに追加するか、必要に応じてorion-web.xml
またはglobal-web-application.xml
ファイルに追加します。JspScopeListener
機能を適切に操作するには、この設定を他のすべてのfilter
設定の後に指定する必要があります。
<filter> <filter-name>Request Filter</filter-name> <filter-class>oracle.jsp.event.impl.RequestScopeFilter</filter-class> </filter> <!-- Define filter mappings for the defined filters --> <filter-mapping> <filter-name>Request Filter</filter-name> <url-pattern>/jsp/*</url-pattern> </filter-mapping>
application
スコープを含むオブジェクトは、Servlet仕様に従って、サーブレット・コンテキスト・リスナー実装クラスによってサポートされます。
アプリケーション・スコープ・オブジェクトのイベント処理をサポートするには、次のようなエントリをアプリケーションのweb.xml
ファイルに追加します。JspScopeListener
機能を適切に操作するには、この設定を他のすべてのlistener
設定の後に指定する必要があります。
<listener> <listener-class>oracle.jsp.event.impl.AppScopeListener</listener-class> </listener>
アプリケーション・スコープ・オブジェクトの場合は、アプリケーションとサーブレット・コンテキストの終了時の通知に加えて、属性がサーブレット・コンテキストで置換されたとき、またはサーブレット・コンテキストから削除されたときも、通知が行われます。たとえば、アプリケーション・スコープ・オブジェクトのリスナーoutOfScope()
メソッドが次の状況でコールされたとします。この場合のサーブレット・コンテキスト・オブジェクトは、ctx
です。
ctx.setAttribute("name", "Smith"); ... ctx.setAttribute("name, "Jones");
または
ctx.setAttribute("name", "Smith"); ... ctx.removeAttribute("name");
セッション・スコープ・オブジェクトの場合は、JspScopeListener
インタフェースと標準のjavax.servlet.http.HttpSessionBindingListener
インタフェースの両方を実装するクラスを作成できます。この機能によって、他のスコープでも、このクラスのインスタンスをサポートする柔軟性が得られます。ただし、インスタンスをsession
スコープ以外で使用しない場合、JspScopeListener
の実装は不要です。
統合の使用例では、HttpSessionBindingListener
インタフェースに指定されているvalueUnbound()
メソッドが、JspScopeListener
インタフェースに指定されているoutOfScope()
メソッドをコールする必要があります。
次に、基本的な例を示します。
import oracle.jsp.event.impl.*; import javax.servlet.*; import javax.servlet.http.*; class SampleObj implements HttpSessionBindingListener,JspScopeListener { public void valueBound(HttpSessionBindingEvent e) { System.out.println("The object implements the JspScopeListener also"); } public void valueUnBound(HttpSessionBindingEvent e) { try { outOfScope(new JspScopeEvent(null,(Object)e.getSession(), e.getName(),javax.servlet.jsp.PageContext.SESSION_SCOPE)); } catch (Throwable e) {} ........... } public void outOfScope(JspScopeEvent e) {...} }
OC4Jには、JSPページでのEnterprise JavaBeansの使用を簡素化するカスタム・タグ・ライブラリが用意されています。このライブラリには、ホーム・インスタンスの作成、EJBインスタンスの作成およびEJBのコレクション間の反復などに使用するタグが含まれています。
OC4J EJBタグの機能は、J2EE仕様に従っています。このタグを使用すると、web.xml
ファイルの構成情報を使用して、EJBを名前でインスタンス化できます。タグの中には、通常のJavaBeanの起動に使用するjsp:useBean
タグの機能に似た機能を持つuseBean
タグがあります。
次の各項では、各タグについて説明し、例を示します。
使用する各EJBについて、アプリケーションのweb.xml
ファイルにある<ejb-ref>
要素を、次の例のように使用します。
<ejb-ref> <ejb-ref-name>ejb/DemoSession</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>ejbdemo.DemoSessionHome</home> <remote>ejbdemo.DemoSession</remote> </ejb-ref>
<ejb-ref>
要素とそのサブ要素、またはローカル・インタフェースを使用するための<ejb-local-ref>
は、Servlet仕様に準拠して使用されます。概要は、次のとおりです。
<ejb-ref-name>
サブ要素は、J2EEアプリケーションの他のコンポーネントがこのコンポーネントへのアクセスに使用できる参照名を指定します。たとえば、この名前を場所を示す値で使用できます。
<ejb-ref-type>
サブ要素は、EJBのカテゴリを指定します。
<home>
サブ要素は、EJBホーム・インタフェースのパッケージと型を指定します。または、EJBローカル・インタフェースの場合は<local-home>
サブ要素を使用します。
<remote>
サブ要素は、EJBリモート・インタフェースのパッケージと型を指定します。または、EJBローカル・インタフェースの場合は<local>
サブ要素を使用します。
これらの値は、EJBタグの属性値に反映されます。
EJBの開発と構成の追加情報は、『Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド』を参照してください。
この項では、OC4J EJBタグの構文と属性を説明します。次の要件に注意してください。
ojsputil.jar
ファイルがインストール済で、クラスパスに存在していることを確認してください。このファイルは、OC4Jに同梱されていて、予約済のタグ・ライブラリ・ディレクトリにあります。
ejbtaglib.tld
が、アプリケーションで使用可能である必要があります。また、ライブラリを使用するJSPページには、適切なtaglib
ディレクティブが存在する必要があります。Oracle Application Serverのインストール時、TLDはojsputil.jar
に配置されます。ejbtaglib.tld
のuri
値は次のとおりです。
http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/ejbtaglib.tld
taglib
ディレクティブ、予約済のタグ・ライブラリ・ディレクトリ、TLDファイルおよびuri
値の内容の詳細は、『Oracle Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。
注意
|
次の各項では、EJBタグの詳細を説明します。
EJBインスタンスを最初に作成するときは、useHome
タグを使用してホーム・インタフェース・インスタンスを作成する必要があります。その後、適宜、次のインスタンスを作成します。
useBean
タグと、useBean
タグのvalue
属性またはネストしたcreateBean
タグ
iterate
タグ
EJBインスタンスは、作成された後、適切なスコープ・オブジェクトに入れられます。その後でこのインスタンスにアクセスするために必要なのは、useBean
タグのみです。
useHome
タグは、EJBのホーム・インタフェースを参照して、インスタンスを作成します。
<ejb:useHome id = "home_instance_name" type = "home_interface_type" location = "home_lookup_name" [ local = "true" | "false" ] />
このタグは、ボディを使用しません。
id
(必須): ホーム・インタフェース・インスタンスの名前を指定します。これは、local
属性の設定に応じて、ローカル・ホーム・インタフェースまたはリモート・ホーム・インタフェースのいずれかです。このインスタンスには、開始タグからページの終わりまでアクセスできます。
type
(必須): ホーム・インタフェースの名前(Javaの型)です。
location
(必須): アプリケーション内の任意のEJBのホーム・インタフェースをルックアップするために使用するJNDIの名前です。
local
: ローカル・ホーム・インタフェースを使用するには「true
」に設定します。デフォルト値は「"false"
」で、リモート・ホーム・インタフェースが使用されます。useHome
タグでlocal="true"
に設定する場合は、useBean
タグでも同じように設定する必要があります。
<ejb:useHome id="aomHome" type="com.acme.atm.ejb.AccountOwnerManagerHome" location="java:comp/env/ejb/accountOwnerManager" />
EJB useBean
タグは、EJBをインスタンス化して使用するためのタグです。id
、type
およびscope
の各属性は、通常のJavaBeanをインスタンス化する標準のjsp:useBean
タグの場合と同じように使用します。
EJBを最初にインスタンス化する場合は、次の2つの機能のいずれかを使用できます。
ネストしたcreateBean
タグを使用している場合、EJBインスタンスは、親useBean
タグのvalue
属性に暗黙的に戻されます。一度EJBがインスタンス化されると、value
属性とネストしたcreateBean
タグは、同じEJBインスタンスを使用する後続のuseBean
タグには不要になります。
<ejb:useBean id = "EJB_instance_name" type = "EJB_class_name" [ value = "<%=Object%>" ] [ scope = "page" | "request" | "session" | "application" ] [ local = "true" | "false" ] > ... nested createBean tag for first instantiation, if no value attribute ... </ejb:useBean>
id
(必須): EJBのインスタンス名を指定します。
type
(必須): EJBのクラス名を指定します。
value
: EJBを最初にインスタンス化するときに、ネストしたcreateBean
タグを使用しない場合は、value
属性を使用してEJBObject
インスタンスを戻し、ナローイングを行います。これは、EJBをインスタンス化する機能です。
scope
: EJBインスタンスのスコープを指定します。デフォルトのスコープ設定は「page
」です。
local
: ローカル・ホーム・インタフェースを使用するには「true
」に設定します。デフォルト値は「"false"
」で、リモート・ホーム・インタフェースが使用されます。useBean
タグでlocal="true"
に設定する場合は、useHome
タグでも同じように設定する必要があります。 次に、すでにインスタンス化されているEJBの使用例を示します。
<ejb:useBean id="bean" type="com.acme.MyBean" scope="session" />
EJBを最初にインスタンス化するときに、EJB useBean
タグのvalue
属性を使用しない場合は、EJB createBean
タグをuseBean
タグ内にネストし、EJBインスタンスの作成作業を実行する必要があります。これが、EJBObject
インスタンスになります。このインスタンスは、親useBean
タグのvalue
属性に暗黙的に戻されます。
<ejb:createBean instance = "<%=Object%>" />
このタグは、ボディを使用しません。
このcreateBean
タグ内で、EJBホーム・インタフェース・インスタンスのcreate()
メソッドが、EJBのインスタンスを作成します。
<ejb:useBean id="bean" type="com.acme.MyBean" scope="session"> <ejb:createBean instance="<%=home.create()%>" /> </ejb:useBean>
このタグを使用してEJBインスタンスのコレクション間を反復します。このタグは主としてエンティティBeanに使用されます。これは、エンティティBeanの標準のfinderメソッドがコレクションを戻すためです。
開始タグでは、finderメソッドの結果を介してコレクションがホーム・インタフェースから取得されます。タグ・ボディでは、必要に応じてコレクションが反復されます。
<ejb:iterate id = "EJB_instance_name" type = "EJB_class_name" collection = "<%=Collection%>" [ max = "<%=Integer%>" ] > ... body ... </ejb:iterate>
ボディは、コレクション内の各EJBについて一度評価されます。
id
(必須): イテレータ変数、つまり各反復のEJBインスタンス名です。
type
(必須): EJBのクラス名です。
collection
(必須): EJBコレクションを戻します。
max
: 反復するBeanの最大数を必要に応じて指定します。
<ejb:iterate id="account" type="com.acme.atm.ejb.Account" collection="<%=accountManager.getOwnerAccounts()%>" max="100"> <jsp:getProperty name="account" property="id" /> </ejb:iterate>
この項では、EJBタグの使用例を示します。1つはセッションBeanの使用例、もう1つはエンティティBeanの使用例です。
この例は、アプリケーションのweb.xml
ファイルの次の構成に依存します。
<ejb-ref> <ejb-ref-name>ejb/DemoSession</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>ejbdemo.DemoSessionHome</home> <remote>ejbdemo.DemoSession</remote> </ejb-ref>
サンプル・コードは、次のとおりです。
<%@ page import="ejbdemo.*" %> <%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/ejbtaglib.tld" prefix="ejb" %> <html> <head> <title>Use EJB from JSP</title> </head> <body> <ejb:useHome id="home" type="ejbdemo.DemoSessionHome" location="java:comp/env/ejb/DemoSession" /> <ejb:useBean id="demo" type="ejbdemo.DemoSession" scope="session" > <ejb:createBean instance="<%=home.create()%>" /> </ejb:useBean> <heading2> Enterprise Java Bean: </heading2> <p><b> My name is "<%=demo.getName()%>". </b></p> </body> </html>
このサンプル・コードによって、次の内容が実行されます。
home
インスタンスを作成します。useHome
タグのtype
値は、web.xml
ファイルにある<ejb-ref>
要素の<home>
サブ要素の値と一致しています。また、useHome
タグのlocation
値は、<ejb-ref>
要素の<ejb-ref-name>
サブ要素の値を反映しています。
home.create()
メソッドを使用して、EJBのdemo
インスタンスを作成します。useBean
タグのtype
値は、web.xml
ファイルにある<ejb-ref>
要素の<remote>
サブ要素の値と一致しています。
demo.getName()
メソッドを使用してユーザー名を出力します。
この例は、アプリケーションのweb.xml
ファイルの次の構成に依存します。
<ejb-ref> <ejb-ref-name>ejb/DemoEntity</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <home>ejbdemo.DemoEntityHome</home> <remote>ejbdemo.DemoEntity</remote> </ejb-ref>
サンプル・コードは、次のとおりです。
<%@ page import="ejbdemo.*" %> <%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/ejbtaglib.tld" prefix="ejb" %> <html> <head> <title>Iterate over EJBs from JSP</title> </head> <body> <ejb:useHome id="home" type="ejbdemo.DemoEntityHome" location="java:comp/env/ejb/DemoEntity" /> <% int i=0; %> <ejb:iterate id="demo" type="ejbdemo.DemoEntity" collection="<%=home.findAll()%>" max="3" > <li> <heading2> Bean #<%=++i%>: </heading2> <b> My name is "<%=demo.getName()+"_"+ demo.getId()%>". </b> </li> </ejb:iterate> </body> </html>
このサンプル・コードによって、次の内容が実行されます。
home
インスタンスを作成します。useHome
タグのtype
値は、web.xml
ファイルにある<ejb-ref>
要素の<home>
サブ要素の値と一致しています。また、useHome
タグのlocation
値は、<ejb-ref>
要素の<ejb-ref-name>
サブ要素の値を反映しています。
home.findAll()
メソッドを使用してEJBのコレクションを戻します。iterate
タグのtype
値は、web.xml
ファイルにある<ejb-ref>
要素の<remote>
サブ要素の値と一致しています。
demo
を必ず使用します。また、demo.getName()
メソッドとdemo.getId()
メソッドを使用して各EJBの情報を出力します。
OC4Jには、多様な操作を実行するその他のユーティリティ・タグが多数あります。次の各項ではタグの詳細を説明します。
ユーティリティ・タグを使用する場合は、次の要件に注意してください。
ojsputil.jar
ファイルがインストール済で、クラスパスに存在していることを確認してください。このファイルは、OC4Jに同梱されていて、予約済のタグ・ライブラリ・ディレクトリにあります。
utiltaglib.tld
が、アプリケーションで使用可能である必要があります。また、ライブラリを使用するJSPページには、適切なtaglib
ディレクティブが存在する必要があります。Oracle Application Serverのインストール時、TLDはojsputil.jar
に配置されます。utiltaglib.tld
のuri
値は次のとおりです。
http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/utiltaglib.tld
taglib
ディレクティブ、予約済のタグ・ライブラリ・ディレクトリ、TLDファイルおよびuri
値の内容の詳細は、『Oracle Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。
注意
|
次の各項では、displayタグの構文と属性について説明します。
指定した金額を、ロケールに適切な通貨として書式化して表示します。ロケールを指定しないと、request
オブジェクトがロケールのかわりに検索されます。オブジェクトが検出されない場合は、システムのデフォルトのロケールが使用されます。
<util:displayCurrency amount = "<%=Double%>" [ locale = "<%=Locale%>" ] />
このタグは、ボディを使用しません。
<util:displayCurrency amount="<%=account.getBalance()%>" locale="<%=account.getLocale()%>" />
指定した日付をロケールに適した書式で表示します。ロケールを指定しない場合は、システムのデフォルトのロケールが使用されます。
<util:displayDate date = "<%=Date%>" [ locale = "<%=Locale%>" ] />
このタグは、ボディを使用しません。
<util:displayDate date="<%=account.getDate()%>" locale="<%=account.getLocale()%>" />
指定した数値をロケールに適した書式および必要に応じて指定した書式で表示します。ロケールを指定しない場合は、システムのデフォルトのロケールが使用されます。
<util:displayNumber number = "<%=Double%>" [ locale = "<%=Locale%>" ] [ format = "<%=Format%>" ] />
このタグは、ボディを使用しません。
number
(必須): 書式化する数値を指定します。
locale
: 必要に応じて、ロケールをjava.util.Locale
インスタンスとして指定します。
format
: 必要に応じて、書式をjava.text.Format
インスタンスとして指定します。
<util:displayNumber number="<%=shoe.getSize()%>" />
次の各項では、一般的なユーティリティ・タグの構文と属性について説明します。
このタグを使用してコレクション間を反復します。開始タグでコレクションを取得し、ボディでそれを反復します。
<util:iterate id = "instance_name" type = "class_name" collection = "<%=Collection%>" [ max = "<%=Integer%>" ] > ... body ... </util:iterate>
ボディは、コレクション内の各要素について一度評価されます。
id
(必須): イテレータ変数、つまり各反復のインスタンス名です。
type
(必須): クラス名です。つまり、コレクションはこの型の一連のインスタンスです。
collection
(必須): コレクション自体です。
max
: 反復する要素の最大数を必要に応じて指定します。
<util:iterate id="contact" type="com.acme.connections.Contact" collection="<%=company.getContacts()%>" > <jsp:getProperty name="contact" property="name"/> </util:iterate>
指定したアプリケーションのロールにユーザーが存在するかどうかに基づいて、タグ・ボディを評価し、JSPページのボディにインクルードします。タグ・ハンドラは、request
オブジェクトのisUserInRole()
メソッドを実行します。
ロールの概念はServlet仕様に基づいています。ロールは、アプリケーションのweb.xml
ファイルの<role>
要素に定義します。
<util:ifInRole role = "<%=String%>" [ include = "true" | "false" ] > ... body to include ... </util:ifInRole>
role
(必須): ユーザーが、この指定したロールに存在するかどうかをチェックします。
include
: 「true
」(デフォルト)に設定すると、ユーザーがロールに存在する場合にのみ、そのボディを含めます。「false
」に設定すると、ユーザーがロールに存在しない場合にのみ、そのボディを含めます。
<util:ifInRole role="users" include="true"> Logged in as <%=request.getRemoteUser()%><br> <form action="logout.jsp"> <input type="submit" value="Log out"><br> </form> </util:ifInRole> <util:ifInRole role="users" include="false"> <form method="POST"> Username: <input name="j_username" type="text"><br> Password: <input name="j_password" type="password"><br> <input type="submit" value="Log in"> </form> </util:ifInRole>
現行のファイルの最終変更日付を、ロケールに適切な書式で表示します。ロケールを指定しないと、request
オブジェクトがロケールのかわりに検索されます。オブジェクトが検出されない場合は、システムのデフォルトのロケールが使用されます。
<util:lastModified [ locale = "<%=Locale%>" ] />
このタグは、ボディを使用しません。
<util:lastModified />
|
Copyright © 2002, 2006 Oracle Corporation. All Rights Reserved. |
|