Struts 2 - Manejo de excepciones

Strutsproporciona una forma más sencilla de gestionar las excepciones no detectadas y redirigir a los usuarios a una página de error dedicada. Puede configurar fácilmente Struts para que tenga diferentes páginas de error para diferentes excepciones.

Struts facilita el manejo de excepciones mediante el uso del interceptor de "excepciones". El interceptor de "excepción" se incluye como parte de la pila predeterminada, por lo que no tiene que hacer nada más para configurarlo. Está disponible listo para usar y listo para usar.

Veamos un ejemplo sencillo de Hello World con algunas modificaciones en el archivo HelloWorldAction.java. Aquí, introdujimos deliberadamente una excepción NullPointer en nuestroHelloWorldAction código de acción.

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

Conservemos el contenido de HelloWorld.jsp como sigue -

<%@ 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>

A continuación se muestra el contenido de 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>

Tu struts.xml debería verse como -

<?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>

Ahora haga clic derecho en el nombre del proyecto y haga clic en Export > WAR Filepara crear un archivo War. Luego, implemente este WAR en el directorio de aplicaciones web de Tomcat. Finalmente, inicie el servidor Tomcat e intente acceder a la URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Esto producirá la siguiente pantalla:

Ingrese un valor "Struts2" y envíe la página. Debería ver la siguiente página:

Como se muestra en el ejemplo anterior, el interceptor de excepciones predeterminado hace un gran trabajo manejando la excepción.

Creemos ahora una página de error dedicada para nuestra excepción. Crea un archivo llamadoError.jsp con los siguientes contenidos -

<%@ 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>

Configuremos ahora Struts para usar esta página de error en caso de una excepción. Modifiquemos elstruts.xml como sigue -

<?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>

Como se muestra en el ejemplo anterior, ahora hemos configurado Struts para usar el Error.jsp dedicado para la NullPointerException. Si vuelve a ejecutar el programa ahora, verá el siguiente resultado:

Además de esto, el marco Struts2 viene con un interceptor de "registro" para registrar las excepciones. Al permitir que el registrador registre las excepciones no detectadas, podemos ver fácilmente el seguimiento de la pila y averiguar qué salió mal

Asignaciones de excepciones globales

Hemos visto cómo podemos manejar una excepción específica de acción. Podemos establecer una excepción a nivel mundial que se aplicará a todas las acciones. Por ejemplo, para capturar las mismas excepciones NullPointerException, podríamos agregar<global-exception-mappings...> dentro de la etiqueta <paquete ...> y su etiqueta <resultado ...> debe agregarse dentro de la etiqueta <acción ...> en el archivo struts.xml de la siguiente manera:

<?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>