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