ビジネス・コンポーネント・データ・タグを使用したデータのレンダリングについて

ビジネス・コンポーネント・データソース用のHTMLレンダラには、次の2つのタイプがあります。

ビジネス・コンポーネント・データ・タグでは、次の操作を実行したときにこれらのHTMLレンダラが使用されます。

カスタムHTMLレンダラのサポート

特定の属性のレンダリングをカスタマイズするために、カスタムHTMLレンダラ・クラスを作成できます。カスタムHTMLレンダラ・クラスにより、oracle.jdeveloper.html.HTMLFieldRendererImplクラスが拡張されます。カスタムHTMLレンダラ・クラスの作成後、このレンダラ・クラスはレンダリング対象の属性にバインドする必要があります。

レンダラと属性のバインディングのレベル

レンダラと属性のバインディングには、次の5つの異なるタイプがあります。

各レベルのバインディングには、固有レベルの優先順位と有効範囲があります。

必要に応じて、レンダラ・クラスをこれらのいずれかのレベルにバインドできます。

HTTPセッション・レベルのバインディング

HTTPセッション・レベルのバインディングは最も優先順位が低くなりますが、有効範囲は最も広くなります。Oracle Business Componentsでは、属性タイプのデフォルトのバインディングはこのレベルに設定されます。interMediaレンダラ・クラスおよびinterMediaタイプのデフォルトのバインディングは、このレベルで定義されます。このバインディングの規則は、次のとおりです。

バインディングの名前フィールドは、属性クラス名とレンダラ・キー(RendererまたはEditRenderer)をあわせたものです。バインディングの値フィールドは、レンダラ・クラス名です。バインディングの名前フィールドでは、アンダースコア(_)を使用して完全なクラス名のドット(.)を置き換えてから、_Renderer(表示レンダラの場合)または_EditRenderer(編集レンダラの場合)を付けます。

次はその例です。

"oracle_ord_im_OrdImageDomain_Renderer"/"oracle.ord.html.OrdBuildURLRenderer"

これは、HTTP sessionオブジェクトに格納される名前と値のペアです。つまり、oracle.ord.im.OrdImageDomainオブジェクトの表示レンダラがoracle.ord.html.OrdBuildURLRendererのオブジェクトであることを意味します。

もう1つ例を示します。

"oracle_ord_im_OrdImageDomain_EditRenderer"/"oracle.ord.html.OrdUploadFileRenderer"

これは、oracle.ord.im.OrdImageDomainオブジェクトの編集レンダラがoracle.ord.html.OrdUploadFileRendererのオブジェクトであることを意味します。

これより上位のレベルのバインディングがない場合、ビジネス・コンポーネントはoracle.ord.im.OrdImageDomainオブジェクトをレンダリングする必要があるため、VOまたはEOに属す属性とは関係なく、表示レンダラにはoracle.ord.html.OrdBuildURLRenderer、編集レンダラにはoracle.ord.html.OrdUploadFileRendererを使用します。

カスタム・レンダラ・クラスを設定するには、HTTP sessionオブジェクトの名前と値のペアを変更します。次のコードSnippetでは、oracle.ord.im.OrdImageDomainの表示レンダラをuser.CustomRendererに設定しています。

session.putValue("oracle_ord_im_OrdImageDomain_Renderer", "user.CustomRenderer");

エンティティ・オブジェクト・レベルのバインディング

エンティティ・オブジェクト・レベルのバインディングは、HTTPセッション・レベルのバインディングより優先されます。ただし、バインディングの有効範囲は制限されます。このバインディングが影響するのは、エンティティ・オブジェクトに定義されている属性のみです。

たとえば、HTTPセッション・レベルでは、OrdBuildURLRendererが表示レンダラとしてOrdImageDomainにバインドされています。エンティティ・オブジェクト・レベルでは、CustomRendererがEmpエンティティ・オブジェクトのphoto属性にバインドされています。photo属性は、OrdImageDomainタイプです。JSPページにphoto属性が表示される場合、ビジネス・コンポーネント・ランタイムはCustomRendererを選択し、OrdImageDomainオブジェクトをレンダリングします。ただし、Productエンティティ・オブジェクトにpicture属性がある場合、ビジネス・コンポーネント・ランタイムはOrdBuildURLRendererをそのまま使用し、picture属性をレンダリングします。

