DATE : 2006/05/24 (Wed)
コンポーネント ID
DataScroller では、ページ単位で表示を行う一覧(DataTableなどのjavax.faces.component.UIData)を指定するために、そのコンポーネントの ID を t:dataScroller の for 属性に設定します。
例えば、「items」というコンポーネント ID の DataTable を DataScroller に指定するときは、次のようなコードになります。
(「...」の部分は省略部分です) ... <f:view> <f:form> <h:dataTable id="items" ...> ... </h:dataTable> <t:dataScroller for="items" ...> ... </t:dataScroller> </f:form> </f:view> ...
上の例では、1つの f:form 要素の中に h:dataTable 要素と t:dataScroller 要素があります。
しかし、 h:dataTable と t:dataScroller とで別々の f:form 要素が必要な場合はどうなるでしょうか。例えば、 h:dataTable では表内のボタンを押すと別ウィンドウで詳細な情報を表示し、 t:dataScroller のボタンを押すと同じウィンドウでページの切り替えを行うという場合です。素直に上記の例を書き換えると、次のようになります。
... <f:view> <f:form target="_blank"> <h:dataTable id="items" ...> ... </h:dataTable> </f:form> <f:form> <t:dataScroller for="items" ...> ... </t:dataScroller> </f:form> </f:view> ...
ところが、この例はうまく動作しません。 t:dataScroller 要素の for 属性である items が見つからないというエラーが出ます。
この理由は、コンポーネント ID は同じ階層で一意であれば良いという条件に基づきます。初めの例の場合、h:dataTable と t:dataScroller は同じ f:form 要素の直下にあるので同じ階層にあります。しかし、次の例では h:dataTable と t:dataScroller は別々の f:form 要素の直下にあるため、違う階層にあります。
同じ階層であればコンポーネント ID が一意ということは、逆に言えば階層が違えばコンポーネント ID は重複しても良いということになります。
これが、先程のエラーの原因です。for 属性で item という ID 持つ h:dataTable を指定したものの、t:dataScroller よりも上の階層や別の階層では ID が重複している可能性があるため、他の階層にある h:dataTable を特定できない仕様になっているのです。
そこで、ID の指定の仕方を少し変える必要がでてきます。
(つづきます)