2011-02-18 5 views
2

I는 JSF의 다음 인증 형태 글래스 피시 (3)에서 실행 한 JSF 않고 본 메시지 수행H : 속성과 메시지 요소 2

public String logIn() { 
    user = userDAO.authenticate(user, password); 
    if (user != null) { 
     FacesMessage message = new FacesMessage("Welcome!"); 
     message.setSeverity(FacesMessage.SEVERITY_INFO); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     return "ok"; 
    } else { 
     FacesMessage message = new FacesMessage("Authentication failed"); 
     message.setSeverity(FacesMessage.SEVERITY_ERROR); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     if ("".equals(user)) { 
      message = new FacesMessage("You need to give a user"); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      FacesContext.getCurrentInstance().addMessage(
       "login-user", message); 
     } 
     return "fail"; 
    } 
} 
:

<h:messages globalOnly="true" errorClass="erro" /> 
<h:form id="form-login"> 
    <h:outputText value="User" /> 
    <h:message for="login-user" /> 
    <h:inputText id="login-user" 
     value="#{authenticationBean.user}" showMessages="true" /> 

    <h:outputText value="Password" /> 
    <h:inputSecret id="login-password" 
     value="#{authenticationBean.password}" /> 

    <h:commandButton id="Log in" 
     action="#{authenticationBean.logIn}" value="Autenticar-se" /> 
</h:form> 

authentication.logIn 방법은 아래의 하나이다

사용자 로그인이 제공되지 않는 경우 특정 메시지를 표시하려고 시도합니다. 줄 번호는 <h:message for="login-user" />입니다. 그래도 작동하지 않습니다. 빈 사용자 필드로 제출 버튼을 클릭하면 <h:messages globalOnly="true" errorClass="erro" /> 요소는 "Authentication failed"을 표시하지만 <h:message for="login-user" /> 구성 요소는 예상대로 텍스트를 "You need to give a user"으로 표시하지 않습니다. 대신 메시지를 전혀 표시하지 않습니다.

[lifecycle] WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. 
sourceId=login-user[severity=(ERROR 2), summary=(You need to give a user), detail=(You need to give a user)] 

(사실, 난 구글에서 일부 번역보고, 내가 가진 진짜 메시지가 포르투갈어이기 때문에 :

INFO: WARN: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos. 
sourceId=login-usuario[severity=(ERROR 2), summary=(You need to give a user), detail=(You need to give a user)] 

)

또한, 다음과 같은 경고가 로그에 나타납니다 내가 도대체 ​​뭘 잘못하고있는 겁니까?

미리 감사드립니다.

답변

8

구성 요소 ID가 아닌 클라이언트 ID를 지정해야합니다. 주어진 뷰 코드를 기반으로, 그 수 있습니다 :

FacesContext.getCurrentInstance().addMessage(
    "form-login:login-user", message); 

을 그 당신은 브라우저에서 페이지를 열고 그 생성 된 HTML 소스를 볼 필요가 작동하지 않는 경우. 생성 된 HTML <input> 요소의 속성은 id과 같아야합니다. 이 문제에 관련없는


, 나는 보통 클라이언트 ID로 null를 사용하고 일반 유효성 검사 오류에 대한 <h:messages globalOnly="true">를 사용합니다. 동일한 접근법을 원할 수 있습니다. "사용자에게 제공해야하는 부분"에 대해서는 대신 required="true"을 사용합니다.

+0

감사합니다. BalusC! 사실, 저는 글로벌 메시지를 많이 사용합니다. 매우 실용적입니다. 그러나 나는 여전히 의심의 여지가 : 어떻게 구성 요소에 대해이 클라이언트 ID를 프로그래밍 방식으로 얻을 수 있습니까? 나는 그것을 응용 프로그램에서 하드 코딩하는 것은 매우 실용적이지 않다고 생각합니다. – brandizzi

+0

보통 당신은 validator를 사용할 것입니다. 실패 할 경우'ValidatorException'을 던져 JSF가 클라이언트 ID를 처리합니다. – BalusC

관련 문제