Struts 2 - Gestione delle eccezioni

Strutsfornisce un modo più semplice per gestire le eccezioni non rilevate e reindirizzare gli utenti a una pagina di errore dedicata. Puoi facilmente configurare Struts in modo che abbia pagine di errore diverse per eccezioni diverse.

Struts semplifica la gestione delle eccezioni mediante l'uso dell'intercettore "eccezioni". L'intercettore "eccezioni" è incluso come parte dello stack predefinito, quindi non devi fare nulla in più per configurarlo. È disponibile out-of-the-box pronto per l'uso.

Vediamo un semplice esempio di Hello World con alcune modifiche nel file HelloWorldAction.java. Qui, abbiamo deliberatamente introdotto un'eccezione NullPointer nel nostro fileHelloWorldAction codice azione.

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{
   private String name;

   public String execute(){
      String x = null;
      x = x.substring(0);
      return SUCCESS;
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Manteniamo il contenuto di HelloWorld.jsp come segue -

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Di seguito è riportato il contenuto di index.jsp -

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Il tuo struts.xml dovrebbe apparire come -

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
     
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Ora fai clic con il pulsante destro del mouse sul nome del progetto e fai clic Export > WAR Fileper creare un file War. Quindi distribuire questo WAR nella directory webapps di Tomcat. Infine, avvia il server Tomcat e prova ad accedere all'URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Questo produrrà la seguente schermata:

Immettere un valore "Struts2" e inviare la pagina. Dovresti vedere la pagina seguente:

Come mostrato nell'esempio sopra, l'intercettatore di eccezioni predefinito fa un ottimo lavoro nel gestire l'eccezione.

Creiamo ora una pagina di errore dedicata per la nostra eccezione. Crea un file chiamatoError.jsp con i seguenti contenuti -

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
	pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title></title>
   </head>
   
   <body>
      This is my custom error page
   </body>
</html>

Configuriamo ora Struts per utilizzare questa pagina di errore in caso di eccezione. Modifichiamo il filestruts.xml come segue -

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
   
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <exception-mapping exception = "java.lang.NullPointerException"
         result = "error" />
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/Error.jsp</result>
      </action>

   </package>
</struts>

Come mostrato nell'esempio sopra, ora abbiamo configurato Struts per utilizzare il Error.jsp dedicato per NullPointerException. Se riesegui il programma ora, ora vedrai il seguente output:

Oltre a questo, il framework Struts2 viene fornito con un intercettore di "registrazione" per registrare le eccezioni. Abilitando il logger a registrare le eccezioni non rilevate, possiamo facilmente guardare la traccia dello stack e capire cosa è andato storto

Mapping delle eccezioni globali

Abbiamo visto come possiamo gestire l'eccezione specifica dell'azione. Possiamo impostare un'eccezione a livello globale che verrà applicata a tutte le azioni. Ad esempio, per catturare le stesse eccezioni NullPointerException, potremmo aggiungere<global-exception-mappings...> tag all'interno del tag <pacchetto ...> e il relativo tag <risultato ...> dovrebbero essere aggiunti all'interno del tag <azione ...> nel file struts.xml come segue:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <global-exception-mappings>
         <exception-mapping exception = "java.lang.NullPointerException"
         result = "error" />
      </global-exception-mappings>

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/Error.jsp</result>
      </action>

   </package>
</struts>