JSF 2.0のフラッシュ記憶

これもJavaOne時のpreview版では動かなかったやつだが、現在の開発版では動くようなので書いてみる。

JSF 2.0では最近のフレームワークでは当たり前のフラッシュ記憶が対応した。もともとステートフルな利用が多いが、2.0からはGETなどリクエストスコープを多用する場合にも対応できるようにするために入れたのだろう。

早速コードを乗せてみる

まず送信元のfooのアクション。

    public String next(){
        Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
        flash.put("ふらっしゅ", "ふらっしゅきおく");

        return "bar?faces-redirect=true";
    }

Flashは Mapを継承しているのがわかる。
http://shin.cside.com/diary/2009/0903-01.png


受け取り方法。まずテンプレートだけでやってみる。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>bar</title>
    </head>
    <body>
        フラッシュ:#{flash.ふらっしゅ}
    </body>
</html>


実行
http://shin.cside.com/diary/2009/0903-02.png

JSF 2では「flash」というのがELの予約語のようだ。Mapなのでおそらく階層構造もOKだろう。


そのまま表示するならばテンプレート直でよいが、コードで受け取る場合はどうするか。

    public void preRender(){
        Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
        System.out.println("フラッシュ:"+flash.get("ふらっしゅ"));
        System.out.println("フラッシュ:"+flash.get("ふらっしゅ"));
    }

ここではプリレンダーフェーズで書いてるが、それはどこでもよい。
普通にgetで受け取るだけ。


実行結果。1度表示した後に再読み込みをしてある。

情報: フラッシュ:ふらっしゅきおく
情報: フラッシュ:ふらっしゅきおく
情報: フラッシュ:null
情報: フラッシュ:null

見てわかる通り1回のリクエスト中にはgetを何度やっても削除されない。テンプレート側を併用しても同じ。

使い方が簡単なので手軽に使っていいと思う。つーか、JSFじゃなくてサーブレットAPIとして入れたほうがいいような気もするが…。


ELでフラッシュが使えるということは、Java EE 6からはELでメソッドの実行できるので、オブジェクトまるごとぶちこんで好きなメソッドで取り出しても面白いかもしれない。