Struts 2 - Obsługa wyjątków

Strutszapewnia łatwiejszy sposób obsługi nieprzechwyconych wyjątków i przekierowywania użytkowników do dedykowanej strony błędu. Możesz łatwo skonfigurować Struts tak, aby miał różne strony błędów dla różnych wyjątków.

Struts ułatwia obsługę wyjątków dzięki zastosowaniu przechwytywacza „wyjątków”. Przechwytywacz „wyjątków” jest częścią domyślnego stosu, więc nie musisz robić nic więcej, aby go skonfigurować. Jest dostępny od razu po wyjęciu z pudełka i gotowy do użycia.

Zobaczmy prosty przykład Hello World z pewnymi modyfikacjami w pliku HelloWorldAction.java. Tutaj celowo wprowadziliśmy wyjątek NullPointer w naszymHelloWorldAction kod akcji.

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

Zachowajmy zawartość HelloWorld.jsp w następujący sposób -

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

Poniżej znajduje się treść 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>

Twój struts.xml powinno wyglądać jak -

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

Teraz kliknij prawym przyciskiem myszy nazwę projektu i kliknij Export > WAR Fileaby utworzyć plik wojny. Następnie wdróż tę WAR w katalogu webapps serwera Tomcat. Na koniec uruchom serwer Tomcat i spróbuj uzyskać dostęp do adresu URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Spowoduje to wyświetlenie następującego ekranu -

Wpisz wartość „Struts2” i prześlij stronę. Powinieneś zobaczyć następującą stronę -

Jak pokazano w powyższym przykładzie, domyślny przechwytywacz wyjątków świetnie radzi sobie z obsługą wyjątku.

Utwórzmy teraz dedykowaną stronę błędu dla naszego wyjątku. Utwórz plik o nazwieError.jsp z następującą zawartością -

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

Skonfigurujmy teraz Struts, aby używał tej strony błędu w przypadku wyjątku. Zmodyfikujmystruts.xml w następujący sposób -

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

Jak pokazano w powyższym przykładzie, teraz skonfigurowaliśmy Struts do używania dedykowanego pliku Error.jsp dla wyjątku NullPointerException. Jeśli ponownie uruchomisz program teraz, zobaczysz następujące dane wyjściowe -

Oprócz tego framework Struts2 jest wyposażony w przechwytywacz „logowania” do rejestrowania wyjątków. Umożliwiając rejestratorowi rejestrowanie nieprzechwyconych wyjątków, możemy łatwo przejrzeć ślad stosu i ustalić, co poszło nie tak

Globalne mapowania wyjątków

Widzieliśmy, jak możemy obsłużyć wyjątek specyficzny dla akcji. Możemy ustawić wyjątek globalnie, który będzie dotyczył wszystkich działań. Na przykład, aby złapać te same wyjątki NullPointerException, możemy dodać<global-exception-mappings...> tag wewnątrz tagu <package ...>, a jego tag <result ...> należy dodać wewnątrz tagu <action ...> w pliku struts.xml w następujący sposób -

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