Кнопка перенаправления браузера назад в jsf 2.0
Я пишу приложение, используя Primefaces 3.4.1, Jboss AS 7.1 и MyFaces CODI. Проблема, с которой я столкнулся, заключается в том, что я использую область разговора, предоставляемую CODI, и мне нужен способ справиться с кнопкой возврата браузера после завершения разговора.
Точнее, когда разговор заканчивается, и пользователь находится на другой странице (думайте об этом, как о мастере, который заканчивает работу и делает коммит в базу данных), если нажать кнопку "Назад", я получаю следующее исключение:
javax.ejb.EJBTransactionRolledbackException
В идеале, так как разговор закончен, я бы хотел, чтобы это перенаправило обратно на какую-то другую страницу (меню, панель инструментов).
Можно ли это сделать с помощью правил навигации JSF 2.0?
РЕДАКТИРОВАТЬ:
Я создал правило навигации следующим образом:
<navigation-rule>
<from-view-id>/page1.xhtml</from-view-id>
<navigation-case>
<from-outcome>outcome1</from-outcome>
<to-view-id>/page2.xhtml</to-view-id>
<redirect/>
</navigation-case>
<navigation-case>
<from-outcome>*</from-outcome>
<to-view-id>/dashboard.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
Надеясь, что это сделает перенаправление на dashboard.xhtml, если мы нажмем кнопку назад. Я предположил, что при его нажатии на бэк-энде происходит другое действие. Ясно, что я ошибся. Можно ли каким-то образом поймать все, что отправлено кнопкой bakc, используя эти случаи? Возможно с тегом?
ОБНОВЛЕНИЕ 1:
Видимо, кнопка "Назад" в браузере не вызовет случай навигации JSF. Понятно, что сработает? Я реализовал следующий фильтр: /questions/31354605/izbegajte-knopki-vozvrata-v-veb-prilozhenii-jsf/31354620#31354620 Что теперь сработает? Делает ли это облегчение работы?
2 ответа
Мне наконец удалось решить проблему, и это может быть полезно для других:
Первое, что нужно сделать, это убедиться, что вы не кэшируете страницы. Вы можете сделать это с помощью фильтра, описанного здесь:
/questions/31354605/izbegajte-knopki-vozvrata-v-veb-prilozhenii-jsf/31354620#31354620
После этого вы будете знать, что страница будет отображаться, поэтому перед рендерингом вам необходимо проверить, правильно ли созданы экземпляры вашего компонента беседы. Как сделать такую проверку, объясняется здесь:
Код, который я использовал, похож на код, опубликованный BalusC в этом вопросе:
<f:metadata>
<f:event type="preRenderView" listener="#{authenticator.check}" />
</f:metadata>
С кодом Java:
public void check() {
if (someCondition) {
FacesContext facesContext = FacesContext.getCurrentInstance();
NavigationHandler navigationHandler =
facesContext.getApplication().getNavigationHandler();
navigationHandler.handleNavigation(facesContext, null, "outcome");
}
}
После этого вы отправите правило навигации JSF для "результата".
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>outcome</from-outcome>
<to-view-id>/defaultPage.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
И вот как вы можете изящно обрабатывать кнопку назад с помощью JSF2.
This worked for me.
You can add the below code in between your <head> </head> tag
<script>
window.location.hash = "no-back-button";
window.location.hash = "Again-No-back-button";//again because google chrome don't insert first hash into history
window.onhashchange = function() {
window.location.hash = "no-back-button";
}
</script>