エンティティ・オブジェクト・レベルのバインディングを設定するには、ユーザーは次の手順を実行する必要があります。

  1. 「アプリケーション・ナビゲータ」で、エンティティ・オブジェクトをクリックします。

    「アプリケーション・ナビゲータ」(「構造」 ウィンドウ)の最下部に属性リストが表示されているのがわかります。

  2. 属性を右クリックし、「編集」を選択します。
  3. 「プロパティ」タブをクリックします。
  4. 表示レンダラの場合、「名前」フィールドには「Renderer」「値」フィールドには「user.CustomRenderer」と入力します。編集レンダラの場合、「名前」フィールドには「EditRenderer」「値」フィールドには「user.CustomRenderer」と入力します。「追加」をクリックします。
  5. 「終了」をクリックします。エントリがエンティティ・オブジェクトのxmlファイルに追加されたことがわかります。

ビュー・オブジェクト・レベルのバインディング

ビュー・オブジェクト・レベルのバインディングは、エンティティ・オブジェクト・レベルのバインディングより優先されます。ただし、バインディングの有効範囲はさらに制限されます。このバインディングが影響するのは、ビュー・オブジェクトに定義されている属性のみです。

たとえば、Emp1ViewとEmp2Viewという、Empエンティティ・オブジェクトに基づく2つのビュー・オブジェクトがあります。ビュー・オブジェクト・レベルでは、CustomRenderer1がEmp1Viewビュー・オブジェクトのphotoにバインドされています。エンティティ・オブジェクト・レベルでは、CustomRenderer2がEmpエンティティ・オブジェクトのphoto属性にバインドされています。photo属性は、OrdImageDomainタイプです。JSPページにEmp1Viewのphoto属性が表示される場合、ビジネス・コンポーネント・ランタイムはCustomRenderer1を選択し、OrdImageDomainオブジェクトをレンダリングします。ただし、Emp2Viewビュー・オブジェクトにpicture属性がある場合、ビジネス・コンポーネント・ランタイムはCustomRenderer2をそのまま使用し、picture属性をレンダリングします。

ビュー・オブジェクト・レベルのバインディングを設定するには、ユーザーは次の手順を実行する必要があります。

  1. 「アプリケーション・ナビゲータ」で、ビュー・オブジェクトをクリックします。

    「アプリケーション・ナビゲータ」(「構造」 ウィンドウ)の最下部に属性リストが表示されているのがわかります。

  2. 属性を右クリックし、「編集」を選択します。
  3. 「プロパティ」タブをクリックします。
  4. 表示レンダラの場合、「名前」フィールドには「Renderer」「値」フィールドには「user.CustomRenderer」と入力します。編集レンダラの場合、「名前」フィールドには「EditRenderer」「値」フィールドには「user.CustomRenderer」と入力します。「追加」をクリックします。
  5. 「終了」をクリックします。エントリがビュー・オブジェクトのxmlファイルに追加されたことがわかります。

ビジネス・コンポーネント・データ・タグ・レベルのバインディング

ビジネス・コンポーネント・データ・タグでは、データおよびHTMLレンダラ・オブジェクトにアクセスするためにデータソース・オブジェクトが使用されるため、データソースを使用してHTMLレンダラを設定できます。データソース・オブジェクトの有効範囲はHTTP REQUESTです。データ・タグ・レベルのバインディングは、ビュー・オブジェクト、エンティティ・オブジェクトおよびHTTPセッション・レベルのバインディングより優先されます。このレベルのバインディングは、現在の有効範囲であるHTTP REQUEST内のこのデータソース・オブジェクトを使用するすべてのデータ・タグに影響します。

public interface DataSource {
   public void setDisplayFieldRenderer(AttributeDef attrDef, HTMLFieldRenderer rdr);
   public void setDisplayFieldRenderer(int nIndex, HTMLFieldRenderer rdr);
   public void setEditFieldRenderer(AttributeDef attrDef, HTMLFieldRenderer rdr);
   public void setEditFieldRenderer(int nIndex, HTMLFieldRenderer rdr);
}        

