如何在JS中处理commandButton操作引发的错误消息

时间:2013-01-04 12:21:13

标签: jsf jsf-2 primefaces facelets

在JSF 2.1 wep app中,我有一个包含commandButton的dataTable列。 commandButton触发的操作可能会引发错误。 我想在没有引发错误的情况下打开一个对话框,或者在另一种情况下打开一个包含错误消息的框

JSF

<h:form>
    <p:dataTable var="foo" value="#{myBean.foos}" >
        <p:column>#{foo.id}</p:column>
        <p:column>
            <p:commandButton title="Action" action="#{myBean.action()}" onComplete="handleResult(xhr, status, args)" >
                <f:setPropertyActionListener value="#{foo}" target="#{myBean.selectedFoo}" />
            </p:commandButton>
        </p:column>
    </p:dataTable>
</h:form>

的JavaScript

function handleRequest(xhr, status, args) {
    if (!args.success) {
        displayBox(args.errorMsg);
    } else {
        displayDialog();
    }
}

为myBean

@ManagedBean
@ViewScoped
public class MyBean {
    private List<Foo> foos;
    private Foo selectedFoo;

    public void action() {
        try {
            // business logic
        } catch (Exception ex) {
            RequestContext rContext = RequestContext.getCurrentInstance();
            rContext.addCallbackParam("success", false);
            rContext.addCallbackParam("errorMsg", ex.getMessage());
        }
    }
}

我能想到的唯一解决方案是使用PrimeFaces'RequestContext.callBackParam()并编写一个JS函数来读取它并决定打开什么。

有更顺畅的方式吗?如果可能的话,我会考虑利用验证的概念,但我找不到如何拦截JS中的错误的例子。

1 个答案:

答案 0 :(得分:2)

规范方法是只添加一个全局面部消息(因此,使用null客户端ID)。

public void action() {
    try {
        // business logic
    } catch (Exception ex) {
        context.validationFailed();
        context.addMessage(null, new FacesMessage(
            FacesMessage.SEVERITY_ERROR, ex.getMessage(), null));
    }
}

(调用FacesContext#validationFailed()会导致EL中的#{facesContext.validationFailed}评估true;通常会设置为ValidatorException

然后,要仅显示全局消息的框,只需使用<p:messages globalOnly="true">

<p:messages globalOnly="true" autoUpdate="true" />

要显示成功结果的对话框,请在执行successful postback时进行渲染:

<p:outputPanel autoUpdate="true">
    <p:dialog visible="true" rendered="#{facesContext.postback and not facesContext.validationFailed}">
        A successful postback is performed!
    </p:dialog>
</p:outputPanel>

如有必要autoUpdate="true"替换update="messagesId dialogPanelId"中的一个或两个组件,只有在按下特定按钮时才会触发。