次のようなビューパラメータの定義の違いは何ですか:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
そして、次のようにManagedBeanでプロパティを定義します。
@ManagedProperty(value = "#{param.id}")
private Integer id;
<f:viewParam>
:モデル値の更新フェーズでのみ値を設定します( UIInput
を拡張するため)。
設定値は @PostConstruct
では利用できないため、設定値に基づいて初期化/プリロードを行うには、 <f:event type="preRenderView" listener="#{bean.init}" />
内に追加の <f:metadata>
が必要です。 JSF 2.2以降では、代わりに<f:viewAction>
を使用できます。
ネストされた <f:converter>
および <f:validator>
を使用して、よりきめ細かい変換/検証を行うことができます。 <h:message>
を付加することもできます。
<h:link>
のincludeViewParams
属性または任意のURLのincludeViewParams=true
要求パラメーターを使用して、GETクエリ文字列として含めることができます。
@RequestScoped
Beanで使用できますが、ビューに囲まれたフォームに起因する検証エラーにビューパラメータが耐えられるようにするには、Beanを @ViewScoped
にする必要があります。コマンドコンポーネントの<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=12 でページを呼び出すと、コンバーターを介してid
パラメーターが渡され、User
オブジェクトがBeanプロパティ。
@ManagedProperty
:Beanの構築直後に値を設定します。
設定値は @PostConstruct
の間に使用できます。これにより、設定値に基づいて他のプロパティを簡単に初期化/プリロードできます。
ビューで宣言的な変換/検証を許可しません。
#{param}
の管理プロパティは、要求スコープよりも広いスコープを持つBeanでは許可されないため、Beanは @RequestScoped
である必要があります。
後続のPOST=要求に存在する#{param}
の管理プロパティを使用する場合、UICommand
コンポーネントに<f:param>
として含める必要があります。
例:
@ManagedProperty("#{param.id}")
private Long id;
private User user;
@EJB
private UserService userService;
@PostConstruct
public void init() {
user = userService.find(id);
}
しかし、 FacesContext#addMessage()
などをいじることにより、user
がnull
であるときはいつでも検証を自分で管理する必要があります。
@PostConstruct
とincludeViewParams
の両方が必須の場合は、両方を can 使用します。これ以上きめ細かい変換/検証を適用することはできなくなります。
その他の2つの違い:
@ManagedProperty
はJSFが管理するBeanでのみ使用でき、CDIが管理するBeanでは使用できません(@Named
); <f:viewParam>
は、GET要求のパラメーターでのみ機能します。