[Seasar-user:12575] Re: [Teeda]FacesMessageUtilを使用すると値の引き継ぎが行えない。
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2008年 1月 21日 (月) 04:00:26 JST
小林 (koichik) です.
Date: Sun, 20 Jan 2008 22:02:08 +0900
From: 西山 はじめ <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:12572] Re: [Teeda]FacesMessageUtilを使用すると値の引き継ぎが行えない。
> ところで、layout.htmlから<div id="idAbc">をはずすと
> addErrorMessageをしても値の引き継ぎが行われるですが、どこか
> でエラー状態が解除されているのでしょうか?
サブミットすると FacesMessage は引き継がないので,
エラー状態そのものは毎回クリアされます.
ただし,TCondition ではエラーメッセージがあるのは
ポストバックの時だけという思い込みがあり,今回の
ように初期表示 (initialize) でエラーメッセージが
設定されることは想定から漏れていたために問題が
ありました.
condition で使われたプロパティの値は
RENDER_VIEW フェーズでセッション (SubApplication
スコープ) に保持され,ポストバックではその値を
使って RESTORE_VIEW 〜 INVOKE_APPLICATION フェーズを
実行します.
しかし,エラーメッセージが設定されると
初期表示であってもポストバックでバリデーション
エラーになったのだと判断してしまい,セッションに
condition の値を保持していませんでした.
# バリデーションエラー時は前の状態を維持するため.
そのため,実際にポストバックされた場合に
セッションから condition の値を取得できず,
ページクラスの isAbc() を呼び出すのですが,
RENDER_RESPONSE フェーズで prerender() が
呼ばれるまで isAbc() は false を返します.
ページクラスにリクエストパラメータを反映する
UPDATE_MODEL_VALUES も,do〜() メソッドを呼び出す
INVOKE_APPLICATION も RENDER_RESPONSE よりも
前なので,これらは実行されないということに
なっていました.
# private boolean abc = true;
# だったら発覚しなかったかも.
これについては修正しました.
https://www.seasar.org/issues/browse/TEEDA-428
1.0.12-rc2 に含まれます.
それとは別に,
[Seasar-user:12568]
> <div id="isAbc">
> <te:includeChildBody id="layoutChildBody" />
> </div>
このような condition と layout の使い方は極めて
微妙で,Teeda としてきちんとサポートしている
使い方と言えるのかよく分かりません.
# 少なくとも想定はしていないと思う.
今回のサンプルのように te:includeChildBody が
1 カ所でしか使われていないならおそらく問題は
ないと思うのですが (それも怪しいですが),
> 条件によってChildBodyの位置を変えているのですが
から想像するに,
<div id="isAbc">
<te:includeChildBody id="layoutChildBody" />
</div>
...
<div id="isNotAbc">
<te:includeChildBody id="layoutChildBody" />
</div>
のように使っているのだとすると超怪しいです.
これを適切に扱えるようになっているかは調べないと
分からないというか,あまり期待できないという
気がします.
個人的には te:includeChildBody が複数存在すると
例外をスローするようにした方がいいんじゃないかと
思うくらいで,問題があったときに適切に対処できるとは
限らないと考えていただいた方がよいかと.
表示位置を動的に変えたいなら,condition+layout より,
class 属性をダイナミックプロパティで切り替えるなど,
CSS を使った方が無難じゃないかと思います.
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
Seasar-user メーリングリストの案内