在h:outputText上显示验证消息

时间:2015-04-22 00:35:34

标签: ajax jsf

所以我在login.xhtml上有这个表格:

<h:form id="login">
    <p:graphicImage url="img/logo.jpg" width="448" height="119"/>
    <p> Si pertenece a una empresa, inserte su usuario y password. </p>
    <p:outputLabel for="usuario" value="Usuario:" />
    <p:inputText id="usuario" value="#{loginController.login.username}"/>
    <p:outputLabel for="password" value="Password:" />
    <p:password id="password" value="#{loginController.login.password}"/>
    <p:commandButton value="Login" update="out" actionListener="#{loginController.login()}"/>
    <h:outputText id="out" />
    <a href="#"> Si no pertenece a una empresa, haga click para continuar</a>
</h:form>

单击该按钮时,将激活此方法:

public String login() {
    login = service.login(login.getUsername(), login.getPassword());

    if (login.getUsername() == null) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Usuario y/o password incorrecto!"));
        return null;
    } else {
        return "index.jsf?faces-redirect=true";
    }
}

我正在尝试验证用户是否存在但使用AJAX。因此,如果用户名和密码不正确,我希望它在<h:outputText>上显示消息而不重新加载页面。如果成功,我希望重定向发生。这些都不起作用。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

<h:outputText>不是为了显示面部消息而设计的。你可以在下面讨论

<h:outputText value="#{facesContext.messageList[0].summary}" />

但这很难看。您应该使用<h:message><h:messages>来显示面孔消息(当然还有PrimeFaces <p:xxx>等价物。)

使用addMessage(null, message)您的null客户端ID基本上会添加全局消息。您可以完全按以下方式显示它们:

<h:messages globalOnly="true" />

您还可以为特定组件添加消息 addMessage("login", message),引用<h:form id="login">

context.addMessage("login", new FacesMessage("Unknown login. Perhaps you want to sign up?"));

您可以使用其<h:message>属性完全引用该ID的for来显示它:

<h:message for="login" />

当然,请给它id并在<p:commandButton update>中引用它。

<p:commandButton ... update="loginMessage" />
...
<h:message id="loginMessage" for="login" />

<p:xxx>等价物具有autoUpdate="true"属性,无需这样做。

另见:


关于重定向失败,这是由于PrimeFaces展示示例在actionListener上遍布所有地方action而不是<p:commandButton>引起的,因此实际上打算调用的启动者会感到困惑使用<p:commandButton>进行商业操作和导航。

您应该使用action属性。

<p:commandButton ... action="#{loginController.login}" />

另见:

答案 1 :(得分:0)

在命令按钮上,您使用actionListener进行导航,而actionListener用于返回void的方法。如果你必须导航使用“h:commandButton”的“action”属性而不是“actionListener”。