在jdk 8下的jsf中使用javascript on h:commandLink防止双重表单提交

时间:2014-09-10 19:35:41

标签: javascript jsp jsf

我们有一个JSF / Tomcat / Hibernate / Oracle应用程序,我们希望升级到Java 8.我们使用Eclipse进行开发。升级到Java 8(jdk 8)以及升级到Eclipse Luna和Tomcat 7.0.54后,我们遇到了两个问题。不太严肃的是,一些图形渲染具有新的外观,不像以前那么好。更严重的问题是我们有一个双表单提交预防脚本,现在导致我们的h:commandLink组件挂起。点击这样的链接后,URL会附加一个#,随后点击链接(或页面上的其他按钮)会显示我们的警告“已经提交 - 请稍候...”,它来自我们的脚本。我们的脚本是:

// Prevent double form submissions
var defaultSubmit = null;
var formSubmitted = false;

function initForm() {
    if (defaultSubmit == null) {
        defaultSubmit = document.forms[0].submit;
        document.forms[0].submit = submitForm;
        document.forms[0].onsubmit = checkFormSubmission;
    }
    formSubmitted = false;
}
function checkFormSubmission() {
    if (formSubmitted) {
        alert('Already submitted - please wait...');
        return false;
    } else {
        formSubmitted = true;
        return true;
    }
}
function submitForm() {
    if (checkFormSubmission()) {
        if (defaultSubmit != null) {
            return defaultSubmit();
        }
    }
    return false;
}

</script>

上面的脚本是jsp文件的一部分,该文件包含在我们应用程序中的许多其他jsp文件中。它使用jdk 5,6和7运行良好,但现在有问题。 h:commandButton的工作正常,但是h:commandLink导致应用程序挂起,如上所述。如何修复它以使用jdk 8?

1 个答案:

答案 0 :(得分:0)

使用h:commandLink在线搜索onsubmit表明onclick是一个更好的选择,这可以解决我们的主要问题。首先,我们需要替换&#34; h:commandLink ...&#34; by&#34; h:commandLink onclick =&#34; return checkFormSubmission();&#34; ......程序中的任何地方。我们的脚本也需要被新脚本替换:

var initialized = false;
var formSubmitted = false;

function initForm() {
    if (initialized == false) {
        document.forms[0].onsubmit = checkFormSubmission;
        initialized = true;
}
    formSubmitted = false;
}
function checkFormSubmission() {
    if (formSubmitted) {
        alert('Already submitted - please wait...');
        return false;
    } else {
        formSubmitted = true;
        return true;
    }
}

完成上述所有更改后,我们的双击保护将再次按预期工作。一旦在h:commandLink或h:commandButton上进行了点击,随后的点击会弹出警告告诉用户:&#34;已经提交 - 请等待......&#34;,此警报显示为no随后按下h:commandLink或h:commandButton的问题。这是我们理想的行为。