所以我在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>
上显示消息而不重新加载页面。如果成功,我希望重定向发生。这些都不起作用。
我做错了什么?
答案 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”。