обработка исключений в jsf - напечатать сообщение об ошибке на новой странице - PullRequest
5 голосов
/ 29 февраля 2012

Я просто хочу напечатать пользовательское сообщение на странице ошибки, когда возникает исключение.

я пробовал это

    if(erroroccured){
        FacesMessage message=new FacesMessage("You must login to continue");
        context.addMessage(null, message);
        FacesContext.getCurrentInstance().getExternalContext().redirect("error.xhtml");

    }

В error.xhtml я дал

    <h:messages></h:messages>
Тег

тоже ... всякий раз, когда возникает исключение, моя страница перенаправляется идеально. но я не получаю сообщение об ошибке.

1 Ответ

8 голосов
/ 29 февраля 2012

Сообщения Faces являются областью запроса.Редирект в основном инструктирует веб-обозревателя отправлять новый HTTP-запрос (поэтому вы также видите изменение URL в адресной строке браузера).Сообщения лиц, которые были установлены в предыдущем запросе, конечно, больше не доступны в новом запросе.

Существует несколько способов заставить его работать:

  1. ДонпереадресоватьОтправьте вперед вместо.Вы можете сделать это, ExternalContext#dispatch()

    FacesContext.getCurrentInstance().getExternalContext().dispatch("error.xhtml");
    

    или просто перейдя обычным способом, если вы уже находитесь внутри метода действия

    return "error";
    
  2. Создатьобщий шаблон страницы ошибок и используйте отдельные клиенты шаблонов для каждого отдельного типа ошибки и вместо этого поместите сообщение в представление.

    <ui:composition template="/WEB-INF/templates/error.xhtml"
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
    >
        <ui:define name="message">
            You must login to continue.
        </ui:define>
    </ui:composition>
    

    Затем вы можете просто перенаправить на эту конкретную страницу ошибки следующим образом: redirect("error-login.xhtml").

  3. Передать некоторый идентификатор ошибки в качестве параметра запроса, хотя URL-адрес перенаправления похож натак что redirect("error.xhtml?type=login") и пусть представление справится с этим.

    <h:outputText value="You must login to continue." rendered="#{param.type == 'login'}" />
    
  4. Сохраните сообщения лиц в области видимости флэш-памяти.

    externalContext.getFlash().setKeepMessages(true);
    

    Однако у Мохарры несколько глючитреализация flash flash.В текущих выпусках это не будет работать, если вам нужно перенаправить в другую папку, но будет работать, когда целевая страница находится в той же папке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...