JSF ajax визуализирует сообщение и перенаправляет

У меня есть приложение JSF, в котором пользователи входят в форму входа, вводя свой адрес электронной почты и пароль. ManagedBean имеет следующие 2 метода.

Метод checkIdentity1() возвращает URL-адрес ("", если проверка неверна, чтобы остаться на той же странице, или /useraccount.xhtml, если вставленные данные в порядке, чтобы перейти на следующую страницу).

Метод checkIdentity2() возвращает логическое значение (false, если проверка неверна для отображения сообщения, true, если все в порядке).

логинManagedBean.java

public String checkIdentity1()
{
    String strResponse="";

    //check id

    if(email.equals("[email protected]") && password.equals("1234"))
    {
        strResponse="/useraccount.xhtml?faces-redirect=true";
    } else {

    }
    //
        return strResponse;
}

public boolean checkIdentity2()
{
    boolean bResponse=false;
    //check id

    if(email.equals("[email protected]") && password.equals("1234"))
    {
       //setpassIncorrecta(false); 

    } else {
        bResponse=true;
    }

    //

    return bResponse;
}

Что я пытаюсь сделать, так это смешать ajax и JSF, чтобы показать «Неверный адрес электронной почты и/или пароль», когда я нажимаю кнопку «Войти» и проверка не выполняется, и перехожу к account.xhtml, когда проверка в порядке. Но когда я ввожу неправильный адрес электронной почты и пароль, сообщение не отображается, и когда я вставляю их правильно, страница не перенаправляется на account.xhtml. Что я делаю неправильно?

Это мой фейслет

 <h:form> 
    <!--Email-->
    <h:inputText id="email" label="email" required="true" size="32" maxlength="32"
         value="#{loginManagedBean.email}"
         requiredMessage="Insert your email">              
    </h:inputText>
    <h:message for="email" />


    <!--Password-->
    <h:inputSecret id="password" label="password" required="true" size="32" maxlength="40"
        value="#{loginManagedBean.password}" 
        requiredMessage="Insert your password">            
    </h:inputSecret>
    <h:message for="password" />


    <!--Button-->
    <h:commandButton value="Login" action="#{loginManagedBean.checkIdentity1()}">
    <f:ajax execute="@form" render=":loginErrorMessage" />
    </h:commandButton>

</h:form>


<h:panelGroup id="loginErrorMessage">
    <h:outputText value="Email and/or password incorrect" rendered="#{!loginManagedBean.checkIdentity2()}" />
</h:panelGroup>

person jose    schedule 11.06.2015    source источник
comment
Если проверка не пройдена, checkIdentity1 не будет выполняться, и checkIdentity2 не вернет ожидаемый результат, как прямой результат предыдущего сбоя.   -  person kolossus    schedule 12.06.2015
comment
Не могли бы вы объяснить, почему? или привести пример?   -  person jose    schedule 12.06.2015
comment
Суть в JSF заключается в том, что если запрос не прошел проверку, action на командной кнопке не будет выполнено — это правило для JSF. Таким образом, ваша текущая логика не будет работать, потому что обработка вашего запроса не дойдет до выполнения метода checkIdentity1   -  person kolossus    schedule 14.06.2015


Ответы (1)


Как я объяснил в комментарии, именно так работает JSF: если запрос не прошел проверку, метод action не будет выполнен. Это определяет жизненный цикл обработки запросов JSF (который я не буду попасть сюда). Для целей этого ответа все, что вам нужно знать, это то, что проверка параметров запроса происходит до того, как будут рассмотрены методы action. При этом, если проверка не пройдена, обработка запроса прерывается тут же. Чтобы достичь того, что вы ищете, вы должны учитывать следующее:

  1. Чтобы условно отобразить этот компонент, вы можете проверить статус проверки на своей странице:

    <h:outputText value="Email and/or password incorrect" rendered="#{facesContext.validationFailed}" />
    

    В идеале вы должны просто использовать компонент <h:messages/>, где вам не нужно самостоятельно управлять отображением сообщений.

JSF останется на той же странице по умолчанию, если проверка не пройдена, поэтому вам не нужно предпринимать никаких специальных действий для этого.

person kolossus    schedule 13.06.2015