【问题标题】:h:message elements with for attribute do not present messages in JSF 2具有 for 属性的 h:message 元素在 JSF 2 中不显示消息
【发布时间】:2011-06-29 23:30:21
【问题描述】:

我在 Glassfish 3 上运行的 JSF 中有以下身份验证表单:

<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";
    }
}

如果没有给出用户登录名,我会尝试显示一条特定的消息,即&lt;h:message for="login-user" /&gt;。但是它不起作用:如果我单击带有空用户字段的提交按钮,&lt;h:messages globalOnly="true" errorClass="erro" /&gt; 元素会显示"Authentication failed",但&lt;h:message for="login-user" /&gt; 组件不会像我预期的那样显示"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)]

)

我做错了什么?

提前致谢!

【问题讨论】:

    标签: java jsf-2 glassfish facelets


    【解决方案1】:

    您需要指定客户端 ID,而不是组件 ID。根据给定的视图代码,这将是:

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

    如果这不起作用,您需要在浏览器中打开页面并查看其生成的 HTML 源代码。它应该与生成的HTML &lt;input&gt; 元素的id 属性相同。


    与问题无关,我通常使用null 作为客户端ID,使用&lt;h:messages globalOnly="true"&gt; 处理一般验证错误。您可能希望采用相同的方法。对于“你需要给用户”部分,我只使用required="true"

    【讨论】:

    • 谢谢,BalusC!事实上,我使用全局消息很多,它们非常实用。但是,我仍然有一个疑问:如何以编程方式获取组件的此客户端 ID?我想在应用程序中硬编码它不是很实用......
    • 为此,您通常会使用验证器。只需抛出一个ValidatorException 以防失败,JSF 将处理客户端 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多