読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

JSFでactionListener内の判定結果に応じてactionの画面遷移を止める方法

JSF 画面遷移

現在開発している画面の仕様でこんなのがありました。

  • 保存かつ画面遷移するボタンがあって
  • ボタン押下すると、あるロジックが走って、その判定結果に応じて
    • そのまま保存して画面遷移するパターン
    • 画面遷移せずに留まって、確認ダイアログを出すパターン

の2つに分岐します。さらに確認ダイアログが出るパターンでは

  • 確認ダイアログで「はい」を押したら保存して画面遷移する
  • 確認ダイアログで「いいえ」を押したら保存せずに画面に留まる

という分岐が…。

WindowsFormじゃなくてWebなんだけどなぁ…とボヤきつつ、そもそもJSFで画面遷移を条件に応じて動的に止めるとかできるの??と疑問が。

ちなみに上記ボタンは画面遷移するボタンなので、基本的にAjaxは使いません。

調べたら、綺麗な方法がありました(^^;

Andrejus Baranovskis's Blog
How To Disable Action Conditionally from Action Listener

actionListenerで判定して、その結果、actionの画面遷移を有効・無効にしてます。
なるほどー。

というわけで、自分で試した結果は以下の通りです。

JSFxhtml
<!-- 普通に画面遷移するボタン -->
<h:commandButton id="saveBtn0" value="普通に画面遷移する"
                action="#{beforeRedirectBean.redirectPage()}" />

<!-- actionListenerで画面遷移を止めたボタン -->
<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();

    //画面コンポーネントを取得して setActionExpressionでnullを指定
    UICommand btn = (UICommand)context.getViewRoot().findComponent(":beforeFrm:saveBtn1");
    btn.setActionExpression(null);
}

実行すると以下のような画面がでて

f:id:kikutaro777:20130327235100j:plain

左のボタンを押下すると、以下のように次のページに遷移しますが

f:id:kikutaro777:20130327235106j:plain

右のボタンを押下すると、そのままとどまっています。

f:id:kikutaro777:20130327235111j:plain

上記プログラムは無条件でnullを指定していますが、ここを条件分岐して遷移しない場合はnullをしていすれば動的な制御が可能です。

ちなみにPrimeFacesのコンポでも同様のことが実現できました。

ただ最初に書いたダイアログ呼び出しまで含めると上記では上手くいきませんでした(ダイアログが消えてしまうので)
これはまた微妙なやり方で解決したので、別途まとめたいと思います。

しかし、いいのかな、こんなゴリゴリやって(-_-;

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村