JavaH:带有for属性的消息元素在JSF2中不显示消息
我在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>
{
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";
}
}
如果没有给出用户登录名,我会尝试用<h:message for="login-user" />
行显示一条特定的消息。但是,它不起作用:如果我在用户字段为空的情况下单击submit按钮,<h:messages globalOnly="true" errorClass="erro" />
元素会显示"Authentication failed"
,但是<h:message for="login-user" />
组件不会像我预期的那样显示"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)]
)
我做错了什么
提前谢谢
# 1 楼答案
您需要指定客户端ID,而不是组件ID。根据给定的视图代码,这将是:
如果这不起作用,您需要在浏览器中打开页面并查看其生成的HTML源代码。它应该与生成的HTML
<input>
元素的id
属性相同与问题无关,我通常使用
null
作为客户端ID,并使用<h:messages globalOnly="true">
作为一般验证错误。你可能想采取同样的方法。对于“你需要给用户”部分,我只使用required="true"