次の例は、user.CustomRendererと呼ばれるカスタムHTMLレンダラをビジネス・コンポーネントのRenderValueデータ・タグに設定する方法を示します。JSPページはDataTableComponent.jspです。このJSPページがDataTableタグによって使用されることにより、レコードが表示されます。RenderValueタグによって使用されるデータソース・オブジェクトには、HTMLレンダラ・オブジェクトを設定する必要があります。この例では、RenderValueタグによってdsBrowseと呼ばれるデータソース・オブジェクトが使用されるため、レンダラ・オブジェクトをこのdsBrowseデータソース・オブジェクトに設定する必要があります。

 <%@ page language="java" import = "oracle.jbo.html.*" %>
 <%@ taglib uri="/webapp/BC4J data tags.tld" prefix="jbo" %>
 <%
   RequestParameters params = HtmlServices.getRequestParameters(pageContext); 
   String appidParam = params.getParameter("appid");
   String voParam = params.getParameter("viewobject");
   String editTargetParam = params.getParameter("edittarget");
   String originURLParam = params.getParameter("originURL");
 %>

 <jbo:DataSource id="dsBrowse" appid="<%=appidParam%>" viewobject="<%=voParam%>"/>
   <%
    oracle.jbo.html.DataSource cacheDS = (oracle.jbo.html.DataSource)
    pageContext.findAttribute("dsBrowse");
    cacheDS.setDisplayFieldRenderer(1, new user.CustomRenderer());
   %>
  
 <jbo:OnEvent name="delete">
    <jbo:Row id="delrow" datasource="dsBrowse" rowkeyparam="RowKey"
          action="Delete" />
    <jbo:Commit appid="<%=appidParam%>"/>
 </jbo:OnEvent>
  
 <table class="clsTable" cellspacing="1" cellpadding="3">
   <tr class="clsTableRow">
    <% if (editTargetParam != null && !editTargetParam.equalsIgnoreCase("null"))
       { %>
       <th class="clsTableHeader">&nbsp</th>
       <th class="clsTableHeader"><a href="<jbo:UrlEvent targeturlparam='edittarget' 
                 event='Create' datasource='dsBrowse' extraparameters='<%="originURL=" + params.getParameter("originURL")%>'/>">New</a></th> <% 
       } %>
  
    <jbo:AttributeIterate id="df" datasource="dsBrowse">
     <th title="<jbo:ShowHint hintname='TOOLTIP'/>" class="clsTableHeader"><jbo:ShowHint hintname="LABEL">##Column</jbo:ShowHint></th>
    </jbo:AttributeIterate>
   </tr>
  
   <jbo:RowsetIterate datasource="dsBrowse" changecurrentrow="false" >
    <tr class="clsTableRow">
      <% if (editTargetParam != null && !editTargetParam.equalsIgnoreCase("null"))
         { %>
           <td> <a href="<jbo:UrlEvent targeturlparam='originURL' event='Delete' datasource='dsBrowse' addrowkey='true'/>">Delete</a> </td>
           <td> <a href="<jbo:UrlEvent targeturlparam='edittarget' event='Edit' datasource='dsBrowse' addrowkey='true' 
		                               extraparameters='<%="originURL=" + params.getParameter("originURL")%>'/>">Edit</a> </td> <%
         }
      %>
   <jbo:AttributeIterate id="dfv" datasource="dsBrowse">
     <td title="<jbo:ShowHint hintname='TOOLTIP'/>" > 
           <jbo:RenderValue datasource="dsBrowse">##Cell</jbo:RenderValue> 
     </td>
    </jbo:AttributeIterate>
    </tr>
   </jbo:RowsetIterate>
 </table>        

ビジネス・コンポーネント・データ・タグについて
ビジネス・コンポーネント・マルチメディア・データ・タグについて

ビジネス・コンポーネント・データ・タグを使用したマルチメディア・コンテンツのレンダリング