我的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:inputText中嵌套h:消息,但这不起作用。如果我需要提供更多信息,请询问。
答案 0 :(得分: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>
此??
答案 1 :(得分:3)
您在addMessage()
中指定的客户端ID必须是真实的客户端ID,而不是组件ID。输入组件的客户端ID通常以父表单组件的ID为前缀。对于没有记住哪些JSF组件实现NamingContainer
以及如何生成客户端ID的初学者,找到真实客户端ID的最简单方法是在浏览器中打开页面,查看其来源并找到生成的HTML { {1}}元素,最后取其<input type="text">
。如果您为id
提供了<h:form>
的ID,那么它将是formId
。这是您需要在formId:email
中指定的真实客户端ID。
addMessage()
如果您未指定正确的客户端ID,则该消息仍未处理。如果JSF项目阶段设置为context.addMessage("formId:email", message);
,则JSF将自动将其附加到正文末尾的“未处理消息”列表中。这就是你所看到的。查看生成的HTML源代码,亲自查看,这是自动生成的HTML列表Development
。
无关,您似乎在JSF bean操作方法中进行验证。这不是正确的方法。您应该使用<ul id="javax_faces_developmentstage_messages">
。这样您就不必担心客户端ID。您只需要使用Validator
抛出ValidatorException
。 E.g。
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));
}
}
}
。