单击 h:commandLink 后单击 a4j:commandLink 时页面冻结

Page Freezes When a4j:commandLink is Clicked After Clicking on h:commandLink

我有一个带有支持 bean 的 jsf 页面。该页面包含 h:form 多个输入字段和按钮。整个页面使用 h:commandLink 提交,同时还有几个 a4j:commandLink 按钮。 h:commandLink 提交页面后单击 a4j:commandLink 按钮,页面将无限期地进入 "Loading, please wait" 状态。

页面看起来像:

<a4j:region>
    <rich:dataTable id="itemsTable" ...>
        <!-- richColumns-->

        <rich:column>
            <a4j:commandLink id="calculate_item" action="#{BackingBean.calculateItem}" value="Calculate" reRender="itemsTable">
                <f:param name="itemIndex" value="#{rowIndex}" />
            </a4j:commandLink>

            <a4j:commandLink id="delete_item" immediate="true" action="#{BackingBean.cleanItem}" value="Delete" reRender="itemsTable">
                <f:param name="itemIndex" value="#{rowIndex}" />
            </a4j:commandLink>
        </rich:column>

        <f:facet name="footer">
            <!-- richColumns-->

            <rich:column>
                <a4j:commandLink id="sum_all" styleClass="submit input-submit" action="#{BackingBean.calculateTotalSum}" value="Calculate Total" reRender="itemsTable" />
            </rich:column>
        </f:facet>
    </rich:dataTable>
</a4j:region>

<h:commandLink id="save" styleClass="submit" value="Save" action="#{BackingBean.save}" />

我的 BackingBean 如下所示:

public class BackingBean {

    // Fields and methods

    public void calculateItem() {
        // calculates
    }

    public void calculateTotalSum() {
        // calculates total
    }

    public String save() {
        boolean formIsValid = true;

        // do validations

        // save if the form is valid

        return formIsValid ? "success" : null;           
    }
}

问题是: 为什么 a4j:commandLink "Calculate" 和 "Calculate Total" 的行为不同以及如何解决 a4j:commandLink 的问题"Calculate Total"(有什么问题)?

P.S. 忘了说一件事:如果我用

 <a4j:commandLink id="sum_all" action="#{BackingBean.calculateTotalSum}" value="Calculate Total" reRender="itemsTable" />

<h:commandLink id="sum_all" action="#{BackingBean.calculateTotalSum}" value="Calculate Total">
    <a4j:support reRender="itemsTable" event="" />
</h:commandLink>

一切正常,但有一个限制:单击按钮后所有验证消息都将被删除。

我终于解决了这个问题。 原因是 css "submit" class 用于带有 "input-submit" class 的 "Calculate Total" 按钮。我试图找到导致问题的确切属性,但找不到。所以一个变通的解决方案是:添加一个新的 css class: "audit-input-submit" 这是 "submit" 和 "input-submit" [=21= 的属性的组合]es(不包括重复项)。之后问题解决了。当然,如果我能找到导致问题的确切 css 属性值会更好。