Это по замыслу.Он будет удален только тогда, когда действие POST приведет к навигации, которая не является обратной передачей к тому же представлению (т. Е. Метод действия не вернул null
или void
, а выполнил String
, даже когдапросто пусто).
<h:link>
создает ссылку GET, которая не вызывает никакого действия POST.Поскольку невозможно надежно уведомить серверную часть с помощью (XML) HTTP-запроса, когда представление выгружено, JSF не может быть уведомлено об уничтожении bean-объекта области видимости, связанного с представлением.В этом случае bean-объект области видимости будет уничтожен только по истечении сеанса или когда превышено максимальное количество логических представлений в сеансе (по умолчанию 15), и связанный вид является первым по порядку.
ЕслиВы действительно хотите уничтожить объект видимости, заданный с помощью действия navigaiton, тогда лучше всего сделать это вместо POST-запроса на <h:commandLink>
и выполнить перенаправление, возвращая результат навигации с параметром ?faces-redirect=true
,Но это, в конце концов, не оптимизировано для SEO, так как боты не будут индексировать ссылки POST.
В конце концов, мне было бы все равно, какое представление все еще находится в сеансе.Если вы собираетесь провести некоторую очистку или ведение журнала, я бы искал альтернативные способы, в зависимости от конкретных функциональных требований.
В теории это было бы возможно с помощью события HTML DOM onbeforeunload
, но это нестандартное событие, и поведение браузера не определено относительно того, что происходит, когда вы отправляете ajax-запрос во время этого события.Это иногда прибывает, но иногда также нет.
Обновление : в практике это было реализовано в OmniFaces @ViewScoped
начиная с OmniFaces 2.2.Первоначально с помощью синхронный XHR и начиная с OmniFaces 2.6 с помощью маяк .Это работает довольно хорошо в основных браузерах.Начиная с OmniFaces 2.3, он даже немедленно уничтожает соответствующее состояние просмотра на стороне сервера JSF, а с OmniFaces 2.6 он даже немедленно уничтожает физические компоненты, тем самым дополнительно сокращая ненужное использование памяти.См. Также среди прочих JSF: Мохарра против OmniFaces @ViewScoped: @PreDestroy вызван, но бин не может быть собран мусором