如前所述,Primefaces Captcha 组件无法通过 ajax 请求进行更新。但是有一个简单的解决方案 - 更新所有内容,但不更新 Captcha 组件本身。
你的 XHTML:
<h:form id="myForm">
<h:panelGroup id="updateFormAllValuesButNotCaptcha">
Name: <p:inputText id="name" value="#{captchaBean.name}" required="true"/>
<br/>
Comment: <p:inputTextarea id="comment" value="#{captchaBean.comment}" required="true"/>
<br/>
</h:panelGroup>
<p:captcha/>
<p:commandButton value="click me" update="updateFormAllValuesButNotCaptcha"
actionListener="#{captchaBean.someAction}" oncomplete="Recaptcha.reload()"
onerror="Recaptcha.reload()"/>
</h:form>
<p:messages globalOnly="false" autoUpdate="true"/>
你的支持bean:
@ManagedBean
@ViewScoped
public class CaptchaBean implements Serializable {
private String name;
private String comment;
public String getComment() { return comment; }
public void setComment(String comment) { this.comment = comment; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public void someAction() {
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Done", "");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
请注意,我正在更新updateFormAllValuesButNotCaptcha
包含所有表单输入字段但不包含验证码本身的面板。同样重要的是要注意验证码不能重复使用,因此您必须始终在 ajax 请求完成或以错误结束时重新加载它。
commandButton 的操作成功后更新的内容取决于您。您可以隐藏表单(不呈现)并仅显示确认消息,以确保用户不会再次尝试发送评论。