[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 メーリングリストの案内