Struts 2 - Azioni

Actionssono il cuore del framework Struts2, come lo sono per qualsiasi framework MVC (Model View Controller). Ogni URL è mappato a un'azione specifica, che fornisce la logica di elaborazione necessaria per soddisfare la richiesta dell'utente.

Ma l'azione serve anche per altre due importanti capacità. In primo luogo, l'azione gioca un ruolo importante nel trasferimento dei dati dalla richiesta alla visualizzazione, sia che si tratti di un JSP o di un altro tipo di risultato. In secondo luogo, l'azione deve aiutare il framework a determinare quale risultato dovrebbe fornire la vista che verrà restituita nella risposta alla richiesta.

Crea azione

L'unico requisito per le azioni in Struts2è che deve esserci un metodo noargument che restituisce un oggetto String o Result e deve essere un POJO. Se il metodo senza argomenti non è specificato, il comportamento predefinito è usare il metodo execute ().

Facoltativamente puoi estendere il file ActionSupport class che implementa sei interfacce tra cui Actioninterfaccia. L'interfaccia di azione è la seguente:

public interface Action {
   public static final String SUCCESS = "success";
   public static final String NONE = "none";
   public static final String ERROR = "error";
   public static final String INPUT = "input";
   public static final String LOGIN = "login";
   public String execute() throws Exception;
}

Diamo un'occhiata al metodo di azione nell'esempio Hello World:

package com.tutorialspoint.struts2;

public class HelloWorldAction {
   private String name;

   public String execute() throws Exception {
      return "success";
   }
   
   public String getName() {
      return name;
   }

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

Per illustrare il punto in cui il metodo di azione controlla la visualizzazione, apportiamo la seguente modifica al file execute metodo ed estendere la classe ActionSupport come segue:

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      if ("SECRET".equals(name)) {
         return SUCCESS;
      } else {
         return ERROR;  
      }
   }
   
   public String getName() {
      return name;
   }

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

In questo esempio, abbiamo una logica nel metodo execute per esaminare l'attributo name. Se l'attributo è uguale alla stringa"SECRET", torniamo SUCCESS come risultato altrimenti torniamo ERRORcome risultato. Perché abbiamo esteso ActionSupport, quindi possiamo usare le costanti StringSUCCESSe ERRORE. Ora, modifichiamo il nostro 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">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Crea una vista

Creiamo il file jsp di seguito HelloWorld.jspnella cartella WebContent nel tuo progetto eclipse. A tale scopo, fare clic con il pulsante destro del mouse sulla cartella WebContent in Esplora progetti e selezionareNew >JSP File. Questo file verrà chiamato nel caso in cui il risultato restituito sia SUCCESS che è una costante di stringa "successo" come definito nell'interfaccia di azione -

<%@ 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 file che verrà richiamato dal framework nel caso in cui il risultato dell'azione sia ERROR che è uguale a String costante "errore". Di seguito è riportato il contenuto diAccessDenied.jsp

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

<html>  
   <head>
      <title>Access Denied</title>
   </head>
   
   <body>
      You are not authorized to view this page.
   </body>
</html>

Dobbiamo anche creare index.jspnella cartella WebContent. Questo file servirà come URL dell'azione iniziale su cui l'utente può fare clic per indicare al framework Struts 2 di chiamare il fileexecutemetodo della classe HelloWorldAction ed eseguire il rendering della vista HelloWorld.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>

Ecco fatto, non è richiesta alcuna modifica per il file web.xml, quindi usiamo lo stesso web.xml che avevamo creato in Examplescapitolo. Ora siamo pronti per eseguire il nostroHello World applicazione utilizzando il framework Struts 2.

Esegui l'applicazione

Fare clic con il tasto destro sul nome del progetto e fare clic Export > WARFile per 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 ti darà la seguente schermata:

Inseriamo una parola come "SEGRETO" e dovresti vedere la pagina seguente:

Ora inserisci una parola diversa da "SEGRETO" e dovresti vedere la pagina seguente:

Crea più azioni

Definirai spesso più di un'azione per gestire richieste diverse e fornire URL diversi agli utenti, di conseguenza definirai classi diverse come definito di seguito:

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

class MyAction extends ActionSupport {
   public static String GOOD = SUCCESS;
   public static String BAD = ERROR;
}

public class HelloWorld extends ActionSupport {
   ...
   public String execute() {
      if ("SECRET".equals(name)) return MyAction.GOOD;
      return MyAction.BAD;
   }
   ...
}

public class SomeOtherClass extends ActionSupport {
   ...
   public String execute() {
      return MyAction.GOOD;
   }
   ...
}

Configurerai queste azioni 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">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorld" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
      
      <action name = "something" 
         class = "com.tutorialspoint.struts2.SomeOtherClass" 
         method = "execute">
         <result name = "success">/Something.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Come puoi vedere nell'esempio ipotetico sopra, l'azione risulta SUCCESS e ERROR’s sono duplicati.

Per aggirare questo problema, si suggerisce di creare una classe che contenga i risultati.