--
--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:

18
2011

[Java]JSFのフラッシュ記憶は二度動く?(未解決)

CATEGORYJava
時代遅れの知識をアップデートしようと、ちまちまとJSF+EJB+JPAという凄く標準仕様な構成でアプリ作成中。
なんか変(?)な挙動と遭遇したのでメモ。

JSF では、2.0からフラッシュ記憶という仕組みが使えるようになっているとのこと。
ページ移動後に一度だけ値を参照できるということで、CakePHPで言う $session->flash() みたいなリダイレクト先で結果メッセージの表示ができる仕組み・・・という風に理解。
さっそくそれを使って、PRGパターンな更新→結果表示の画面遷移を作ってみた。

が、ちょっと様子が変。下に再現用ページのソースと実行結果を示すので、まずそれを見てもらいたい。

TestAction.java
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

// ※ 結果を分かりやすくするためにSessionScopedとしてアクセスカウンタを持たせている。
// RequestScopedでカウンタを取り除いたコードでも発生。
@ManagedBean
@SessionScoped
public class TestAction {

public String run() {
FacesContext.getCurrentInstance().getExternalContext()
.getFlash().put("msg", "1回目だけ表示される・・・はず");
return "page2?faces-redirect=true";
}

private int count = 0;

public int getCount() {
return ++count;
}
}
page1.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<body>
<form jsfc="h:form">
page1 : <input jsfc="h:commandButton" type="submit" action="#{testAction.run()}" value="実行" />
</form>
</body>
</html>
page2.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
page2 : 表示#{testAction.count}回目 "#{flash.msg}"
</body>
</html>

至って普通のコード・・・だと思う。で、実行結果がこれ。

page1.xhtml を表示。
実行結果1ページ目

実行ボタンを押下してリダイレクト。期待通りフラッシュのメッセージが表示される。
実行結果2ページ目1アクセス

画面をリロード。期待通りメッセージは消える。
実行結果2ページ目2アクセス

もう一度画面をリロード。メッセージが再表示される!?
実行結果2ページ目3アクセス

再度画面をリロード。以後何度リロードしてもメッセージは表示されない。
実行結果2ページ目4アクセス

一度だけ値を参照できる・・・というのとは明らかに違う動作。
これがまだ、"表示2回目"のタイミングでも出てくる、とかなら自分の使い方や認識がおかしいのかな?そもそも一度だけ参照できる機能じゃないのかな?とも思うんだけど・・・再リロード後にってそのタイミングで再度取得できて誰得?

当初はブラウザ側のキャッシュという線も疑ったが、いろいろページ遷移やブラウザを変えても、また上のようにカウンタを埋め込んでも再現したのでそうではないと思われる。
ただし、唯一フラッシュへの値の格納を page1.xhtml 内で <c:set> で行った場合だけは、"表示1回目"まででしか引き継がれなかった(そこでは何の解決にもならないが(--)。


同様の症状を探してみたが、英語のそれっぽいページは見つかるものの、解決策までは見つからず。
逆に上のようなページ遷移がサンプルとして載っているページも見つかったり・・・こんな動きしてたらすぐ気づくと思うんだけど、ひょっとして環境依存の問題なのか?orz
参考までに環境は、当初 JDK 1.6.0_17 (32bit) + GlassFish 3.1 で、途中で念のためバージョンアップしてからは JDK 1.6.0_27 (32bit) + GlassFish 3.1.1。Maven2のEARアプリで実行は NetBeans 7.0.1 から。JSFのライブラリについては特に指定せず、GlassFish添付のものを使用しているはず。OSは Vista x64 SP2 でブラウザは IE 9 と Firefox 6 で確認。

現状では未解決のままで、PRGパターンを諦めるしかなさそう。
うーん、JSFは元々URLとか意識しないフレームワークっぽいし、ここは我慢するしかないか(--;
スポンサーサイト

Tag: Java JSF

0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。