Кнопка перенаправления браузера назад в 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

После этого вы будете знать, что страница будет отображаться, поэтому перед рендерингом вам необходимо проверить, правильно ли созданы экземпляры вашего компонента беседы. Как сделать такую ​​проверку, объясняется здесь:

/questions/47652160/est-li-prostoj-sposob-predvaritelnoj-obrabotki-i-perenapravleniya-zaprosov-get/47652175#47652175

Код, который я использовал, похож на код, опубликованный 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.

Мы используем @ConversationRequired для этого.

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>
Другие вопросы по тегам