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

Jaka jest różnica między definiowaniem param widoku w ten sposób:

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

I zdefiniowanie właściwości w ManagedBean TAK:

@ManagedProperty(value = "#{param.id}")
private Integer id;
Author: BalusC, 2011-02-03

2 answers

<f:viewParam>:

  • Ustawia wartość tylko w fazie aktualizacji wartości modelu (ponieważ rozszerza UIInput).

  • Ustawiona wartość nie jest dostępna podczas @PostConstruct, więc potrzebujesz dodatkowego <f:event type="preRenderView" listener="#{bean.init}" /> inside the <f:metadata> aby wykonać inicjalizację / wstępne ładowanie na podstawie ustawionych wartości. Od JSF 2.2 można użyć <f:viewAction> zamiast tego.

  • Pozwala na zagnieżdżanie <f:converter> oraz <f:validator> na bardziej drobnoziarnista konwersja / Walidacja. Nawet a <h:message> może być dołączony.

  • Może być dołączony jako łańcuch zapytania GET używając atrybutu includeViewParams <h:link> lub includeViewParams=true parametr request w dowolnym adresie URL.

  • Może być stosowany na @RequestScoped fasoli, ale wymaga, aby fasola była @ViewScoped jeśli chcesz, aby parametry widoku przetrwały błędy walidacji spowodowane przez formularze zawarte w widoku, w przeciwnym razie musisz ręcznie zachować wszystkie parametry żądania dla kolejnych żądań przez <f:param> w komponentach polecenia.

Przykład :

<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" />

Z

private User user;

I @FacesConverter("userConverter"). Wywołanie strony przez http://example.com/context/user.xhtml?id=123 przekaże parametr id przez konwerter i ustawi obiekt User jako właściwość bean.


@ManagedProperty:

  • Ustawia wartość natychmiast po Budownictwo.

  • Ustawiona wartość jest dostępna podczas @PostConstruct co pozwala na łatwe inicjowanie / wstępne ładowanie innych właściwości na podstawie ustawionej wartości.

  • Nie pozwala na deklaratywną konwersję/walidację w widoku.

  • Managed property of #{param} nie jest dozwolone dla beans o szerszym zakresie niż zakres request, więc Bean musi być @RequestScoped.

  • Jeśli polegasz na zarządzanej własności #{param} będąc obecnym w kolejnych żądaniach postu, musisz umieścić go jako <f:param> w składnikach UICommand.

Przykład :

@ManagedProperty("#{param.id}")
private Long id;

private User user;

@EJB
private UserService userService;

@PostConstruct
public void init() {
    user = userService.find(id);
}

Ale musisz sam zarządzać walidacją, gdy user jest null, bawiąc się FacesContext#addMessage() czy coś.


You can use them both when both @PostConstruct i includeViewParams są obowiązkowe. Tylko nie będziesz mógł zastosować konwersji/walidacji drobnoziarnistej już nie.


Zobacz też:

 144
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

2 inne różnice:

  • @ManagedProperty Można używać tylko z beans managed by JSF, a nie z beans managed by CDI (@Named);
    • <f:viewParam> działa tylko z parametrami żądań GET.
 6
Author: user1643352,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-07 04:38:10