如何使用errorPage属性从JSP捕获Servlet异常?

时间:2019-03-04 03:32:18

标签: java jsp servlets

当前,我正在通过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调用LanzaError Servlet,该Servlet在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代码来实现。我想从方法中抛出异常(就像方法签名所说的那样:throws ServletException,IOException`)。

感谢您的帮助。

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

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

  

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

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

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

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

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

但是,现在我有一个新问题,在这段代码中,我添加了RequestDispatcher:

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时,它不会像错误一样检测到该请求,因此,它不会检测到隐式对象exceptionError.jsp导致nullPointerException。有人知道我该如何进行吗?

另一种处理方法可能是在servlet捕获的响应对象中添加一个属性,并带有错误消息,但是我不认为这是正确的处理方法(这会使{ jsp Web组件中的{1}}属性。

感谢您的时间。

0 个答案:

没有答案