ビジネス・コンポーネントのデータソース用のHTMLレンダラには、次の2つのタイプがあります。
BC4Jデータ・タグでは、次のような場合にこれらのHTMLレンダラが使用されます。
注意: 属性データを表示する場合、HTMLレンダラのかわりに、ShowValueデータ・タグを使用することもできます。ShowValueデータ・タグが単純なテキストBC4Jデータを表示するのに対し、RenderValueデータ・タグは日付やオブジェクトなど、どのような種類のデータでも表示します。
カスタムHTMLレンダラ・クラスを記述し、特定の属性のレンダリングをカスタマイズできます。カスタムHTMLレンダラ・クラスは、oracle.jdeveloper.html.HTMLFieldRendererImpl
クラスを拡張して作成します。カスタムHTMLレンダラ・クラスの作成後、レンダリングする属性にこのレンダラ・クラスをバインドします。
レンダラと属性のバインドには、次の4種類があります。
各レベルのバインドの優先順位とスコープは、それぞれ異なります。
この中から、レンダラ・クラスをバインドするレベルを必要に応じて選択できます。
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セッション・オブジェクトの名前と値のペアを変更することにより、カスタム・レンダラ・クラスを設定できます。次のコード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属性を表示する際、BC4JランタイムはCustomRendererを使用してOrdImageDomainオブジェクトをレンダリングします。ただし、Productエンティティ・オブジェクトにpicture属性がある場合、BC4JランタイムはOrdBuildURLRendererを使用してpicture属性をレンダリングします。
エンティティ・オブジェクト・レベルのバインドを設定するには、次のようにします。
ナビゲータの下の部分(構造ウィンドウ)に、属性のリストが表示されます。
Renderer
、「値」フィールドにuser.CustomRenderer
と入力します。編集レンダラの場合、「名前」フィールドにEditRenderer
、「値」フィールドにuser.CustomRenderer
と入力します。「追加」をクリックします。ビュー・オブジェクト・レベルのバインド
ビュー・オブジェクト・レベルのバインドは、エンティティ・オブジェクト・レベルのバインドより優先されます。ただし、バインドのスコープはさらに狭くなります。対象となるのは、ビュー・オブジェクトに定義されている属性のみです。
たとえば、Emp1ViewとEmp2Viewという、Empエンティティ・オブジェクトをベースにした2つのビュー・オブジェクトがあるとします。ビュー・オブジェクト・レベルでは、CustomRenderer1がEmp1Viewビュー・オブジェクトのphoto属性にバインドされているとします。エンティティ・オブジェクト・レベルでは、CustomRenderer2がEmpエンティティ・オブジェクトのphoto属性にバインドされているとします。photo属性はOrdImageDomainタイプです。JSPページでEmp1Viewのphoto属性を表示する際、BC4JランタイムはCustomRenderer1を使用してOrdImageDomainオブジェクトをレンダリングします。ただし、Emp2Viewビュー・オブジェクトにpicture属性がある場合、BC4JランタイムはCustomRenderer2を使用してpicture属性をレンダリングします。
ビュー・オブジェクト・レベルのバインドを設定するには、次のようにします。
ナビゲータの下の部分(構造ウィンドウ)に、属性のリストが表示されます。
Renderer
、「値」フィールドにuser.CustomRenderer
と入力します。編集レンダラの場合、「名前」フィールドにEditRenderer
、「値」フィールドにuser.CustomRenderer
と入力します。「追加」をクリックします。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レンダラをBC4J RenderValueデータ・タグに設定する方法を示しています。JSPページはDataTableComponent.jsp
です。このJSPページは、DataTableタグによりレコードの表示に使用されます。RenderValueタグで使用するDataSourceオブジェクトに、HTMLレンダラ・オブジェクトを設定する必要があります。この例では、RenderValueタグがdsBrowse
というDataSourceオブジェクトを使用しているため、レンダラ・オブジェクトをこのdsBrowse
というDataSourceオブジェクトに設定します。
<%@ 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"> </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>