有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当servlet发生异常时,java如何重定向到错误页面?

我正在编写一个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();

}

这是正确的方法吗?如果我错了,请纠正我,如果有更好的机制,请告诉我


共 (3) 个答案

  1. # 1 楼答案

    一种通用的处理方法是使用web。如下所示:

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

    我刚刚加入了IO exception,但你可能会说SQLException,你可以很好地为同样的内容添加另一个错误页面和另一个位置。类似地,你可以说java。lang.异常类型和一个处理所有事情的处理程序

  2. # 2 楼答案

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

    <error-page>
      <exception-type>java.lang.Throwable</exception-type>
      <location>/ErrorHandler</location>
    </error-page>
    

    servlet被抛出ServletExceptionIOException,但如果您想在单个异常处理程序中处理运行时异常和所有其他异常,可以将异常类型提供为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);
        }
    }
    
  3. # 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);
          }
      }