今日もJSFではまる。NetBeansの問題というよりはJSFのRIの問題・・・かな?
JSFは綺麗にライフサイクルどおりに動くことになるのでかなり融通がきかない、というお話。
画面にドロップダウンリスト、データテーブルがあったとしよう。そしてそのデータテーブル内にアクションボタンまたは、アクションリンクを置く。いわゆる明細画面へのリンクアクションなどを起こすためのものだ。
その状態でドロップダウンリストが更新されたら、データテーブルをその値によって表示内容を変える。
いたって普通のアプリの流れだと思う。問題はこのあと。
JSFのライフサイクルの流れではドロップダウンリストの結果によって表示内容に差がある場合、そのアクションが呼ばれないことがあるのだ。具体的にはアプライ・リクエスト・バリュー・フェーズでその動的に生成されたボタンのイベントを用意するためだ。
つまり、前の画面でデータテーブルで2行表示されていたとして、ドロップダウンリストの結果3行表示されたとすると、最初の2行のみイベントが発火するのだ。3つ目は無反応。
少なくともRIは無理。
解決方法はVisualWebJSFの場合、AbstractPageBeanを継承していると思う。そこで
protected void beforeApplyRequestValues()
を継承してここにデータテーブルの明細を設定すること。その際ドロップダウンの値は直接リクエストパラメータから取得すること。
バッドノウハウばっかりたまるけど、仕方がない。