2014-11-07 8 views
5

Sto scrivendo un servlet, nel senso che se si verifica un'eccezione non voglio visualizzare messaggi di eccezione/errore sul browser, quindi reindirizzerò alla mia pagina di errore personalizzata. Così ho fatto in questo modo:Come reindirizzare alla pagina di errore quando si verifica un'eccezione dal 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(); 

} 

È questo il modo corretto, se mi sbaglio vi prego di correggermi, e se non v'è alcun meccanismo meglio la prego di dirmi.

+0

duplicati di http://stackoverflow.com/q/7066192 Performing in avanti() come nel tuo snippet e nella risposta che segue è di almeno sbagliata. Se vuoi davvero farlo a livello di codice, dovresti usare sendError(), non forward(). – BalusC

risposta

1

unico modo per gestire in modo generico è quello di utilizzare web.xml come di seguito:

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

Il servlet è gettato ServletException e IOException, ma se si vuole gestire le eccezioni di runtime e di tutte le altre eccezioni in una sola eccezione gestore, è possibile fornire un tipo di eccezione come Throwable. È possibile utilizzare più voci della pagina di errore che gestiranno tipi diversi di eccezioni e avranno gestori diversi.

Esempio:

@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); 
    } 
} 
+0

Grazie, Quindi ora cosa dovrebbe essere nel blocco "catch" e nel servlet "ErrorHandler"? Per favore, mostrami un piccolo codice di esempio. – Raghu

+0

Nel blocco catch è possibile inoltrare a '/ ErrorHandler' invece della pagina di errore. L'esempio del servlet gestore errori che ho pubblicato. –

+0

oh. . Grazie a U, & Come posso stampare l'oggetto 'statusCode',' throwable' nella pagina jsp. – Raghu

1

In qualche metodo, si avrebbe la seguente:

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

Grazie, è per un servlet, v può scrivere un metodo come questo, ma non possiamo scrivere questo metodo per ogni servlet rt? Ho alcuni servlet. – Raghu

1

Un modo per gestire la cosa in modo generico è quello di utilizzare web.xml come di seguito:

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

ho appena inserito Eccezione IO, ma potresti dire SQLException potresti aggiungere molto bene un'altra pagina di errore e un'altra posizione per lo stesso. Allo stesso modo potresti dire il tipo java.lang.Exception e un gestore che gestisce tutto.

+0

Sto usando la versione recente del servlet quindi non uso avere web.xml, quindi come posso configurare nel mio progetto. – Raghu

+0

Come aggiungere un web.xml? –

Problemi correlati