web-dev-qa-db-ja.com

ViewParam vs @ManagedProperty(value = "#{param.id}")

次のようなビューパラメータの定義の違いは何ですか:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>

そして、次のようにManagedBeanでプロパティを定義します。

@ManagedProperty(value = "#{param.id}")
private Integer id;
95
ehsun7b

<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() などをいじることにより、usernullであるときはいつでも検証を自分で管理する必要があります。


@PostConstructincludeViewParamsの両方が必須の場合は、両方を can 使用します。これ以上きめ細かい変換/検証を適用することはできなくなります。


こちらもご覧ください:

142
BalusC

その他の2つの違い:

  • @ManagedPropertyはJSFが管理するBeanでのみ使用でき、CDIが管理するBeanでは使用できません(@Named);
    • <f:viewParam>は、GET要求のパラメーターでのみ機能します。
5
user1643352