如何将h:message放在h:inputText的右侧?

时间:2012-05-12 16:41:23

标签: jsf facelets

我的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:消息,但这不起作用。如果我需要提供更多信息,请询问。

2 个答案:

答案 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)); } } }