我正在使用 Richfaces 3.2.2 并且需要在出现异常时向用户显示 500 错误页面。问题是当我使用 ajax 事件时,当出现异常时,我无法向用户显示 500 错误。我已经在 web.xml 上定义了错误页面。
原谅我的英语。请问有什么建议吗?
查看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 的建议让服务器端将其存储在会话中。
由于您使用的可能是 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");