Wywołanie akcji zarządzanej przez JSF podczas ładowania strony
Czy istnieje sposób na wykonanie akcji zarządzanej przez JSF po załadowaniu strony?
Jeśli to ma znaczenie, obecnie używam JSF 1.2.
4 answers
JSF 1.0 / 1.1
Wystarczy umieścić żądaną logikę w konstruktorze request scoped Bean powiązanym ze stroną JSF.
public Bean() {
// Do your stuff here.
}
JSF 1.2 / 2.x
Użyj metody adnotacji @PostConstruct
na żądanie lub widok. Zostanie on wykonany po zbudowaniu i inicjalizacji/ustawienia wszystkich zarządzanych właściwości i wstrzykiwanych zależności.
@PostConstruct
public void init() {
// Do your stuff here.
}
Jest to zdecydowanie zalecane nad konstruktorem w przypadku, gdy używasz frameworku zarządzania fasolą, który używa serwerów proxy, takich jak CDI, ponieważ konstruktor może nie być wywoływany w czasie, którego można się spodziewać.
JSF 2.0 / 2.1
Alternatywnie, użyj <f:event type="preRenderView">
W przypadku, gdy zamierzasz zainicjować na podstawie <f:viewParam>
, lub gdy bean jest umieszczony w szerszym zakresie niż zakres widoku(co z kolei wskazuje na problem projektowy, ale na bok). W przeciwnym razie, @PostConstruct
też jest w porządku.
<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}" />
<f:event type="preRenderView" listener="#{bean.onload}" />
</f:metadata>
public void onload() {
// Do your stuff here.
}
JSF 2.2 +
Alternatywnie, użyj <f:viewAction>
W przypadku, gdy zamierzasz zainicjować na podstawie na <f:viewParam>
zbyt, lub gdy fasola jest umieszczona w szerszym zakresie niż zakres widzenia (co z kolei wskazuje na problem projektowy, ale to na bok). W przeciwnym razie, @PostConstruct
też jest w porządku.
<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}" />
<f:viewAction action="#{bean.onload}" />
</f:metadata>
public void onload() {
// Do your stuff here.
}
Zauważ, że może to zwrócić String
przypadek nawigacji, jeśli to konieczne. Zostanie zinterpretowany jako przekierowanie (więc nie potrzebujesz ?faces-redirect=true
tutaj).
public String onload() {
// Do your stuff here.
// ...
return "some.xhtml";
}
Zobacz też:
- Jak przetworzyć parametry get query string URL w backing bean na stronie ładować?
- do czego mogą być używane
, i ? -
jak wywołać zarządzaną przez JSF bean na zdarzeniu HTML DOM przy użyciu natywnego JavaScript? - W przypadku, gdy jesteś zainteresowany wykonaniem metody akcji bean podczas zdarzenia HTML DOM
load
, a nie podczas ładowania strony.
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
2017-05-23 12:10:41
Innym łatwym sposobem jest użycie metody fire przed renderowaniem widoku. Jest to lepsze niż postConstruct, ponieważ dla sessionScope, postConstruct odpali tylko raz na każdą sesję. Będzie to uruchamiane za każdym razem, gdy strona zostanie załadowana. Jest to oczywiście tylko dla JSF 2.0, a nie dla JSF 1.2.
Tak to się robi -
<html xmlns:f="http://java.sun.com/jsf/core">
<f:metadata>
<f:event type="preRenderView" listener="#{myController.onPageLoad}"/>
</f:metadata>
</html>
I w mycontrolle .java
public void onPageLoad(){
// Do something
}
EDIT-choć nie jest to rozwiązanie na pytanie na tej stronie, dodaję to tylko dla ludzi korzystanie z wyższych wersji JSF.
JSF 2.2 ma nową funkcję, która wykonuje to zadanie za pomocą viewAction
.
<f:metadata>
<f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
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
2015-07-24 12:48:01
@PostConstruct jest uruchamiany raz na początku, gdy Bean został utworzony. rozwiązaniem jest utworzenie nieużywanej właściwości i wykonanie akcji w metodzie Getter tej właściwości i dodaj tę nieruchomość do swojej .plik xhtml w ten sposób:
<h:inputHidden value="#{loginBean.loginStatus}"/>
I w kodzie fasoli:
public void setLoginStatus(String loginStatus) {
this.loginStatus = loginStatus;
}
public String getLoginStatus() {
// Do your stuff here.
return loginStatus;
}
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
2010-11-23 12:14:42
Wywołanie akcji bean z a będzie dobrym pomysłem,zachowaj atrybut autoRun= "true" przykład poniżej
<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
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
2018-05-09 10:34:58