回答:
<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クエリ文字列として含めることができます。
@RequestScopedBeanで使用できますが@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つの違い:
@ManagedPropertyJSFが管理するBeanでのみ使用でき、CDI(@Named)が管理するBeanでは使用できません。
<f:viewParam> GETリクエストのパラメータでのみ機能します。