我们在WebSphere v8.5上使用JSF 2.0,其中有几个组件库PrimeFaces 4.0,Tomahawk 2.0,RichFaces等。
我正在寻找通用机制,以避免刷新页面时重新提交表单,或者再次单击提交按钮时。我有许多不同场景的应用程序。
现在我已经考虑过用onclick
属性中的一段JavaScript来禁用该按钮,但这并不令人满意。我正在寻找一个用于此目的的纯Java实现,类似于Struts2 <s:token>
。
我正在寻找通用机制,以避免刷新页面时重新提交表单
为此,至少有两种解决方案无法组合:
或者再次点击提交按钮时
为此,基本上还有至少2个解决方案,必要时可以组合使用:
disabled
或rendered
属性在提交后禁用或隐藏按钮。另见How to do double-click prevention in JSF 2。您还可以在处理ajax请求期间使用覆盖窗口来阻止任何最终用户交互。 PrimeFaces有<p:blockUI>
为目的。UNIQUE
约束。如果违反了此约束,则DB(和JPA等数据库交互框架)将抛出约束违例异常。最好与自定义JSF验证器结合使用,该验证器通过在该列上执行SELECT
并检查是否未返回任何记录来预先验证输入。 JSF验证器允许您显示友好面部消息的风格问题。另见Validate email format and uniqueness against DB。您可以使用BalusC的解决方案,而不是手动创建令牌。他在his blog提出了Post-Redirect-GET模式
在这些答案中可以找到替代解决方案:
<!--Tag to show message given by bean class -->
<p:growl id="messages" />
<h:form>
<h:inputText a:placeholder="Enter Parent Organization Id" id="parent_org_id" value="#{orgMaster.parentOrganization}" requiredMessage="Parent org-id is required" />
<h:commandButton style="margin-bottom:8px;margin-top:5px;" class="btn btn-success btn-block " value="Save" type="submit" action="#{orgMaster.save}" onclick="resetform()" />
</h:form>
public String save() {
FacesContext context = FacesContext.getCurrentInstance();
context.getExternalContext().getFlash().setKeepMessages(true); //This keeps the message even on reloading of page
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Your submission is successful.", " ")); // To show the message on clicking of submit button
return "organizationMaster?faces-redirect=true"; // to reload the page with resetting of all fields of the form.. here my page name is organizationMaster...you can write the name of form whose firlds you want to reset on submission
}