1. ホーム
  2. jsf

[解決済み] ViewParam vs @ManagedProperty(value = "#{param.id}")

2023-01-04 10:25:43

質問

View Paramsをこのように定義すると、どのような違いがあるのでしょうか。

<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> を付けることができる。

  • GET のクエリ文字列として includeViewParams 属性を使って <h:link> または includeViewParams=true のいずれかのリクエストパラメータを指定します。

  • で使用することができます。 @RequestScoped ビーンに使用できますが、そのビーンは @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=123 を渡すと id パラメータをコンバータに渡し User オブジェクトをビーンプロパティとして設定します。


@ManagedProperty :

  • ビーン構築直後の値を設定します。

  • 設定された値は @PostConstruct で、設定された値に基づいて他のプロパティの初期化/プリロードを簡単に行うことができます。

  • ビューで宣言的な変換/検証を許可しない。

  • の管理されたプロパティは #{param} はリクエストスコープよりも広いスコープを持つビーンでは使用できないため、ビーンには @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);
}

しかし usernull をいじって FacesContext#addMessage() とかでいいんじゃない?


あなたは できます の両方がある場合、両方を使うことができます。 @PostConstruct includeViewParams は必須です。きめ細かい変換・検証を適用することができなくなるだけです。


こちらもご覧ください。