servlet发生异常时如何重定向到错误页面?
Posted
技术标签:
【中文标题】servlet发生异常时如何重定向到错误页面?【英文标题】:How to redirect to error page when exception occurs from servlet? 【发布时间】:2015-01-04 05:35:02 【问题描述】:我正在编写一个 servlet,如果发生任何异常,我不想在浏览器上显示异常/错误消息,所以我将重定向到我自定义的错误页面。所以我这样做了:
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
try
//Here is all code stuff
catch(Exception e)
request.getRequestDispatcher("/ErrorPage.jsp").forward(request, response);
e1.printStackTrace();
这是正确的方法吗,如果我错了,请纠正我,如果有更好的机制,请告诉我。
【问题讨论】:
重复***.com/q/7066192 在您的 sn-p 和下面的答案中执行 forward() 至少是错误的。如果您真的想以编程方式执行此操作,则应该使用 sendError(),而不是 forward()。 【参考方案1】:以通用方式处理它的唯一方法是使用web.xml
,如下所示:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/ErrorHandler</location>
</error-page>
servlet 被抛出ServletException
和IOException
,但如果您想在单个异常处理程序中处理运行时异常和所有其他异常,您可以提供异常类型为Throwable
。您可以使用多个错误页面条目来处理不同类型的异常并具有不同的处理程序。
示例:
@WebServlet("/ErrorHandler")
public class ErrorHandler extends HttpServlet
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
processError(request, response);
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
processError(request, response);
private void processError(HttpServletRequest request,
HttpServletResponse response) throws IOException
//customize error message
Throwable throwable = (Throwable) request
.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer) request
.getAttribute("javax.servlet.error.status_code");
String servletName = (String) request
.getAttribute("javax.servlet.error.servlet_name");
if (servletName == null)
servletName = "Unknown";
String requestUri = (String) request
.getAttribute("javax.servlet.error.request_uri");
if (requestUri == null)
requestUri = "Unknown";
request.setAttribute("error", "Servlet " + servletName +
" has thrown an exception " + throwable.getClass().getName() +
" : " + throwable.getMessage());
request.getRequestDispatcher("/ErrorPage.jsp").forward(request, response);
【讨论】:
谢谢你,那么现在catch
块和ErrorHandler
Servlet 应该是什么?你能用小示例代码告诉我吗?
在catch块中你可以转发到/ErrorHandler
而不是错误页面。我发布的错误处理 servlet 示例。
哦。 .谢谢你,&我如何在jsp页面中打印statusCode
,throwable
对象。
$statusCode
和 $throwable
我没有得到 jsp 中的值,但是如果我在 out.prinln()
的 servlet 中打印它,这些值会被打印出来。【参考方案2】:
以通用方式处理它的一种方法是使用 web.xml,如下所示:
<error-page>
<exception-type>java.io.IOException</exception-type >
<location>/ErrorHandler</location>
</error-page>
我刚刚包含了 IO 异常,但您可能会说 SQLException 您可以很好地添加另一个错误页面和另一个位置。同样,您可以说 java.lang.Exception 类型和一个处理所有事情的处理程序。
【讨论】:
我使用的是最新版本的 servlet,所以我没有使用 web.xml,所以如何在我的项目中进行配置。 添加一个web.xml怎么样?【参考方案3】:在某些方法中,您将拥有以下内容:
try
// something
catch (Exception e)
sendErrorRedirect(req, res, "/errorpage.jsp", e);
// then.... sendErrorRedirect looks like this:
protected void sendErrorRedirect(HttpServletRequest request, HttpServletResponse response, String errorPageURL, Throwable e)
try
request.setAttribute ("javax.servlet.jsp.jspException", e);
getServletConfig().getServletContext().getRequestDispatcher(errorPageURL).forward(request, response);
catch (Exception ex)
putError("serXXXXX.sendErrorRedirect ", ex);
【讨论】:
谢谢你,这是一个servlet,v可以写这样的方法,但我们不能为每个servlet写这个方法rt?我有很多 servlet。以上是关于servlet发生异常时如何重定向到错误页面?的主要内容,如果未能解决你的问题,请参考以下文章