我尝试使用RequestContext发送Ajax回调,但我无法让它工作。
我尝试了Primefaces login demo,但是" args.loggedIn"在javascript函数中始终是未定义的,而" args"是一个对象。
这是我的代码:
dialogLogin.xhtml:
<h:body>
<h:outputLink
id="loginLink"
value="javascript:void(0)"
onclick="dlg.show()"
title="login">
Click
</h:outputLink>
<p:dialog id="dialog" header="Login" widgetVar="dlg">
<h:form>
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel for="username" value="Username:" />
<p:inputText value="#{logBean.username}"
id="username" required="true" label="username" />
<h:outputLabel for="password" value="Password:" />
<h:inputSecret value="#{logBean.password}"
id="password" required="true" label="password" />
<f:facet name="footer">
<p:commandButton id="loginButton" value="Login" update=""
actionListener="#{logBean.login}"
oncomplete="handleLoginRequest(xhr, status, args)"/>
</f:facet>
</h:panelGrid>
</h:form>
</p:dialog>
<script type="text/javascript">
function handleLoginRequest(xhr, status, args) {
if(args.validationFailed || !args.loggedIn) {
jQuery('#dialog').effect("shake", { times:3 }, 100);
} else {
dlg.hide();
jQuery('#loginLink').fadeOut();
}
}
</script>
</h:body>
LogBean.java:
@ManagedBean
public class LogBean {
private String username;
private String password;
// getters & setters
public void login(ActionEvent actionEvent) {
RequestContext context = RequestContext.getCurrentInstance();
boolean loggedIn = false;
if(username != null && username.equals("admin") && password != null && password.equals("admin")) {
loggedIn = true;
} else {
loggedIn = false;
}
System.out.println("loggedIn : " + loggedIn);
context.addCallbackParam("loggedIn", loggedIn);
}
}
javascript函数&#34; handleLoginRequest&#34;被称为,但&#34; args.loggedIn&#34;总是未定义的。我不明白为什么......
发送的响应(我从Firebug获得)是:
<?xml version="1.0" encoding="utf-8"?>
<partial-response>
<changes>
<update id="javax.faces.ViewState">
<![CDATA[3585116548358262356:-8608378680794066522]]>
</update>
</changes>
</partial-response>
非常感谢任何帮助!
答案 0 :(得分:1)
如果验证失败,您将从应用程序获得以下响应:
<extension ln="primefaces" type="args">{"validationFailed":true}</extension>
,其中包含仅包含 validationFailed : true
的JSON响应。响应中没有loggedIn
字段,这就是undefined
您拨打args.loggedIn
的原因。
如果验证通过但登录失败,您将收到以下响应:
<extension ln="primefaces" type="args">{"loggedIn":false}</extension>
此回复的值为loggedIn
,因此调用args.loggedIn
会产生false
。由于JSON响应中没有validationFailed
,因此调用args.validationFailed
会导致未定义。