Business Components for JavaフレームワークでのHTMLレンダラについて

レンダラは、ビジネス・コンポーネント・ドメイン、エンティティ属性またはビュー属性のレベルで定義できるプロパティです。ビジネス・コンポーネント・プロジェクトで定義できるHTMLレンダラには、次の2つのタイプがあります。

NUMBER型やVARCHAR2型などの列型に対応するテキスト属性の場合、デフォルトの表示レンダラはこれらの属性値を文字列として表示します。デフォルトの編集レンダラは、テキスト値の入力に対して<INPUT TYPE="TEXT"> HTMLタグを出力します。

interMediaのORDIMAGE属性に対しては、デフォルトのinterMedia表示レンダラ(oracle.ord.html.OrdBuildURLRenderer)は、ブラウザにイメージが表示されるように<IMG> HTMLタグを出力します。デフォルトのinterMedia編集レンダラ(oracle.ord.im.OrdUploadFileRenderer)は、ファイルのアップロード用に<INPUT TYPE="FILE"> HTMLタグを出力します。その他のinterMedia型の属性に対しては、デフォルトのinterMedia表示レンダラはHTMLアンカー・タグを出力し、デフォルトのinterMedia編集レンダラはファイルのアップロード用に<INPUT TYPE="FILE"> HTMLタグを出力します。

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

カスタムHTMLレンダラ・クラスを記述し、特定の属性のレンダリングをカスタマイズできます。カスタムHTMLレンダラ・クラスは、oracle.jdeveloper.html.HTMLFieldRendererImplクラスを拡張する必要があります。カスタムHTMLレンダラ・クラスの作成後、レンダリングするビジネス・コンポーネン・ドメインまたは属性にこのレンダラ・クラスをバインドできます。

レンダラと属性のバインド・レベル

レンダラと属性のバインドには、次の6種類があります。

レンダラの影響範囲は各レベルで異なります。ドメイン・クラスを作成してレンダラを設定した場合、そのドメインを使用するすべてのエンティティ・オブジェクトは、自動的にすべてのビュー・オブジェクトにレンダラ・プロパティを伝播します。そのため、属性のレンダリング方法を一元的に指定することができます。エンティティ・オブジェクト属性レベルでレンダラ・プロパティを指定した場合も、同じ結果が得られます。この方法は、1つのエンティティのみにこの設定が必要な場合に便利です。この特別なユーザー・インタフェースが1つのビュー・オブジェクトのみに必要な場合、ビュー・オブジェクト属性レベルでプロパティ値を設定できます。

各レベルのバインドの優先順位と影響範囲をまとめると、次のようになります。

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

HTTPセッション・レベルのバインド

HTTPセッション・レベルのバインドは、最も優先順位が低くなります。ただし影響範囲は最も広範です。BC4Jフレームワークでは、属性タイプに対するデフォルトのバインドはこのレベルで行われます。interMediaレンダラ・クラスとinterMedia型のデフォルトのバインドは、このレベルで定義されます。バインドの規則は、次のとおりです。

バインドの名前フィールドには、属性クラス名とレンダラ・キー(RendererまたはEditRenderer)を指定します。バインドの値フィールドには、レンダラ・クラス名を指定します。バインドの名前フィールドでは、クラス名の"."を"_"で置き換えた後、表示レンダラの場合は"_Renderer"、編集レンダラの場合は"_EditRenderer"を追加します。

次に例を示します。

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

このような名前と値のペアをHTTPセッション・オブジェクトに格納します。これは、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オブジェクトであることを意味しています。

優先順位の高いレベルのバインドがない場合、BC4Jフレームワークでは、oracle.ord.im.OrdImageDomainオブジェクトのレンダリングが必要になると、属性がビュー・オブジェクトまたはエンティティ・オブジェクトのどちらに属すかにかかわらず、表示レンダラにoracle.ord.html.OrdBuildURLRenderer、編集レンダラにoracle.ord.html.OrdUploadFileRendererが使用されます。

HTTPセッション・オブジェクトの名前と値のペアを変更することにより、カスタム・レンダラ・クラスを設定できます。次のコードは、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属性を表示する際、BC4JランタイムはCustomRendererを使用してOrdImageDomainオブジェクトをレンダリングします。ただし、Productエンティティ・オブジェクトにphoto属性がある場合、BC4JランタイムはOrdBuildURLRendererを使用してphoto属性をレンダリングします。

エンティティ・オブジェクト・レベルのバインドを設定するには、次のようにします。

  1. ナビゲータでエンティティ・オブジェクトをクリックします。

    構造ウィンドウに、エンティティ・オブジェクトの属性のリストが表示されます。

  2. 属性を右クリックし、「編集」を選択します。
  3. 「プロパティ」タブをクリックします。
  4. 表示レンダラのプロパティを定義する場合、「名前」フィールドにRendererと入力します。
  5. 編集レンダラのプロパティを定義する場合、「名前」フィールドにEditRendererと入力します。
  6. 「値」フィールドに、レンダラの完全修飾クラス名(user.CustomRendererなど)を入力します。
  7. 「追加」をクリックします。
  8. 「名前」フィールドで、レンダラが使用するプロパティを定義します。たとえば、属性の表示値として利用する静的なリストを作成する場合は、「名前」フィールドでDISPLAY_LISTと入力します。
  9. 「値」フィールドで、レンダラのプロパティの値を定義します。たとえば、DISPLAY_LISTプロパティの場合、<データ値>=<表示値>,<データ値>=<表示値>のように値を指定します。
  10. 「追加」をクリックします。
  11. 「終了」をクリックします。エンティティ・オブジェクトのXMLファイルにプロパティが追加されます。

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

