簡體   English   中英

從servlet發生異常時如何重定向到錯誤頁面?

[英]How to redirect to error page when exception occurs from servlet?

我正在寫一個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();

}

這是正確的方法,如果我錯了請糾正我,如果有更好的機制請告訴我。

以通用方式處理它的唯一方法是使用如下所示的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);
    }
}

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

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

我剛剛包含了IO異常,但你可能會說SQLException你可以很好地添加另一個錯誤頁面和另一個位置。 類似地,您可以說java.lang.Exception類型和一個處理所有內容的處理程序。

在某些方法中,您將擁有以下內容:

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);
      }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM