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.

Author: BalusC, 2010-03-16

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ż:

 72
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
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>
 11
Author: stolen_leaves,
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;
}
 9
Author: Amin Bahiraei,
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" />
 0
Author: sijo jose,
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