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;
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>
lubincludeViewParams=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ładnikachUICommand
.
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ż:
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.
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