2012-01-07 22 views
1

私はCore JavaServer Faces 3rd editionを読んでおり、JSFページのエンコーディングとデコードについて質問があります。JSFページのエンコーディングとデコード

ページがレンダリングされると、まずJSFタグを含むXHTMLページが表示されます。各JSFタグには独自のタグ・ハンドラ・クラスがあり、それらのコンポーネントは連携してそのページのコンポーネント・ツリーを作成します。その他のタグはすべて無視されます。

各コンポーネントには、HTMLの生成方法を知っている独自のレンダラーがあります。今や本は言う:

(これは、Hである:のinputTextタグ)

各コンポーネントは、コンポーネントの状態を反映して、HTML出力を生成するレンダラを有します。 UIInputオブジェクトのレンダラーはJSF実装にユニークなIDと式user.nameの現在の値を検索するように要求します。

質問です:

はなぜ本は、実装が表現user.nameの現在の値を要求することを言いますか?実装では代わりにコンポーネント(この場合はUIInput)にこのユーザーBeanへの参照があると尋ねられました。なぜなら、そのクラスはJSFタグをコードに「反映」していないからです。

私はおそらくこのコンセプトを誤解しており、私はそれを学びたいと思います。 JSFコンポーネントに渡さ

答えて

3

EditableValueHolderの出力値をUIInputとするには、Rendererは、通常getValue()となります。これは、一般的に返します。

  1. を値getSubmittedValue()からの入力の検証や変換が
  2. 任意の
  3. valueValueExpressionの結果どの

かの場合setValue(Object)を呼び出すことによって明示的に設定されたオブジェクトを失敗した場合コンポーネントは動作を定義します。理想的には、レンダラー、マークアップ、およびデータソースに疎結合する必要があります。コンポーネントは、そのデータソースが何であるかを気にしません。マネージドBeanである必要はありません。値の取得と設定はValueExpressionの責任で行ってください。

ValueExpressionは、contextに依存します。

+0

Okey、ちょっと追加の質問:デコードの面は、ApplyRequestVariablesライフサイクルの段階で、RenderResponseのエンコードではどうなりますか? – LuckyLuke

+0

はい。 _Apply Request Values_の間、 'Renderer.decode'は入力(通常はパラメータマップから)を読み込み、コンポーネントの' setSubmittedValue(Object) 'を呼び出します。 'Renderer.encode *(...)'メソッドは、_Render Response_の間に 'ResponseWriter'を介してマークアップを発行するために呼び出されます。 – McDowell

0

パラメータは、基本的には、EL(式言語)表現され、それらを評価することは、いくつかの参照をアクセスするよりもたくさん、より複雑になることがあります - JSF EL構文およびJavaに間接的にしか関連セマンティクスで、programming language of its ownです。

0

代わりに実装がコンポーネントに尋ねると思いますか?

私の意見では、UIInputのコンポーネントとBeanのプロパティは2つの特徴があります。 UIInputコンポーネントのvalue属性をBeanのプロパティにバインドするまでは、互いに関係はありません。

つまり、UIInputのコンポーネント自体は、という現在の値と呼ばれるものはありません。それらは単純に値ディスプレーヤー& getterです。したがって、レンダラは、UIInputコンポーネントが表示する必要がある値について、JSFの実装(通常はManagedBean)を尋ねる必要があります。

... UIInput - このユーザーの豆一般に代わり

UIInputとの関係、財産とJSFの実装(ManagedBean)にはいくつかの参照を持っていた次のようになります。UIInputからManagedBean - Beanのプロパティ。 UIInputはBeanのプロパティと直接関係がないため、レンダラーは中間の男性(ManagedBean)と通信して必要なものを取得する必要があります。

上記は現在の私の理解です。私が間違っているなら、私を修正してください! :)