| 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. |
|