- PR -

[JSF]予期せぬ画面遷移

1
投稿者投稿内容
F.W.K.
会議室デビュー日: 2006/09/09
投稿数: 5
投稿日時: 2006-09-12 19:14
 こんにちは。先頃の問題が解決して間も無く質問致す事となり大変恐縮ですが、再びJSFについて皆様のお知恵を拝借したく、書き込み致します。

 当方のシステムで、レコード一覧画面に<t:dataTable>タグによる表を備えています。<f:facet>タグで各列にヘッダを設け、ListDataModelに検索結果レコードのデータラッパークラス配列を格納して表示しています。
 このヘッダ部に<h:commandLink>タグでソートメソッドを呼ぶリンクを備えています。ソートメソッドは<f:param>タグに格納したソートキー名をExternalContext#getRequestParameterMap()で取得して、キーに応じてSQLを変えて再検索を行うものです。
 ソートの昇順・降順を表示するべく、現在のソート内容をセッションに記憶して、それに応じて<h:commandLink>のrendered属性を利用しソートリンクの文字を切り替える仕組みも備えています。

 しかし、上記を実装してソート処理を行ったところ、1回目の昇順ソート処理は正常に動作するにもかかわらず、2回目の降順ソート処理を行おうとすると何も検索せずに自画面を表示してしまいます。他にも、dataTable表内のレコード詳細画面への遷移ボタンや、<t:dataScroller>タグのページ送り処理でも同様に、画面遷移せず自画面を検索結果なしで表示してしまいます。
 Java Solution会議室の過去ログを参考にして、<h:messages>タグを入れてPhaseListenerの監視も行いましたが、messagesにエラーは何も表示されず、フェイズは6フェイズとも実行されているようです。faces-config.xmlにも誤りは見られませんでした。
 ただし、詳細画面への遷移処理の際には、RESTORE_VIEWフェイズで対象の詳細画面ではなく自画面を対象にしていました。また、バッキングビーンの各メソッドにログ出力を行わせたところ、一覧画面を検索結果なしで表示する際には一覧画面のバッキングビーンについてコンストラクタと表示に要するGETTERメソッドのみを実行し、ソートなどのメソッドを実行していないことも分かりました。詳細画面表示ボタンは詳細画面のバッキングビーンのメソッドを呼んでいるにも関わらず、一覧画面のコンストラクタのみが呼ばれています。

 ソートについては、生成HTMLソースを調べたところ、レンダリングで切り替えた昇順と降順のソートリンクはそれぞれ別のIDがJSFによって自動付与されており、レンダリング切り替えを実施せず昇順と降順の両方のリンクを同時に表示すれば正しくソートできました。そのため、rendered属性を使わずバッキングビーンの値でリンクの文字を切り替えるよう検討しております。しかし、詳細画面や<t:dataScroller>といった画面遷移異常は以前未解決です。

 上記のように、<h:messages>タグやPhaseListenerで追えない画面遷移異常をいかにして解決するか、ご指南をよろしくお願い致します。

[ メッセージ編集済み 編集者: F.W.K. 編集日時 2006-09-12 20:33 ]

[ メッセージ編集済み 編集者: F.W.K. 編集日時 2006-09-12 20:37 ]
F.W.K.
会議室デビュー日: 2006/09/09
投稿数: 5
投稿日時: 2006-09-13 22:05
 上記内容について調査を行っております。
 ソートについてはrendered属性による書き換えを行わず、リンクの文字列をバッキングビーンに持たせることで正常動作を確認しました。<t:dataScroller>はテーブルの上にボタンを表示できない問題を回避するため使わないことになりそうです。
 ただし、詳細画面への遷移だけが動作しない状態が続いています。

 アドバイスを受け、tomahawk関連のタグを全てJSFの基本タグに戻した上で、<h:dataTable>の外に詳細画面への遷移ボタンを設置しました。
 バッキングビーンから呼ばれるコマンドクラスで、ListDataModel#getRowData()で選択行のデータクラスを取得してそのレコードの詳細検索を行う手法のため、行の選択がない場合には固定のIDを渡して詳細検索を行い画面遷移するようにしました。
 すると、詳細画面への遷移と詳細レコードの表示は問題なく行われていました。<h:CommandButton>タグのaction属性はコピーして使ったため、faces-config.xmlの誤りやJSPの誤記ではないようです。
 また、バッキングビーンのロギングとPhaseListenerとを組み合わせて処理を追ったところ、やはり表内のボタンの場合のみ詳細画面のバッキングビーンが呼ばれていないようです。

 MyFaces1.1.1固有の問題などありましたら、バージョン変更で解決しない限り、CommandLinkに変更の上param属性で選択行を指示するなどしか解決法がないのではとも思っています。
 dataTable及びListDataModelとの組み合わせの場合のみアクションメソッドが動作しないというこの現象について、ご存知でしたらご指南をよろしくお願いします。
F.W.K.
会議室デビュー日: 2006/09/09
投稿数: 5
投稿日時: 2006-09-14 11:15
 上記の件について自己解決致しましたためご報告します。

 一覧画面のListDataModelから詳細画面へデータを渡せない問題は、バッキングビーン初期化によりListDataModelも初期化されることで、詳細画面へ渡るはずだったデータが消去されていることが原因でした。
 リーダの指示によりバッキングビーンのスコープを全てrequestにしていたため、一覧画面の初期化が発生していました。スコープを変更せずに解決することも兼ねて他の要件を満たすために、コンストラクタに一覧検索処理を備えたところ、正常に詳細画面が表示できました。

 PhaseListenerとバッキングビーン動作の監視でこの原因に気づく事ができましたため、皆様に助けて頂いたことに変わりありません(他の書き込みに倣いバッキングビーンをsessionスコープで用いればそもそも回避できたかもしれませんが……)。ありがとうございます。
 混乱していた状態での書き込みであったため読みづらい文章でお騒がせしてしまい、大変失礼致しました。
1

スキルアップ/キャリアアップ(JOB@IT)