目前,我正在通过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,其中包含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中添加一个属性响应对象,并带有错误消息,但我认为这不是正确的方法(这将使小家伙失去isErrorPage
jsp web组件中的属性)。
谢谢你的时间。
我最近遇到了这个问题。此问题的原因是 Web 容器有自己的机制(Web.xml配置方式)来处理 servlet 的错误。JSP也可以使用这种方式,另外它可以使用指令元素中的errorPage属性来处理这个页面中的错误,这是JSP的特殊方式。你有点想把它们混合在一起。因此,最好考虑您真正想要的情况,并在不同的错误页面中单独使用它。当然,你可以把它们混合在一起,但它可能是丑陋的。如前所述,可以在属性中设置错误消息或将其作为查询参数传递。此外,您可以在错误页面中添加一些逻辑来识别不同的来源。