我们在 WebSphere v8.5 上使用 JSF 2.0 和几个组件库 PrimeFaces 4.0、Tomahawk 2.0、RichFaces 等。
我正在寻找通用机制来避免在刷新页面或再次单击提交按钮时重新提交表单。我有许多不同场景的应用程序。
现在我已经考虑在属性中使用一段 JavaScript 来禁用按钮onclick
,但这并不令人满意。为此,我正在寻找一个纯 Java 实现,例如 Struts2 <s:token>
。
我们在 WebSphere v8.5 上使用 JSF 2.0 和几个组件库 PrimeFaces 4.0、Tomahawk 2.0、RichFaces 等。
我正在寻找通用机制来避免在刷新页面或再次单击提交按钮时重新提交表单。我有许多不同场景的应用程序。
现在我已经考虑在属性中使用一段 JavaScript 来禁用按钮onclick
,但这并不令人满意。为此,我正在寻找一个纯 Java 实现,例如 Struts2 <s:token>
。
我正在寻找通用机制来避免刷新页面时重新提交表单
为此,至少有 2 个解决方案无法组合:
在同步发布后执行重定向。这样刷新只会重新执行重定向的 GET 请求而不是初始请求。缺点:您不能再利用请求范围向最终用户提供任何反馈。JSF 2.0 通过提供新的flash 作用域解决了这个问题。另请参阅如何在重定向页面中显示面孔消息。
在后台异步执行 POST(使用 ajax)。这样刷新只会重新执行打开表单的初始 GET 请求。您只需要确保这些表单最初仅由 GET 请求打开,即您永远不应该通过 POST 执行页面到页面导航(无论如何,这本身已经是一个糟糕的设计)。另请参阅何时应该使用 h:outputLink 而不是 h:commandLink?
或再次单击提交按钮时
为此,基本上还有至少 2 种解决方案,如有必要,可以组合:
只需阻止最终用户在提交期间和/或成功提交后按下提交按钮即可。这有多种方法,都取决于具体的功能和设计要求。您可以在提交期间使用 JavaScript 禁用该按钮。您可以在提交后使用 JSFdisabled
或属性来禁用或隐藏按钮。rendered
另请参阅如何在 JSF 2 中防止双击。您还可以在处理 ajax 请求期间使用覆盖窗口来阻止任何最终用户交互。PrimeFaces 就是<p:blockUI>
为了这个目的。
验证服务器端新添加实体的唯一性。如果您出于技术原因而不是出于功能原因绝对想避免重复,这将更加强大。这相当简单:对有UNIQUE
问题的 DB 列施加约束。如果违反了这个约束,那么 DB(以及像 JPA 这样的 DB 交互框架)将抛出一个违反约束的异常。最好结合自定义 JSF 验证器来完成此操作,该验证器通过SELECT
在该列上执行 a 并检查是否没有返回记录来预先验证输入。JSF 验证器允许您以友好面孔消息的形式显示问题。另请参阅Validate email format and uniqueness against DB。
您可以使用 BalusC 的解决方案,而不是手动创建令牌。他在博客中提出了 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
}