Есть ли способ вызвать метод при выходе со страницы с JSF или PrimeFaces?

Есть ли способ вызвать метод при выходе со страницы с JSF?


person Landister    schedule 02.04.2012    source источник
comment
Кстати, это упоминается в JSF 2.2 JSR: Усовершенствования системы событий. Например, возможность установить прослушиватель событий навигации по страницам. Это вызовет знакомый диалог: На этой странице есть несохраненные изменения. Вы действительно хотите их отменить?   -  person Arjan Tijms    schedule 03.04.2012
comment
Возможно, спецификация подразумевает здесь навигацию на стороне сервера, но это было бы ограничением, поскольку пользователю необходимо использовать обратные передачи для перехода на новую страницу.   -  person Arjan Tijms    schedule 03.04.2012


Ответы (4)


Не при использовании собственного JSF или PrimeFaces. Вместо этого лучше всего было бы подключиться к истечению сеанса.

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;

@Named
@SessionScoped
public class Bean implements Serializable {

    @PreDestroy
    public void destroy() {
        // Your code here.
    }
}

Если вам случится использовать служебную библиотеку JSF OmniFaces, вы можете использовать ее @ViewScoped. Это вызовет @PreDestroy при выходе со страницы, ссылающейся на bean-компонент с областью видимости.

import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;

@Named
@ViewScoped
public class Bean implements Serializable {

    @PreDestroy
    public void destroy() {
        // Your code here.
    }
}

Под прикрытием он работает, запуская navigator.sendBeacon() во время события окна beforeunload с откатом к синхронному XHR (который устарел в современных браузерах, поддерживающих navigator.sendBeacon()).

Смотрите также:

person BalusC    schedule 03.04.2012

Если вы используете аннотацию omnifaces @ViewScoped во вспомогательном компоненте, объект компонента уничтожается, когда вы покидаете представление; поэтому вы можете вызвать функцию, когда это произойдет, используя в ней аннотацию @PreDestroy.

Примечание. Вы должны использовать омнифейсную аннотацию @ViewScoped; со стандартной аннотацией JSF @ViewScoped объект не уничтожается просто при выходе из представления, поэтому обратите внимание на импорт!

Источник: http://showcase.omnifaces.org/cdi/ViewScoped

person Community    schedule 22.12.2017

Решение вашей проблемы: работает с java-скриптом

    <head>
<title>onunload test</title>
<script type="text/javascript">
window.onunload = unloadPage;

function unloadPage()
{
 alert("unload event detected!");
}
</script>
</head>

Также некоторая ссылка для более подробной информации: - Ссылка

person AirSon    schedule 04.04.2012
comment
OP хочет вызвать метод вспомогательного компонента JSF, а не показывать простое предупреждение. - person BalusC; 04.04.2012
comment
возможно, вы можете программно щелкнуть скрытый commandButton в событии выгрузки, чтобы вызвать метод в резервном компоненте - person damian; 14.10.2012
comment
@BalusC Я не вижу, чтобы OP написал, что хочет вызвать метод выпечки бобов, он хочет просто вызвать метод или не может написать ... - person Web Devie; 04.12.2013

Вы можете вызвать метод управляемого компонента JSF, когда вы закрываете страницу или переходите на другую страницу, используя <a4j:jsFunction/> и вызывая его в событии 'onunload' тела страницы как ниже.

<body onunload="leavingPage()">

<a4j:jsFunction name="leavingPage" action="#{myBean.myMethod}"/>
person prageeth    schedule 03.04.2012
comment
Вы когда-нибудь пробовали это сами? Это не сработает. По крайней мере, не в обычных веб-браузерах. - person BalusC; 03.04.2012
comment
Я не знаю, что такое обычные веб-браузеры. Но я попробовал это, прежде чем я разместил его здесь. Сейчас снова попробовал в Chrome, FF и IE. Вы пробовали это, прежде чем комментировать? - person prageeth; 03.04.2012
comment
Тогда вам посчастливилось оказаться в состоянии гонки каждый раз, когда запрос ajax выигрывал в событии закрытия браузера. Однако это не гарантирует успех каждый раз. Конечно, не в производстве, где сервер обычно работает на физически другой машине, и поэтому задержка в сети выше. - person BalusC; 03.04.2012