ViewParam vs @ManagedProperty (значення = "# {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>може бути прикріплений.

  • Може бути включена як рядок GET запиту, використовуючи includeViewParamsатрибут <h:link>або includeViewParams=trueпараметр запиту в будь-якій URL-адресі.

  • Може використовуватися в @RequestScopedbean, але він вимагає, щоб 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=123 передасть idпараметр через перетворювач і встановить Userоб'єкт як властивість bean.


@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);
}

Але вам належить керувати валідацією самостійно, коли userце відбувається nullз допомогою FacesContext#addMessage()чи чогось іншого.


Ви можете використовувати їх як в обох випадках, так @PostConstructі includeViewParamsв обов’язковому порядку. Ви більше не зможете застосовувати дрібнозернисту конверсію / перевірку.


Дивитися також:


1
Існують інші альтернативи для отримання параметрів запиту у виняткових випадках: FacesContext.getCurrentInstance (). GetExternalContext (). GetRequestParameterMap (). Get ("ім'я параметра");
angelcervera

1
@angel: Тільки тоді, коли bean має ширший обсяг, ніж область запиту, що робить @ManagedPropertyпараметр запиту неможливим.
BalusC

Привіт @BalusC Я покладаюся на значення id, отриманий з param.id, використовуючи керовану власність на другій публікації. Як я можу включити його за допомогою f: param? велике спасибі
sys_debug

1
@thufir: Він встановлюється під час етапу оновлення значень моделі. Постконструкція проходить далеко до цього, безпосередньо після побудови бобів та введення залежності. Він доступний у методі прослуховування, на який викликається <f:event type="preRenderView">або в майбутньому JSF 2.2 <f:viewAction>.
BalusC


6

2 інші відмінності:

  • @ManagedPropertyвикористовується лише з квасолею, керованою JSF, а не з квасолею, керованою CDI ( @Named);
    • <f:viewParam> працює лише з параметрами GET-запитів.

1
Тому ви можете використовувати примітку: org.omnifaces.cdi.Param
dforce
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.