4

我的 xhtml 页面代码:

<h:outputLabel value="Email address: " />
<h:inputText id="email" value="#{userBean.emailAddressBeingEdited}" required="true" requiredMessage="*" />
<h:message for="email" id="emailM"/>

我的java代码:

FacesContext.getCurrentInstance().addMessage("email", new FacesMessage("Email already in use"));

我尝试将 h:message 嵌套在 h:inputText 中,但这不起作用。如果我需要提供更多信息,请询问。

4

2 回答 2

4

您指定的客户端 IDaddMessage()必须是真实的客户端 ID,而不是组件 ID。输入组件的客户端 ID 通常以父表单组件的 ID 为前缀。对于尚未记住 JSF 组件实现NamingContainer以及如何生成客户端 ID 的初学者来说,找出真实客户端 ID 的最简单方法是在浏览器中打开页面,查看其源代码并找到生成的 HTML<input type="text">元素,最后获取其id. 如果您提供了<h:form>的 ID formId,它将是formId:email。这是您需要在 中指定的真实客户端 ID addMessage()

context.addMessage("formId:email", message);

如果您未指定正确的客户端 ID,则消息将保持未处理状态。如果 JSF 项目阶段设置为Development,则 JSF 将自动将其附加到正文末尾的“未处理消息”列表中。这就是你所看到的。查看生成的 HTML 源代码自己看,它是自动生成的 HTML 列表<ul id="javax_faces_developmentstage_messages">


与具体问题无关,您似乎正在 JSF bean 操作方法中进行验证。这不是正确的方法。您应该Validator为此使用 a 。这样您就无需担心客户端 ID。你只需要用 a 抛出ValidatorExceptiona FacesMessage。例如

@FacesValidator("uniqueEmailValidator")
public class UniqueEmailValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // ...

        if (emailIsAlreadyInUse) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email is already in use", null));
        }
    }

}

然后您将其注册为<f:validator validatorId="uniqueEmailValidator" />输入组件内部。

于 2012-05-12T17:10:54.803 回答
3
<h:panelGrid columns="3">
   <h:outputLabel value="Email address: " />
   <h:inputText id="email" value="#{userBean.emailAddressBeingEdited}" required="true" requiredMessage="*" />
   <h:message for="email" id="emailM"/>
</h:panelGrid>

这个??

于 2012-05-12T16:50:48.710 回答