Servlet - Gestione delle eccezioni

Quando un servlet genera un'eccezione, il contenitore web cerca le configurazioni in web.xml che utilizzano l'elemento di tipo eccezione per una corrispondenza con il tipo di eccezione generato.

Dovresti usare il file error-page elemento in web.xml per specificare l'invocazione di servlet in risposta a determinati exceptions o HTTP status codes.

Configurazione web.xml

Considera, hai un servlet ErrorHandler che verrebbe chiamato ogni volta che c'è un'eccezione o un errore definito. Di seguito sarebbe la voce creata in web.xml.

<!-- servlet definition -->
<servlet>
   <servlet-name>ErrorHandler</servlet-name>
   <servlet-class>ErrorHandler</servlet-class>
</servlet>

<!-- servlet mappings -->
<servlet-mapping>
   <servlet-name>ErrorHandler</servlet-name>
   <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<!-- error-code related error pages -->
<error-page>
   <error-code>404</error-code>
   <location>/ErrorHandler</location>
</error-page>

<error-page>
   <error-code>403</error-code>
   <location>/ErrorHandler</location>
</error-page>

<!-- exception-type related error pages -->
<error-page>
   <exception-type>
      javax.servlet.ServletException
   </exception-type >
   <location>/ErrorHandler</location>
</error-page>

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

Se si desidera avere un gestore degli errori generico per tutte le eccezioni, è necessario definire la seguente pagina di errore invece di definire elementi di pagina di errore separati per ogni eccezione -

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

Di seguito sono riportati i punti da notare su web.xml sopra per la gestione delle eccezioni:

  • Il servlet ErrorHandler è definito normalmente come qualsiasi altro servlet e configurato in web.xml.

  • Se si verifica un errore con il codice di stato 404 (non trovato) o 403 (vietato), verrà chiamato il servlet ErrorHandler.

  • Se l'applicazione Web genera ServletException o IOException, il contenitore Web richiama il servlet / ErrorHandler.

  • È possibile definire diversi gestori di errori per gestire diversi tipi di errori o eccezioni. L'esempio sopra è molto generico e spero che serva allo scopo di spiegarti il ​​concetto di base.

Attributi della richiesta: errori / eccezioni

Di seguito è riportato l'elenco degli attributi di richiesta a cui un servlet di gestione degli errori può accedere per analizzare la natura dell'errore / eccezione.

Sr.No. Attributo e descrizione
1

javax.servlet.error.status_code

Questo attributo fornisce un codice di stato che può essere memorizzato e analizzato dopo la memorizzazione in un tipo di dati java.lang.Integer.

2

javax.servlet.error.exception_type

Questo attributo fornisce informazioni sul tipo di eccezione che possono essere memorizzate e analizzate dopo la memorizzazione in un tipo di dati java.lang.Class.

3

javax.servlet.error.message

Questo attributo fornisce informazioni sul messaggio di errore esatto che può essere memorizzato e analizzato dopo la memorizzazione in un tipo di dati java.lang.String.

4

javax.servlet.error.request_uri

Questo attributo fornisce informazioni sull'URL che chiama il servlet e può essere memorizzato e analizzato dopo la memorizzazione in un tipo di dati java.lang.String.

5

javax.servlet.error.exception

Questo attributo fornisce informazioni sull'eccezione sollevata, che possono essere archiviate e analizzate.

6

javax.servlet.error.servlet_name

Questo attributo fornisce il nome del servlet che può essere memorizzato e analizzato dopo la memorizzazione in un tipo di dati java.lang.String.

Esempio di servlet del gestore degli errori

Questo esempio fornisce una conoscenza di base della gestione delle eccezioni in Servlet, ma è possibile scrivere applicazioni di filtro più sofisticate utilizzando lo stesso concetto:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Extend HttpServlet class
public class ErrorHandler extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
         
      // Analyze the servlet exception       
      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";
      }

      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Error/Exception Information";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n");

      if (throwable == null && statusCode == null) {
         out.println("<h2>Error information is missing</h2>");
         out.println("Please return to the <a href=\"" + 
            response.encodeURL("http://localhost:8080/") + 
            "\">Home Page</a>.");
      } else if (statusCode != null) {
         out.println("The status code : " + statusCode);
      } else {
         out.println("<h2>Error information</h2>");
         out.println("Servlet Name : " + servletName + "</br></br>");
         out.println("Exception Type : " + throwable.getClass( ).getName( ) + "</br></br>");
         out.println("The request URI: " + requestUri + "<br><br>");
         out.println("The exception message: " + throwable.getMessage( ));
      }
      out.println("</body>");
      out.println("</html>");
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

Compilare ErrorHandler.java nel solito modo e metti il ​​tuo file di classe in / webapps / ROOT / WEB-INF / classes.

Aggiungiamo la seguente configurazione in web.xml per gestire le eccezioni:

<servlet>
   <servlet-name>ErrorHandler</servlet-name>
   <servlet-class>ErrorHandler</servlet-class>
</servlet>

<!-- servlet mappings -->
<servlet-mapping>
   <servlet-name>ErrorHandler</servlet-name>
   <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<error-page>
   <error-code>404</error-code>
   <location>/ErrorHandler</location>
</error-page>

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

Ora prova a utilizzare un servlet che solleva un'eccezione o digita un URL sbagliato, questo attiverà la chiamata di Web Container ErrorHandlerservlet e visualizzare un messaggio appropriato come programmato. Ad esempio, se digiti un URL sbagliato, verrà visualizzato il seguente risultato:

The status code : 404

Il codice sopra potrebbe non funzionare con alcuni browser web. Quindi prova con Mozilla e Safari e dovrebbe funzionare.