現在開発している画面の仕様でこんなのがありました。
- 保存かつ画面遷移するボタンがあって
- ボタン押下すると、あるロジックが走って、その判定結果に応じて
- そのまま保存して画面遷移するパターン
- 画面遷移せずに留まって、確認ダイアログを出すパターン
の2つに分岐します。さらに確認ダイアログが出るパターンでは
- 確認ダイアログで「はい」を押したら保存して画面遷移する
- 確認ダイアログで「いいえ」を押したら保存せずに画面に留まる
という分岐が…。
WindowsFormじゃなくてWebなんだけどなぁ…とボヤきつつ、そもそもJSFで画面遷移を条件に応じて動的に止めるとかできるの??と疑問が。
ちなみに上記ボタンは画面遷移するボタンなので、基本的にAjaxは使いません。
調べたら、綺麗な方法がありました(^^;
Andrejus Baranovskis's Blog
How To Disable Action Conditionally from Action Listener
actionListenerで判定して、その結果、actionの画面遷移を有効・無効にしてます。
なるほどー。
というわけで、自分で試した結果は以下の通りです。
<h:commandButton id="saveBtn0" value="普通に画面遷移する"
action="#{beforeRedirectBean.redirectPage()}" />
<h:commandButton id="saveBtn1" value="プログラムで画面遷移を止める"
actionListener="#{beforeRedirectBean.thinkAction()}"
action="#{beforeRedirectBean.redirectPage()}" />
BackingBeanの抜粋
public String redirectPage(){
return "afterRedirect.xhtml";
}
public void thinkAction(){
FacesContext context = FacesContext.getCurrentInstance();
UICommand btn = (UICommand)context.getViewRoot().findComponent(":beforeFrm:saveBtn1");
btn.setActionExpression(null);
}
実行すると以下のような画面がでて
左のボタンを押下すると、以下のように次のページに遷移しますが
右のボタンを押下すると、そのままとどまっています。
上記プログラムは無条件でnullを指定していますが、ここを条件分岐して遷移しない場合はnullをしていすれば動的な制御が可能です。
ちなみにPrimeFacesのコンポでも同様のことが実現できました。
ただ最初に書いたダイアログ呼び出しまで含めると上記では上手くいきませんでした(ダイアログが消えてしまうので)
これはまた微妙なやり方で解決したので、別途まとめたいと思います。
しかし、いいのかな、こんなゴリゴリやって(-_-;