表内のスタンプは、ユーザーが編集できるコントロールをレンダリングできます。たとえば、表の列のすべてのセルに編集可能なフォームの入力要素をレンダリングし、ユーザーがそれらのセルのデータを入力または変更できるようにする場合を考えます。各セルの一意の値がサーバーに確実に送信されるように、tableコンポーネントのnameTransformed属性をtrueに設定します。
名前変換が有効になっている場合、tableはその任意のスタンプのname属性を特別に扱い、指定のセルにスタンプをレンダリングする前に、その属性を変更します。たとえば、列スタンプが「foo」という名前の入力コントロールだった場合、表は各セルにレンダリングされる実際のname値を次の形式に変更します。
tableName:foo:rowIndex
ここで、tableName
はtableのname属性の値、また、rowIndex
はスタンプのレンダリング先となるのはどの行であるかを示す整数に置き換えられます。つまり、myTestTableという表の3行目にレンダリングされる「foo」という入力要素の名前は、次のようになります。
myTestTable:foo:3
次の例にあるように、表を含むフォームがナビゲーション・バー・リンクまたはその他のフォーム起動アクションの結果として送信されると、フォーム・コントロール名と初期値の4つのペアがサーバー側で受信されます。これらのペアがtextInput列の値です。
注意: 名前変換は表全体で無効にしなくても、列単位で無効にすることができます。columnコンポーネントはnameTransformed属性も持っています。デフォルトでは、表のnameTransformed
がfalseに設定されていなければ、列単位での名前変換は有効になっています。
...
<dataScope ... >
<provider>
...
</provider>
<contents>
<form name="testForm">
<contents>
<table name="myTestTable" ... >
<contents>
<column>
<columnHeader>First Header</columnHeader>
<contents>
<textInput text="${uix.current.firstColumnText}" name="foo"/>
</contents>
</column>
<column>
<columnHeader>Second Header</columnHeader>
<contents>
<button text="${uix.current.secondColumnText}" destination="http://www.example.com"/>
</contents>
</column>
</contents>
</table>
</contents>
</form>
</contents>
</dataScope>
...
UIXには、値が送信された後にサーバーで値を取得するためのユーティリティ・クラスも用意されています。次のユーティリティ・クラスが用意されています。
これらのクラスはそれぞれ、指定された表のすべての入力要素によるDataObjectListを実装します。このリストの長さは、表の行数と同じです。リスト内の各DataObjectは表の行に対応しています。入力要素のnameを(各DataObjectで)キーとして使用し、(各行の)その要素の値を取得できます。
次の例では、表の入力要素すべての値を取得して連結するイベント・ハンドラを実装しています。
Example:
public static EventResult doSubmitEvent(BajaContext bc, Page page,
PageEvent event)
{
// create a new FlattenedDataSet for the table "myTestTable"
DataSet tableInputs = new PageEventFlattenedDataSet(event, "myTestTable");
StringBuffer s = new StringBuffer(40);
// this would be the number of rows in the table
int sz = tableInputs.getLength();
for(int i=0; i<sz ;i++)
{
// get the DataObject representing all the input elements on the current
// table row.
DataObject row = tableInputs.getItem(i);
// get the value of the input element named "foo". we can safely use
// null for the RenderingContext here:
Object value = row.selectValue(null, "foo");
s.append(value);
}
EventResult result = new EventResult(page);
result.setProperty("case", "submit");
// store the concatenation of the values of all the "foo" elements on the
// EventResult
result.setProperty("result", s);
return result;
}
自動的に行われる名前変換の使用が好ましくない場合もあります。たとえば、列の垂直方向にラジオ・ボタン・グループをレンダリングする場合は、(各radio要素が同じグループに属し、相互に排他的となるよう)radio要素を同じ名前にする必要があります。現在のところ、これを実行する唯一の方法は、自動的に行われる名前変換を無効にし(tableコンポーネントのnameTransformed属性をfalseに設定し)、各name属性をデータ・バインドすることにより名前変換をプライベートに処理することです。
それでもPageEventFlattenedDataSet(またはServletRequestDataSet)を使用してサーバー上でデータを取得する場合は、oracle.cabo.ui.data.FlattenedDataSetを使用してすべての表の入力要素を変換する必要があります。myTestTableという表の5行目の入力要素foo
を変換するには、次のように指定します。
String newName = FlattenedDataSet.getFlattenedName("myTestTable", 5, "foo");
radioという特別なラジオ・グループ列を変換するには、次のように指定します。
String newName = FlattenedDataSet.getFlattenedName("myTestTable", "radio");
DataSet tableInputs = new PageEventFlattenedDataSet(event, "myTestTable");
Object radioValue = tableInputs.selectValue(null, "radio");
Copyright © 1997, 2004, Oracle. All rights reserved.