2011-02-18 54 views
2

我已經在Glassfish 3運行在JSF以下驗證形式:H:與用於屬性信息元素在JSF不存在消息2

<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方法是下面的一種:

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: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屬性相同。


無關的問題,我通常使用null作爲客戶端ID,並使用<h:messages globalOnly="true">一般驗證錯誤。你可能想採取相同的方法。對於「您需要給用戶」部分,我只需使用required="true"

+0

謝謝,BalusC!實際上,我使用全局消息很多,它們非常實用。但是,我仍然懷疑:我怎樣才能以編程方式獲取組件的此客戶端ID?我認爲在應用程序中對它進行硬編碼並不是很實際... – brandizzi 2011-02-28 01:46:29