ビュー・オブジェクト・レベルのバインドは、エンティティ・オブジェクト・レベルのバインドより優先されます。ただし、バインドの影響範囲はさらに狭くなります。対象となるのは、ビュー・オブジェクトに定義されている属性のみです。

たとえば、Emp1ViewEmp2Viewという、Empエンティティ・オブジェクトをベースにした2つのビュー・オブジェクトがあるとします。ビュー・オブジェクト・レベルでは、CustomRenderer1がEmp1Viewビュー・オブジェクトのphoto属性にバインドされているとします。エンティティ・オブジェクト・レベルで、CustomRenderer2がEmpエンティティ・オブジェクトのphoto属性にバインドされているとします。photo属性は、OrdImageDomain型です。この場合、JSPページでEmp1Viewphoto属性を表示する際、BC4JランタイムはCustomRenderer1を使用してOrdImageDomainオブジェクトをレンダリングします。ただし、Emp2Viewビュー・オブジェクトにphoto属性がある場合、BC4JランタイムはCustomRenderer2を使用してphoto属性をレンダリングします。

ビュー・オブジェクト・レベルのバインドを設定するには、次のようにします。

  1. ナビゲータでビュー・オブジェクトをクリックします。

    構造ウィンドウに、エンティティ・オブジェクトの属性のリストが表示されます。

  2. 属性を右クリックし、「編集」を選択します。
  3. 「プロパティ」タブをクリックします。
  4. 表示レンダラのプロパティを作成する場合、「名前」フィールドにRendererと入力します。
  5. 編集レンダラのプロパティを作成する場合、「名前」フィールドにEditRendererと入力します。
  6. 「値」フィールドに、レンダラの完全修飾クラス名(user.CustomRendererなど)を入力します。
  7. 「追加」をクリックします。
  8. 「名前」フィールドで、レンダラが使用するプロパティを定義します。たとえば、属性の表示値として利用する静的なリストを作成する場合は、「名前」フィールドでDISPLAY_LISTと入力します。
  9. 「値」フィールドで、レンダラのプロパティの値を定義します。たとえば、DISPLAY_LISTプロパティの場合、<データ値>=<表示値>,<データ値>=<表示値>のように値を指定します。
  10. 「追加」をクリックします。
  11. 「終了」をクリックします。ビュー・オブジェクトのXMLファイルにプロパティが追加されます。

Data Web Beanレベルのバインド

Data Web Beanレベルのバインドは、最も優先順位が高くなります。このレベルのバインドは、特定のData Web Beanインスタンスのレンダリングのみを制御します。したがって、影響範囲は最も狭くなります。

Data Web Beanに対しては、次のメソッドを使用してHTMLレンダラを設定できます。


  public interface DataWebBean extends WebBean {
    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);
  }

次の例は、ViewCurrentRecordオブジェクトにHTMLレンダラを設定する方法を示しています。


  <jbo:DataWebBean id="RowViewer" datasource = "ds" wbclass="oracle.jbo.html.databeans.ViewCurrentRecord">
  <%
   RowViewer.setDisplayFieldRenderer(2, new CustomRenderer());
   RowViewer.render();
  %>
  </jbo:DataWebBean>
  <%
  %>

BC4Jデータ・タグ・レベルのバインド

BC4Jデータ・タグは、データおよびHTMLレンダラ・オブジェクトへのアクセスにDataSourceが使用されているため、ユーザーはDataSourceを使用してHTMLレンダラを設定できます。DataSourceオブジェクトにはHTTP REQUESTスコープがあります。データ・タグ・レベルのバインドは、ビュー・オブジェクト・レベル、エンティティ・オブジェクト・レベルおよびHTTPセッション・レベルのどのバインドよりも優先されます。現行のHTTP REQUESTスコープ内にある、このDataSourceオブジェクトを使用するすべてのデータ・タグが対象となります。



  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タグで使用するDataSourceオブジェクトに、HTMLレンダラ・オブジェクトを設定する必要があります。この例では、RenderValueタグがdsBrowseというDataSourceオブジェクトを使用しているため、レンダラ・オブジェクトをこのdsBrowseというDataSourceオブジェクトに設定します。



 <%@ page language="java" import = "oracle.jbo.html.*" %>
 <%@ taglib uri="/webapp/DataTags.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="<%=editTargetParam%>?jboEvent=Create&originURL=<%=originURLParam%>">New</a></th>
    <% } %>

    <jbo:DefinitionIterate id="df" datasource="dsBrowse">
     <th class="vrTableHeader"><jbo:ShowDefinition
        definition="name">##Column</jbo:ShowDefinition></th>
    </jbo:DefinitionIterate>
   </tr>

   <jbo:RowsetIterate datasource="dsBrowse" changecurrentrow="false" >
    <tr class="clsTableRow">
      <% if (editTargetParam != null && !editTargetParam.equalsIgnoreCase("null"))
         { %>
           <td class="tablecell"><a
           href="<%=originURLParam%>?jboEvent=Delete&RowKey=<jbo:ShowValue
           datasource="dsBrowse" dataitem="RowKey"/>">Delete</a></td>
           <td class="tablecell"><a href="<%=editTargetParam%>?RowKey=<jbo:ShowValue
           datasource="dsBrowse"
           dataitem="RowKey"/>&originURL=<%=originURLParam%>">Edit</a></td>
      <% } %>

    <jbo:DefinitionIterate id="dfv" datasource="dsBrowse">
     <td class="tablecell"><jbo:RenderValue
       datasource="dsBrowse">##Cell</jbo:RenderValue></td>
    </jbo:DefinitionIterate>

    </tr>
   </jbo:RowsetIterate>
 </table>