如何从带有错误页面属性的 JSP 中捕获 Servlet 异常?



目前,我正在通过Web组件(servlet和JSP)开发一个Web项目,Jsp组件使用"脚本元素"在产生异常时重定向请求(特别是指令元素和errorPage属性,如下例所示):

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" errorPage="Error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
</head>
<body>
<form name="formulario" method="get" action="http://localhost:8080/Pruebas/LanzaError">
User: <input type="text" name="user">
<input type="submit" value="Send">
</form>
</body>
</html>

上面的 JSP 调用LanzaErrorServlet,其中包含doGet方法中的以下代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       
if (true) {
throw new ServletException("Error de Servlet");
}
}

你怎么看,我故意制作了一个ServletException.

就像我在指令元素中使用errorPage属性一样,我认为 JSP 应该重定向到Error.jsp页面,其中包含以下代码:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
</head>
<body>
<h1><%= exception.getLocalizedMessage() %></h1>
</body>
</html>

但是,当从 servlet 生成异常时,它不会发生。

有人知道当 servlet 中产生异常时,我该如何重定向到 Error.jsp 页面吗?我不想用RequestDispatcher代码来做.我想从方法中抛出异常(就像方法签名说的那样:抛出ServletException,IOException')。

感谢您的帮助。

编辑--------------:

在网站链接中,我阅读了以下评论:

以通用方式处理它的一种方法是使用 web.xml如下所示:

<error-page>
<exception-type>java.io.IOException</exception-type >
<location>/ErrorHandler</location>
</error-page>

我刚刚包括了 IO 异常,但您可能会说 SQLException 您很可能会添加另一个错误页面和另一个位置 一样。类似地,你可以说java.lang.Exception type和一个 处理程序处理一切。

但是,如果我添加 xmlerror-page元素,那么对异常的控制将是绝对的,即它们在 servlet 之间共享的每种类型的异常(或具有相同的状态代码)都应该具有相同的错误页面(因为这种方式是在描述符 web.xml 中声明的)。如果我错了,请纠正我。

出于这个原因,我认为在任何情况下,当只有一个 servlet 抛出某个错误页面时,最合适的方法是使用"RequestDispatche"(这样您就不必向 web.xml 添加任何其他新元素)。

但是,现在我有一个新问题,在此代码中,我添加了请求调度程序:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       
try {
if (true) {
throw new ServletException("Error de Servlet");
}
}catch(Exception e) {
RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
rd.forward(request, response);
}
}

当请求最终到达Error.jsp时,它不会像错误一样检测到请求,因此它不会检测到隐式对象exception并且Error.jsp会导致nullPointerException。有人知道我该怎么做吗?

另一种方法可能是从servlet catch中添加一个属性响应对象,并带有错误消息,但我认为这不是正确的方法(这将使小家伙失去isErrorPagejsp web组件中的属性)。

谢谢你的时间。

我最近遇到了这个问题。此问题的原因是 Web 容器有自己的机制(Web.xml配置方式)来处理 servlet 的错误。JSP也可以使用这种方式,另外它可以使用指令元素中的errorPage属性来处理这个页面中的错误,这是JSP的特殊方式。你有点想把它们混合在一起。因此,最好考虑您真正想要的情况,并在不同的错误页面中单独使用它。当然,你可以把它们混合在一起,但它可能是丑陋的。如前所述,可以在属性中设置错误消息或将其作为查询参数传递。此外,您可以在错误页面中添加一些逻辑来识别不同的来源。

最新更新