回答:
<f:viewParam>
:モデル値の更新フェーズでのみ値を設定します(拡張されるためUIInput
)。
設定値はの間は使用できない@PostConstruct
ため、設定値に基づいて初期化/プリロードを行うには<f:event type="preRenderView" listener="#{bean.init}" />
、内部に追加のものが必要<f:metadata>
です。JSF 2.2以降で<f:viewAction>
は、代わりに使用できます。
ネストされた<f:converter>
、<f:validator>
より細かい変換/検証が可能です。でも<h:message>
取り付け可能です。
任意のURLのincludeViewParams
属性<h:link>
またはincludeViewParams=true
リクエストパラメータを使用して、GETクエリ文字列として含めることができます。
@RequestScoped
Beanで使用できますが@ViewScoped
、ビューに含まれているフォームによって引き起こされた検証エラーが発生してもビューパラメータを維持できるようにするには、Beanを使用する必要があります。そうでない場合<f:param>
は、コマンドで後続のリクエストのすべてのリクエストパラメータを手動で保持する必要がありますコンポーネント。
例:
<f:metadata>
<f:viewParam id="user_id" name="id" value="#{bean.user}"
required="true" requiredMessage="Invalid page access. Please use a link from within the system."
converter="userConverter" converterMessage="Unknown user ID."
/>
</f:metadata>
<h:message for="user_id" />
と
private User user;
と@FacesConverter("userConverter")
。http://example.com/context/user.xhtml?id=123でページを呼び出すid
と、コンバータを介してパラメータが渡され、User
オブジェクトがBeanプロパティとして設定されます。
@ManagedProperty
:Beanの構築直後に値を設定します。
設定値を使用@PostConstruct
できるため、設定値に基づいて他のプロパティを簡単に初期化/プリロードできます。
ビューで宣言的な変換/検証を行うことはできません。
の管理プロパティは#{param}
、リクエストスコープよりも広いスコープのBeanでは許可されていないため、Beanはである必要があります@RequestScoped
。
#{param}
後続のPOST要求に存在する管理プロパティに依存している場合<f:param>
は、UICommand
コンポーネントと同様にそれを含める必要があります。
例:
@ManagedProperty("#{param.id}")
private Long id;
private User user;
@EJB
private UserService userService;
@PostConstruct
public void init() {
user = userService.find(id);
}
しかし、あなたはいつでも検証を自分で管理する必要がuser
あるnull
といじることにより、FacesContext#addMessage()
または何か。
あなたは、することができます両方のときの両方にそれらを使用@PostConstruct
してincludeViewParams
必須です。きめ細かな変換/検証のみを適用することはできなくなります。
@ManagedProperty
ため、リクエストパラメータを使用できない場合のみ。
<f:event type="preRenderView">
または今後のJSF 2.2 によって呼び出されるリスナーメソッドで使用できます<f:viewAction>
。
その他の2つの違い:
@ManagedProperty
JSFが管理するBeanでのみ使用でき、CDI(@Named
)が管理するBeanでは使用できません。
<f:viewParam>
GETリクエストのパラメータでのみ機能します。