2015-06-11 2 views
0

У меня есть приложение JSF, в котором пользователи регистрируются в форме входа, вставляя свою электронную почту и пароль. ManagedBean имеет следующие 2 метода.JSF ajax render message and redirect

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

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

loginManagedBean.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, чтобы показать «E-mail и/или пароль», когда я нажимаю кнопку Вход и проверка не пройдена и перейти к account.xhtml когда проверка правильна. Но когда я вставляю неверный адрес электронной почты и пароль, сообщение не отображается, и когда я правильно вставляю их, страница не перенаправляется на account.xhtml. Что я делаю не так?

Это мой Facelet

<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> 
+0

Если проверка не завершена, 'checkIdentity1' не будет выполнен, также не будет' 'проверкаIdentity2 '' возвращать ожидаемый результат, что является прямым результатом более раннего отказа. – kolossus

+0

Не могли бы вы объяснить, почему? или представить пример? – jose

+0

Суть в JSF заключается в том, что если запрос не прошел проверку, «действие» на кнопке команды не будет выполнено - это правило для JSF. Таким образом, ваша текущая логика не будет работать, потому что обработка вашего запроса не дойдет до выполнения метода 'checkIdentity1' – kolossus

ответ

1

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

  1. условно делают этот компонент, вы можете проверить статус проверки на странице:

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

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

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