您指定的客户端 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 抛出ValidatorException
a 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" />
输入组件内部。