为了避免因不耐烦地按下提交按钮而导致的双重提交,您可以使用一段Javascript,在onclick后几毫秒禁用提交按钮.
例:
<h:commandButton
id="foo"
value="submit"
action="#{bean.submit}"
onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);"
/>
Run Code Online (Sandbox Code Playgroud)
要通过按后退按钮并忽略浏览器警告您可能有重新发送数据的风险来避免双重提交,您需要实现Post-Redirect-Get(PRG)模式.
在JSF中,这可以基本上以两种方式完成.使用<redirect/>in <navigation-case>:
<navigation-case>
<from-action>#{bean.submit}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/page.jsf</to-view-id>
<redirect/>
</navigation-case>
Run Code Online (Sandbox Code Playgroud)
或者通过调用ExternalContext#redirect()bean的action方法:
public void submit() {
doYourThing();
FacesContext.getCurrentInstance().getExternalContext().redirect("page.jsf");
}
Run Code Online (Sandbox Code Playgroud)
唯一的缺点是重定向隐式地创建了一个新请求,因此包含了包含其所有属性的初始请求(因此也包括所有请求范围的托管bean FacesMessages).在某些情况下它并不重要,但在其他情况下肯定会.我不做Seam,但如果我是正确的,他们已经通过所谓的会话范围解决了这个问题,并FacesMessages通过重定向自动保留.你可以从中受益.
小智 6
Seam附带了s:token组件,它正是你要找的:http: //docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/controls.html#d0e28933
| 归档时间: |
|
| 查看次数: |
3434 次 |
| 最近记录: |