ViewParamと@ManagedProperty(value =“#{param.id}”)


97

このようにビューパラメータを定義することの違いは何ですか?

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

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

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

回答:


144

<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必須です。きめ細かな変換/検証のみを適用することはできなくなります。


以下も参照してください。


1
例外的なケースでリクエストパラメータを取得する別の方法があります。FacesContext.getCurrentInstance()。getExternalContext()。getRequestParameterMap()。get( "parametername");
angelcervera

1
@angel:Beanのスコープがリクエストスコープよりも広い@ManagedPropertyため、リクエストパラメータを使用できない場合のみ。
BalusC 2011

こんにちは@BalusC私は2番目の投稿でmanagedpropertyを使用してparam.idから取得したidの値に依存しています。f:paramを使用してどのように含めることができますか?どうもありがとう
sys_debug

1
@thufir:モデル値の更新フェーズで設定されます。postconstructは、Beanの構築と依存性注入の直後、そのはるか前に実行されます。これは、<f:event type="preRenderView">または今後のJSF 2.2 によって呼び出されるリスナーメソッドで使用できます<f:viewAction>
BalusC 2012


6

その他の2つの違い:

  • @ManagedPropertyJSFが管理するBeanでのみ使用でき、CDI(@Named)が管理するBeanでは使用できません。
    • <f:viewParam> GETリクエストのパラメータでのみ機能します。

1
したがって、あなたは、アノテーションを使用できます。org.omnifaces.cdi.Paramを
dforce
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.