3

我正在使用 Richfaces 3.2.2 并且需要在出现异常时向用户显示 500 错误页面。问题是当我使用 ajax 事件时,当出现异常时,我无法向用户显示 500 错误。我已经在 web.xml 上定义了错误页面。

原谅我的英语。请问有什么建议吗?

4

2 回答 2

4

查看RichFaces 开发人员指南第 5.10.1 章。

5.10.1 请求错误处理

要在 Ajax 请求期间发生错误时在客户端执行您自己的代码,有必要重新定义标准的“A4J.AJAX.onError”方法:

A4J.AJAX.onError = function(req, status, message){
    window.alert("Custom onError handler "+message);
}

以这种方式定义的函数接受作为参数:

  • req- 调用错误的请求的参数字符串
  • status- 服务器返回的错误编号
  • message- 给定错误的默认消息

因此,可以创建自己的处理程序,在超时、内部服务器错误等情况下调用。

因此,要显示服务器生成的错误响应,您需要执行以下操作:

A4J.AJAX.onError = function(req, status, message){
    document.open();
    document.write(req.responseText);
    document.close();
}

重定向到错误页面,请执行以下操作:

A4J.AJAX.onError = function(req, status, message){
    window.location = 'error.jsf';
}

您只需将强制性错误详细信息作为请求参数传递,或者按照 Odelya 的建议让服务器端将其存储在会话中。

相关问题:

于 2010-07-29T18:12:17.167 回答
2

由于您使用的可能是 JSF1.2 而不是 JSF2,因此您可以使用它FaceletViewHandler来处理异常。

public class CustomViewHandler extends FaceletViewHandler {
    ...
    @Override
    protected void handleRenderException(FacesContext context, Exception ex) throws IOException, ELException,
        FacesException {
        try {
            ..

            getSessionMap().put("GLOBAL_ERROR", ex);
            getHttpResponseObject().sendRedirect("/error.jsf");
        } catch (IOException e) {
            log.fatal("Couldn't redirect to error page", e);
        }
    }
}

当然,你需要在bean中处理它,只需从会话中提取异常:

Throwable ex = (Exception) getSessionMap().remove("GLOBAL_ERROR");
于 2010-07-29T15:11:40.790 回答