Struts 2 - Tratamento de exceções

Strutsfornece uma maneira mais fácil de lidar com exceções não detectadas e redirecionar os usuários para uma página de erro dedicada. Você pode configurar facilmente o Struts para ter diferentes páginas de erro para diferentes exceções.

O Struts facilita o tratamento de exceções com o uso do interceptor de "exceção". O interceptor de "exceção" é incluído como parte da pilha padrão, então você não precisa fazer nada extra para configurá-lo. Ele está disponível fora da caixa e pronto para você usar.

Vejamos um exemplo simples de Hello World com algumas modificações no arquivo HelloWorldAction.java. Aqui, nós introduzimos deliberadamente uma exceção NullPointer em nossoHelloWorldAction código de ação.

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

Vamos manter o conteúdo de HelloWorld.jsp como 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>

A seguir está o conteúdo 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>

Seu struts.xml deve ser parecido com -

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

Agora clique com o botão direito no nome do projeto e clique Export > WAR Filepara criar um arquivo War. Em seguida, implante esse WAR no diretório webapps do Tomcat. Finalmente, inicie o servidor Tomcat e tente acessar o URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Isso produzirá a seguinte tela -

Insira um valor "Struts2" e envie a página. Você deverá ver a seguinte página -

Conforme mostrado no exemplo acima, o interceptor de exceção padrão faz um ótimo trabalho no tratamento da exceção.

Vamos agora criar uma página de erro dedicada para nossa exceção. Crie um arquivo chamadoError.jsp com os seguintes conteúdos -

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

Vamos agora configurar o Struts para usar esta página de erro no caso de uma exceção. Vamos modificar ostruts.xml como 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>

Conforme mostrado no exemplo acima, agora configuramos o Struts para usar o Error.jsp dedicado para o NullPointerException. Se você executar o programa novamente agora, verá a seguinte saída -

Além disso, o framework Struts2 vem com um interceptor de "registro" para registrar as exceções. Ao permitir que o logger registre as exceções não capturadas, podemos facilmente examinar o rastreamento da pilha e descobrir o que deu errado

Mapeamentos de exceção global

Vimos como podemos lidar com exceções específicas de ações. Podemos definir uma exceção globalmente que se aplicará a todas as ações. Por exemplo, para capturar as mesmas exceções NullPointerException, poderíamos adicionar<global-exception-mappings...> tag dentro da tag <package ...> e sua tag <result ...> deve ser adicionada dentro da tag <action ...> no arquivo struts.xml da seguinte maneira -

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